#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 и выше.
Вы даже можете выполнить выход из системы в зависимости от времени, в течение которого приложение работает в фоновом режиме, что, я бы предположил, является лучшим вариантом. вот что вы можете сделать, чтобы создать значение «тайм-аут сеанса»
-
сохраните временную метку в
SharedPreferences
внутриonTrimMemory(int level)
метода -
при всех ваших действиях onStrat () получает временную метку из SharedPref и сравнивает ее с текущим временем. на основе этого вы можете выполнить выход из системы.
-
и очистите разделяемый префикс при onCreat из MyApplication