Android обнаруживает, если приложение вошло в фон - PullRequest
4 голосов
/ 30 апреля 2011

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

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

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

Ответы [ 4 ]

18 голосов
/ 30 апреля 2011

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

14 голосов
/ 30 апреля 2011

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

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

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

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

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

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

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

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

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

1 голос
/ 30 апреля 2011

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

0 голосов
/ 05 января 2015

Создайте класс Application и включите в манифест

<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 of MyApplication

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...