Предыдущие подходы, упомянутые здесь, не являются оптимальными.Подход, основанный на задачах, требует разрешения, которое может быть нежелательным, а «булевский» подход склонен к одновременным ошибкам модификации.
Подход, который я использую и который (я считаю) работает довольно хорошо в большинстве случаев:
Наличие класса "MainApplication" для отслеживания количества операций в AtomicInteger :
import android.app.Application;
import java.util.concurrent.atomic.AtomicInteger;
public class MainApplication extends Application {
static class ActivityCounter {
private static AtomicInteger ACTIVITY_COUNT = new AtomicInteger(0);
public static boolean isAppActive() {
return ACTIVITY_COUNT.get() > 0;
}
public static void activityStarted() {
ACTIVITY_COUNT.incrementAndGet();
}
public static void activityStopped() {
ACTIVITY_COUNT.decrementAndGet();
}
}
}
И создание базового класса действий, который будут расширяться другими действиями:
import android.app.Activity;
import android.support.annotation.CallSuper;
public class TestActivity extends Activity {
@Override
@CallSuper
protected void onStart() {
MainApplication.ActivityCounter.activityStarted();
super.onStart();
}
@Override
@CallSuper
protected void onStop() {
MainApplication.ActivityCounter.activityStopped();
super.onStop();
}
}