Użytkownik uruchamia moją aplikację i loguje się.
Ustawia limit czasu sesji na 5 minut.
Wykonuje pewne operacje w aplikacji. (wszystko na pierwszym planie)
Teraz użytkownik przełącza Myapp w tło i uruchamia inną aplikację.
----> Odliczanie czasu uruchamia się i wylogowuje użytkownika po 5 minutach
LUB użytkownik wyłącza ekran.
----> Odliczanie czasu uruchamia się i wylogowuje użytkownika po 5 minutach
Chcę tego samego zachowania, nawet gdy aplikacja jest na pierwszym planie, ale użytkownik nie wchodzi w interakcję z aplikacją przez długi czas, powiedzmy 6-7 minut. Załóżmy, że ekran jest włączony przez cały czas. Chcę wykryć rodzaj braku aktywności użytkownika (brak interakcji z aplikacją, mimo że aplikacja jest na pierwszym planie) i uruchomić odliczanie czasu.
Odpowiedzi:
Na podstawie odpowiedzi Fredrika Walleniusa wymyśliłem rozwiązanie, które uważam za całkiem proste. Jest to podstawowa klasa działań, która musi zostać rozszerzona o wszystkie działania.
źródło
Handler
iRunnable
dla każdegoActivity
utworzonego. Jeśli zmienimy te dwa elementy nastatic
, zostanie to uniknięte. Również może mi pan powiedzieć, dlaczego pan nazywastopDisconnectTimer()
sięonStop()
`?static
modyfikatorem). Jeśli chodzi o toonStop()
, z tego co pamiętam, wzywamonBackPressed()
w celu powrotu do ekranu logowania w wywołaniu zwrotnym rozłączenia, które z kolei wywołujeonStop()
metodę. Gdy użytkownik powraca do ekranu logowania ręcznie, wciskając z powrotem, potrzeby czasowe być zatrzymany, a tym samymstopDisconnectTimer()
wonStop()
. Myślę, że ta część zależy od Twoich potrzeb i realizacji.onBackPressed()
wystarczy wezwanie was . Jeśli masz więcej niż jedną aktywność w swoim stosie, musisz po prostu stworzyć intencję w tym zakresie. Możesz spojrzeć na następującą odpowiedź, aby wyczyścić zadanie działania (i zapobiec ponownemu łączeniu się użytkowników z tyłu): stackoverflow.com/questions/7075349/ ...Nie znam sposobu śledzenia braku aktywności, ale jest sposób na śledzenie aktywności użytkownika. Możesz przechwycić wywołanie zwrotne
onUserInteraction()
w działaniach, które jest wywoływane za każdym razem, gdy użytkownik wykonuje jakąkolwiek interakcję z aplikacją. Proponuję zrobić coś takiego:Jeśli Twoja aplikacja zawiera kilka działań, dlaczego nie umieścić tej metody w abstrakcyjnej superklasie (rozszerzającej
Activity
), a następnie wszystkie działania rozszerzające ją.źródło
Myślę, że powinieneś przejść z tym kodem, to jest na 5 minut bezczynności sesji: ->
źródło
isInForeGrnd ===> logika nie jest tutaj pokazana, ponieważ jest poza zakresem pytania
Możesz obudzić zamek do procesora, używając poniższego kodu urządzenia:
źródło
źródło
Nie ma pojęcia „bezczynności użytkownika” na poziomie systemu operacyjnego poza rozgłoszeniami
ACTION_SCREEN_OFF
iACTION_USER_PRESENT
. Będziesz musiał jakoś zdefiniować „brak aktywności” we własnej aplikacji.źródło
Nawet Ty możesz zarządzać swoimi wymaganiami dzięki rozwiązaniom @gfrigon lub @AKh .
Ale tutaj jest bezpłatne rozwiązanie Timer i Handlers do tego. Mam już dobrze zarządzane rozwiązanie Timer do tego. Ale udało mi się wdrożyć bezpłatne rozwiązanie Timer and Handler.
Najpierw powiem ci, czym musisz zarządzać, jeśli używasz timera lub handlerów.
W końcu wdrożyłem rozwiązanie, którym jest
ACTION_SCREEN_ON
/ACTION_SCREEN_OFF
Odbiornik transmisji.Najłatwiejsze niezawodne rozwiązanie
Nie będziemy obserwować braku aktywności użytkownika na podstawie liczników czasu, zamiast sprawdzać czas ostatniej aktywności na aktywności użytkownika. Kiedy więc następnym razem aplikacja interakcji użytkownika, sprawdzam czas ostatniej interakcji.
Oto,
BaseActivity.class
co będziesz rozszerzać z każdej klasy aktywności zamiastLoginActivity
. Czas wylogowania określisz w poluTIMEOUT_IN_MILLI
w tej klasie.źródło
W mojej klasie bazowej aktywności utworzyłem klasę chronioną:
Więc w metodzie onResume - możesz określić akcję w swoim wywołaniu zwrotnym, co chcesz z nią zrobić ...
źródło
Podczas wyszukiwania znalazłem wiele odpowiedzi, ale to najlepsza odpowiedź, jaką uzyskałem. Ale ograniczenie tego kodu polega na tym, że działa on tylko dla aktywności, a nie dla całej aplikacji. Potraktuj to jako punkt odniesienia.
np. użyłeś 8000, zadanie zostanie wykonane po 8 sekundach braku aktywności użytkownika.
źródło
Brak aktywności użytkownika można wykryć za pomocą
onUserInteraction()
metody zastępowania w systemie AndroidOto przykładowy kod, wyloguj się (HomeActivity -> LoginActivity) po 3 minutach, gdy użytkownik jest nieaktywny
źródło
Obsługa limitu czasu interakcji użytkownika w KOTLIN:
źródło
Oto kompletne rozwiązanie, które obsługuje brak aktywności użytkownika po kilku minutach (np. 3 minutach). Rozwiązuje to typowe problemy, takie jak przeskakiwanie aktywności na pierwszy plan, gdy aplikacja jest w tle po przekroczeniu limitu czasu.
Po pierwsze, tworzymy BaseActivity, które może rozszerzać wszystkie inne Activity.
To jest kod BaseActivity.
Następnie tworzymy interfejs dla naszego „Odbiornika wylogowania”
Na koniec tworzymy klasę Java, która rozszerza „Aplikację”
Uwaga: nie zapomnij dodać klasy „TimeOutApp” do tagu aplikacji w pliku manifestu
źródło
Myślę, że musi to być połączenie timera z czasem ostatniej aktywności.
Więc tak:
W onCreate (pakiet zapisanyInstanceState) uruchom licznik, powiedzmy 5 minut
W onUserInteraction () po prostu zapisz aktualny czas
Jak dotąd całkiem proste.
Teraz, gdy wyskakuje timer, wykonaj następujące czynności:
źródło
Miałem podobną sytuację do pytania SO, gdzie musiałem śledzić brak aktywności użytkownika przez 1 minutę, a następnie przekierować użytkownika do rozpoczęcia działania, musiałem również wyczyścić stos aktywności.
Na podstawie odpowiedzi @gfrigon wymyślam to rozwiązanie.
ActionBar.java
Zasoby uzupełniające
Android: Wyczyść stos aktywności
Ta klasa obsługi powinna być statyczna, w przeciwnym razie mogą wystąpić wycieki
źródło
Najlepiej jest załatwić to w całej aplikacji (zakładając, że masz wiele działań), rejestrując się
AppLifecycleCallbacks
w plikach Application. Możesz użyćregisterActivityLifecycleCallbacks()
w klasie Application z następującymi wywołaniami zwrotnymi (polecam utworzenie klasy AppLifecycleCallbacks, która rozszerza ActivityLifecycleCallbacks):źródło
Rozszerz swoją aktywność dzięki
aby dostać się do MainActivity, gdy użytkownik jest nieaktywny po 3000 milisekundach YourActivity
Użyłem poprzedniej odpowiedzi i przekonwertowałem ją na kotlin.
źródło