Android определяет, перешло ли приложение в фоновый режим

#android #logout

#Android #Выход

Вопрос:

Я пытаюсь реализовать некоторый код автоматического выхода из системы для моего приложения на Android.

Мне нужно определить, перешли ли все действия, принадлежащие приложению, в фоновый режим, в отличие от работы с onPause() и onResume() для каждого отдельного действия. В iOS есть полезный applicationDidEnterBackground: метод, который я мог бы использовать, но я не могу найти аналогичную функцию в Application классе Android.

Один из подходов, по-видимому, заключается в том, чтобы иметь AtomicInteger счетчик и увеличивать его, как только действие становится видимым, и уменьшать его, когда оно завершено или вызывается onStop (). Итак, если счетчик становится равным нулю, я могу запустить службу, которая работает в фоновом режиме и обрабатывает выход из системы. Так ли это обычно делается?

Ответ №1:

Для этого нет глобального обратного вызова, но для каждого действия используется функция onStop(). Вам не нужно возиться с атомарным значением int. Просто имейте глобальный int с количеством запущенных действий, в каждом действии увеличивайте его в OnStart () и уменьшайте в onStop().

Комментарии:

1. Это отлично работает. Если у вас есть базовый класс для всех ваших действий, легко определить, когда приложение перемещается на передний план (увеличение количества от 0 до 1) и когда оно перемещается на задний план (количество достигло 0).

2. Этот ответ лучше соответствует названию сообщения. Если вы заинтересованы в определении того, переходит ли приложение в фоновый режим, рассмотрите это. У меня это работает хорошо.

3.для увеличения / уменьшения счетчика можно использовать метод if API > 14 registerActivityLifecycleCallbacks

4. Просто и эффективно. Отлично.

Ответ №2:

Вы действительно не хотите выходить из системы пользователя, когда «приложение» работает в фоновом режиме, не больше, чем вы выходите из пользователя веб-приложения, когда пользователь переключается на другую вкладку или на мгновение сворачивает окно своего браузера. Если бы вы сделали что-либо из этих действий в веб-приложении, ваши пользователи сочли бы ваше веб-приложение грандиозным провалом. Аналогично, если пользователь получает телефонный звонок с неправильным номером или срабатывает будильник, они будут весьма раздражены вами, если им придется немедленно возвращаться и входить в систему, когда они использовали ваше приложение всего 5 секунд назад. Здесь под «раздраженным» я подразумеваю рейтинги в одну звезду на рынке и неприятные комментарии.

Автоматический выход веб-приложения основан на бездействии, используя cookie сеанса сервера.

Аналогично, когда я создам защищенное приложение для Android, я буду внедрять механизм, основанный на бездействии, возможно, что-то вроде этого:

Шаг # 1: Создайте Session класс со статическим экземпляром singleton. Session Объект содержит временную метку последнего обращения.

Шаг № 2: В каждом действии onResume() проверьте, существует ли Session синглтон. Если нет, то это совершенно новый процесс, поэтому, если это не действие аутентификации, немедленно выполните startActivity() , чтобы вызвать действие аутентификации.

Шаг # 3: Возвращаясь к каждому действию, onResume() если Session объект существует, вызывайте что-то вроде extend() . В противном случае это вернет a boolean , true указывающее, что сеанс все еще работает нормально (и временная метка обновлена до настоящего времени), false в противном случае. Если оно возвращается false , выполните те же действия, что и если бы Session объект был null .

Шаг # 4: После успешной проверки подлинности одноэлементный Session объект устанавливает текущую временную метку.

Шаг № 5: Метод вашего Session класса extend() — это то, где вы определяете, является ли сеанс слишком старым.

Независимо от того, как пользователь попадает в ваше приложение, если сеанс слишком старый (или это совершенно новый процесс), они вынуждены проходить аутентификацию. Тем не менее, если пользователь ненадолго прерывается — где вы и / или пользователь можете определить «ненадолго» — им не нужно повторно проходить аутентификацию.

Комментарии:

1. Упс, вот что я имел в виду, я хотел автоматически выходить из системы через <X> минут, а не просто выходить из системы каждый раз, когда приложение переходит в фоновый режим. По аналогичному вопросу одним из сделанных предложений было запустить службу в фоновом режиме и заставить ее отправлять широковещательную рассылку на все мои действия, которая будет реализовывать широковещательный приемник, но это гораздо лучший способ сделать это.

2. @Tejaswi Yerukalapudi: Да, подход «сервис-получатель» был бы довольно тяжеловесным.

3. Имеет смысл, что некоторые приложения выходят из системы, когда переходят в фоновый режим, например банковские приложения. Просто мое мнение…

4. @CommonsWare Такие заявления, как «Вы действительно не хотите выходить из системы пользователя, когда «приложение» работает в фоновом режиме», кажутся немного недальновидными и недалекими. Что позволяет вам судить о том, что разработчик хочет сделать в данном приложении?

5. В моем случае мне нужна эта функция, чтобы отправлять текущие уведомления только тогда, когда приложение отправляется в фоновый режим.

Ответ №3:

Я думаю, что ваше предложение, вероятно, лучший способ пойти. К сожалению, я не думаю, что есть вызов API для определения, находится ли ваше приложение в фоновом режиме или нет. Вам просто нужно будет манипулировать методами onPause () и onResume (). Просто имейте в виду, что вам потребуется учитывать переходы между действиями, поэтому, как только ваш AtomicInteger достигнет 0, я бы подождал немного времени и перепроверил, что он по-прежнему равен 0, чтобы убедиться, что это не был просто переход действий.

Ответ №4:

Создайте класс приложения и включите в манифест

 <application
        android:name="com.example.hello.MyApplication"



public class MyApplication extends Application implements
        ActivityLifecycleCallbacks, ComponentCallbacks2 
  

переопределите следующий метод

 @Override
public void onTrimMemory(int level) {
        // this method is called when the app goes in background.
        // you can perform your logout service here
        super.onTrimMemory(level);
    }
  

это действительно для API уровня 14 и выше.

Вы даже можете выполнить выход из системы в зависимости от времени, в течение которого приложение работает в фоновом режиме, что, я бы предположил, является лучшим вариантом. вот что вы можете сделать, чтобы создать значение «тайм-аут сеанса»

  1. сохраните временную метку в SharedPreferences внутри onTrimMemory(int level) метода

  2. при всех ваших действиях onStrat () получает временную метку из SharedPref и сравнивает ее с текущим временем. на основе этого вы можете выполнить выход из системы.

  3. и очистите разделяемый префикс при onCreat из MyApplication