Пользователь запускает мое приложение и входит в систему.
Выбирает тайм-аут сеанса равным 5 минутам.
Выполняет некоторые операции с приложением. (все на переднем плане)
Теперь пользователь переводит Myapp в фоновый режим и запускает другое приложение.
----> Таймер обратного отсчета запускается и выходит из системы через 5 минут
ИЛИ пользователь выключает экран.
----> Таймер обратного отсчета запускается и выходит из системы через 5 минут
Мне нужно такое же поведение, даже когда приложение находится на переднем плане, но пользователь не взаимодействует с приложением в течение длительного времени, скажем, 6-7 минут. Предположим, что экран включен все время. Я хочу определить тип бездействия пользователя (нет взаимодействия с приложением, даже если оно находится на переднем плане) и запустить мой таймер обратного отсчета.
Ответы:
Я придумал решение, которое считаю довольно простым на основе ответа Фредрика Валлениуса. Это базовый класс деятельности, который необходимо расширить на все виды деятельности.
источник
Handler
иRunnable
для каждогоActivity
созданного. Если мы конвертируем эти два члена вstatic
, этого можно будет избежать. Кроме того , могли бы вы сказать мне , почему вы назвалиstopDisconnectTimer()
вonStop()
`?static
модификатором). Что касается тогоonStop()
, что я помню, я вызываюonBackPressed()
, чтобы вернуться к экрану входа в систему в обратном вызове отключения, который, в свою очередь, вызываетonStop()
метод. Когда пользователь возвращается к экрану входа в систему вручную, нажав назад, таймер также должен быть остановлен, поэтому файлstopDisconnectTimer()
inonStop()
. Я думаю, эта часть зависит от ваших потребностей и реализации.onBackPressed()
достаточно было вызвать вас. Если у вас в стеке несколько действий, вам просто нужно создать намерение на этот счет. Вы можете посмотреть следующий ответ, чтобы очистить задачу Activity (и предотвратить повторное подключение пользователей на спине): stackoverflow.com/questions/7075349/…Я не знаю, как отслеживать бездействие, но есть способ отслеживать активность пользователей. Вы можете поймать обратный вызов, вызываемый
onUserInteraction()
в ваших действиях, который вызывается каждый раз, когда пользователь взаимодействует с приложением. Я предлагаю сделать что-то вроде этого:Если ваше приложение содержит несколько действий, почему бы не поместить этот метод в абстрактный суперкласс (расширяющийся
Activity
), а затем все ваши действия расширять его.источник
Я думаю, вам следует использовать этот код, это для 5-минутного тайм-аута сеанса ожидания: ->
источник
isInForeGrnd ===> логика здесь не показана, так как она выходит за рамки вопроса
Вы можете разбудить блокировку процессора, используя код устройства ниже:
источник
источник
На уровне ОС, кроме широковещательных сообщений
ACTION_SCREEN_OFF
и, не существует концепции «бездействия пользователя»ACTION_USER_PRESENT
. Вам придется как-то определить «бездействие» в вашем собственном приложении.источник
Даже вы можете управлять своими требованиями с помощью решений @gfrigon или @AKh .
Но вот бесплатное решение Timer and Handlers для этого. У меня уже есть хорошо управляемое решение с таймером для этого. Но я успешно реализовал бесплатное решение для таймера и обработчика.
Сначала я расскажу вам, что вам нужно сделать, если вы используете таймер или обработчики.
Наконец, я реализовал решение, которое
ACTION_SCREEN_ON
/ACTION_SCREEN_OFF
радиоприемник.Самое простое и надежное решение
Мы не будем отслеживать бездействие пользователя по таймерам, а не будем проверять время последней активности на активность пользователя. Поэтому, когда пользователь взаимодействует с приложением в следующий раз, я проверяю время последнего взаимодействия.
Вот
BaseActivity.class
что вы будете расширять из каждого вашего класса активности вместоLoginActivity
. Вы определите время выхода из системы в полеTIMEOUT_IN_MILLI
этого класса.источник
В моем базовом классе деятельности я создал защищенный класс:
Так что в методе onResume вы можете указать действие в своем обратном вызове, что вы хотите с ним делать ...
источник
Во время поиска я нашел много ответов, но это лучший ответ, который я получил. Но ограничение этого кода в том, что он работает только для активности, а не для всего приложения. Возьмите это как ссылку.
например, если вы использовали 8000, задача будет выполнена через 8 секунд бездействия пользователя.
источник
Бездействие пользователя можно обнаружить с помощью
onUserInteraction()
метода переопределения в androidВот пример кода, выход (HomeActivity -> LoginActivity) через 3 минуты, когда пользователь неактивен
источник
Обработка пользователя по таймауту взаимодействия в KOTLIN:
источник
Вот полное решение, которое обрабатывает бездействие пользователя через несколько минут (например, 3 минуты). Это решает общие проблемы, такие как переход активности на передний план, когда приложение находится в фоновом режиме по истечении времени ожидания.
Во-первых, мы создаем BaseActivity, которую могут расширять все остальные Activity.
Это код BaseActivity.
Затем мы создаем интерфейс для нашего "Logout Listener".
Наконец, мы создаем класс Java, который расширяет «Приложение»
Примечание. Не забудьте добавить класс TimeOutApp к тегу приложения в файле манифеста.
источник
Я думаю, что это нужно, комбинируя таймер с временем последней активности.
Ну вот так:
В onCreate (Bundle savedInstanceState) запустите таймер, скажем, 5 минут
В onUserInteraction () просто сохраните текущее время
Пока все довольно просто.
Теперь, когда таймер всплывает, сделайте следующее:
источник
У меня была аналогичная ситуация с вопросом SO, где мне нужно было отслеживать бездействие пользователя в течение 1 минуты, а затем перенаправлять пользователя для запуска Activity, мне также нужно было очистить стек активности.
Основываясь на ответе @gfrigon, я придумал это решение.
ActionBar.java
Дополнительные ресурсы
Android: очистить стек активности
Этот класс Handler должен быть статическим, иначе могут возникнуть утечки.
источник
Лучше всего справиться с этим во всем приложении (при условии, что у вас несколько действий), зарегистрировавшись
AppLifecycleCallbacks
в приложении calss. Вы можете использоватьregisterActivityLifecycleCallbacks()
в классе Application со следующими обратными вызовами (я рекомендую создать класс AppLifecycleCallbacks, который расширяет ActivityLifecycleCallbacks):источник
Расширьте свою деятельность с помощью
чтобы перейти к MainActivity, когда пользователь неактивен после 3000 миллисекунд на YourActivity
Я использовал предыдущий ответ и преобразовал его в котлин.
источник