Der Benutzer startet meine App und meldet sich an. Das
Sitzungszeitlimit beträgt 5 Minuten.
Führt einige Operationen in der App aus. (alles im Vordergrund)
Jetzt bringt der Benutzer Myapp in den Hintergrund und startet eine andere App.
----> Der Countdown-Timer startet und meldet den Benutzer nach 5 Minuten ab
ODER der Benutzer schaltet den Bildschirm aus.
----> Der Countdown-Timer startet und meldet den Benutzer nach 5 Minuten ab
Ich möchte das gleiche Verhalten, auch wenn die App im Vordergrund steht, der Benutzer jedoch längere Zeit nicht mit der App interagiert, z. B. 6-7 Minuten. Angenommen, der Bildschirm ist ständig eingeschaltet. Ich möchte eine Art von Inaktivität des Benutzers erkennen (keine Interaktion mit der App, obwohl die App im Vordergrund steht) und meinen Countdown-Timer starten.
Antworten:
Ich habe eine Lösung gefunden, die ich aufgrund der Antwort von Fredrik Wallenius recht einfach finde. Dies ist eine Basisaktivitätsklasse, die um alle Aktivitäten erweitert werden muss.
quelle
Handler
undRunnable
für jedeActivity
erstellte erstellt. Wenn wir diese beiden Mitglieder in konvertierenstatic
, wird dies vermieden. Auch könnten Sie mir sagen , warum Sie angerufen habenstopDisconnectTimer()
inonStop()
`?static
Modifikator nicht erkannt). SoweitonStop()
ich mich erinnere, rufe ichonBackPressed()
auf, um zu einem Anmeldebildschirm im Trennungsrückruf zurückzukehren, der wiederum dieonStop()
Methode aufruft . Wenn der Benutzer manuell zum Anmeldebildschirm zurückkehrt, muss durch Zurückdrücken auch der Timer gestoppt werden, also derstopDisconnectTimer()
EingangonStop()
. Ich denke, dieser Teil hängt von Ihren Anforderungen und Ihrer Implementierung ab.onBackPressed()
Vas ausreichend anrufen . Wenn Sie mehr als eine Aktivität in Ihrem Stapel haben, müssen Sie nur eine Absicht für diese Angelegenheit erstellen. Sie können sich die folgende Antwort ansehen, um die Aktivitätsaufgabe zu löschen (und zu verhindern, dass Benutzer auf einer Rückseite erneut eine Verbindung herstellen): stackoverflow.com/questions/7075349/…Ich kenne keine Möglichkeit, Inaktivität zu verfolgen, aber es gibt eine Möglichkeit, Benutzeraktivitäten zu verfolgen. Sie können einen Rückruf abfangen, der
onUserInteraction()
in Ihren Aktivitäten aufgerufen wird und jedes Mal aufgerufen wird, wenn der Benutzer eine Interaktion mit der Anwendung ausführt. Ich würde vorschlagen, so etwas zu tun:Wenn Ihre App mehrere Aktivitäten enthält, fügen Sie diese Methode in eine abstrakte Superklasse (Erweiterung
Activity
) ein und lassen Sie sie dann von allen Aktivitäten erweitern.quelle
Ich denke, Sie sollten mit diesem Code gehen, dies ist für 5 Minuten Leerlaufsitzung Timeout: ->
quelle
isInForeGrnd ===> Logik wird hier nicht angezeigt, da sie nicht in Frage kommt
Sie können die Sperre für die CPU mithilfe des folgenden Gerätecodes aktivieren.
quelle
quelle
Es gibt kein Konzept für "Benutzerinaktivität" auf Betriebssystemebene, abgesehen von
ACTION_SCREEN_OFF
undACTION_USER_PRESENT
Broadcasts. Sie müssen "Inaktivität" irgendwie in Ihrer eigenen Anwendung definieren.quelle
Sogar Sie können Ihre Anforderungen mit @ gfrigon- oder @ AKK- Lösungen verwalten.
Aber hier ist Timer und Handler kostenlose Lösung dafür. Ich habe bereits eine gut verwaltete Timer-Lösung dafür. Aber ich habe erfolgreich Timer und Handler freie Lösung implementiert.
Zuerst sage ich Ihnen, was Sie verwalten müssen, wenn Sie Timer oder Handler verwenden.
Schließlich habe ich eine Lösung implementiert, die ist
ACTION_SCREEN_ON
/ACTION_SCREEN_OFF
Rundfunkempfänger.Einfachste zuverlässige Lösung
Wir werden die Inaktivität des Benutzers nicht durch Timer beobachten, sondern die letzte Aktivitätszeit auf Benutzeraktivität überprüfen. Wenn der Benutzer das nächste Mal mit der App interagiert, überprüfe ich die letzte Interaktionszeit.
Hier ist,
BaseActivity.class
was Sie von jeder Ihrer Aktivitätsklassen anstelle von erweiternLoginActivity
. Sie definieren Ihre Abmeldezeit im FeldTIMEOUT_IN_MILLI
dieser Klasse.quelle
In meiner Aktivitätsbasisklasse habe ich eine geschützte Klasse erstellt:
In der onResume- Methode können Sie also in Ihrem Rückruf eine Aktion angeben, was Sie damit tun möchten ...
quelle
Während meiner Suche habe ich viele Antworten gefunden, aber dies ist die beste Antwort, die ich bekommen habe. Die Einschränkung dieses Codes besteht jedoch darin, dass er nur für Aktivitäten und nicht für die gesamte Anwendung funktioniert. Nehmen Sie dies als Referenz.
Wenn Sie beispielsweise 8000 verwendet haben, wird die Aufgabe nach 8 Sekunden Inaktivität des Benutzers ausgeführt.
quelle
Benutzerinaktivität kann mithilfe der
onUserInteraction()
Überschreibungsmethode in Android erkennenHier ist der Beispielcode: Abmelden (HomeActivity -> LoginActivity) nach 3 Minuten, wenn der Benutzer inaktiv ist
quelle
Umgang mit Benutzern im Interaktionszeitlimit in KOTLIN:
quelle
Hier ist eine Komplettlösung, die die Inaktivität des Benutzers nach wenigen Minuten (z. B. 3 Minuten) behandelt. Dies löst die häufigsten Probleme wie das Springen von Aktivitäten in den Vordergrund, wenn sich die App nach einer Zeitüberschreitung im Hintergrund befindet.
Zunächst erstellen wir eine BaseActivity, die alle anderen Aktivitäten erweitern können.
Dies ist der BaseActivity-Code.
Als nächstes erstellen wir eine Schnittstelle für unseren "Logout Listener"
Schließlich erstellen wir eine Java-Klasse, die "Anwendung" erweitert.
Hinweis: Vergessen Sie nicht, die Klasse "TimeOutApp" zu Ihrem Anwendungs-Tag in Ihrer Manifest-Datei hinzuzufügen
quelle
Ich denke, es muss sein, indem der Timer mit der letzten Aktivitätszeit kombiniert wird.
Also so:
Starten Sie in onCreate (Bundle savedInstanceState) einen Timer, z. B. 5 Minuten
Speichern Sie in onUserInteraction () nur die aktuelle Uhrzeit
Bisher ziemlich einfach.
Nun, wenn der Timer Pop so aussieht:
quelle
Ich hatte eine ähnliche Situation wie bei der SO-Frage, bei der ich die Inaktivität des Benutzers 1 Minute lang verfolgen und dann den Benutzer umleiten musste, um die Aktivität zu starten. Außerdem musste ich den Aktivitätsstapel löschen.
Basierend auf der Antwort von @gfrigon habe ich diese Lösung gefunden.
ActionBar.java
Ergänzende Ressourcen
Android: Aktivitätsstapel löschen
Diese Handler-Klasse sollte statisch sein, da sonst Lecks auftreten können
quelle
Am besten erledigen Sie dies in Ihrer gesamten App (vorausgesetzt, Sie haben mehrere Aktivitäten), indem Sie sich
AppLifecycleCallbacks
im Anwendungs-Calss registrieren. Sie könnenregisterActivityLifecycleCallbacks()
in der Application-Klasse die folgenden Rückrufe verwenden (ich empfehle, eine AppLifecycleCallbacks-Klasse zu erstellen, die die ActivityLifecycleCallbacks erweitert):quelle
Erweitern Sie Ihre Aktivität mit
um zu MainActivity zu gelangen, wenn der Benutzer nach 3000 Millisekunden in YourActivity inaktiv ist
Ich habe eine vorherige Antwort verwendet und sie in Kotlin umgewandelt.
quelle