Не существует простых методов жизненного цикла, которые бы сообщали вам, когда все приложение переходит в фоновый режим / передний план.
Я сделал это простым способом. Следуйте приведенным ниже инструкциям для определения фона приложения / фазы переднего плана.
С небольшим обходным путем, это возможно. Здесь ActivityLifecycleCallbacks приходит на помощь. Позвольте мне пройти шаг за шагом.
Сначала создайте класс, который расширяет android.app.Application и реализует интерфейс ActivityLifecycleCallbacks . В Application.onCreate () зарегистрируйте обратный вызов.
public class App extends Application implements
Application.ActivityLifecycleCallbacks {
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
}
Зарегистрируйте класс «App» в манифесте, как показано ниже, <application android:name=".App"
.
Там будет по крайней мере одна активность в состоянии запуска, когда приложение находится на переднем плане, и не будет активности в состоянии запуска, когда приложение находится в фоновом режиме.
Объявите 2 переменные, как показано ниже в классе «App».
private int activityReferences = 0;
private boolean isActivityChangingConfigurations = false;
activityReferences
будет вести подсчет количества операций в состоянии начато . isActivityChangingConfigurations
- флаг, указывающий, проходит ли текущее действие изменение конфигурации, например, переключатель ориентации.
Используя следующий код, вы можете определить, выходит ли приложение на передний план.
@Override
public void onActivityStarted(Activity activity) {
if (++activityReferences == 1 && !isActivityChangingConfigurations) {
// App enters foreground
}
}
Это как определить, работает ли приложение в фоновом режиме.
@Override
public void onActivityStopped(Activity activity) {
isActivityChangingConfigurations = activity.isChangingConfigurations();
if (--activityReferences == 0 && !isActivityChangingConfigurations) {
// App enters background
}
}
Как это работает:
Это небольшая хитрость, связанная с тем, как методы жизненного цикла вызываются последовательно. Позвольте мне пройти сценарий.
Предположим, что пользователь запускает приложение и запускает активную программу запуска A. Звонки жизненного цикла будут,
A.onCreate ()
A.onStart () (++ activityReferences == 1) (приложение выходит на передний план)
A.onResume ()
Теперь упражнение A начинает упражнение B.
A.onPause ()
B.onCreate ()
B.onStart () (++ ActivityReferences == 2)
B.onResume ()
A.onStop () (--activityReferences == 1)
Затем пользователь возвращается из действия B,
B.onPause ()
A.onStart () (++ ActivityReferences == 2)
A.onResume ()
B.onStop () (--activityReferences == 1)
B.onDestroy ()
Затем пользователь нажимает кнопку «Домой»,
A.onPause ()
A.onStop () (--activityReferences == 0) (приложение входит в фоновый режим)
В случае, если пользователь нажимает кнопку «Домой» в «Деятельности B» вместо кнопки «Назад», он все равно будет таким же, а ActivityReferences будет 0
. Следовательно, мы можем определить, как приложение входит в фоновый режим.
Итак, какова роль isActivityChangingConfigurations
? В приведенном выше сценарии предположим, что действие B меняет ориентацию. Последовательность обратного вызова будет
B.onPause ()
B.onStop () (--activityReferences == 0) (приложение входит в фон ??)
B.onDestroy ()
B.onCreate ()
B.onStart () (++ activityReferences == 1) (приложение выходит на передний план ??)
B.onResume ()
Именно поэтому у нас есть дополнительная проверка isActivityChangingConfigurations
, чтобы избежать сценария, когда действие проходит через изменения конфигурации.