Perhaps the Application.registerActivityLifecycleCallbacks()
method might be of use to you. You could put something like this in your application's onCreate()
method:
registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
int activityCount = 0;
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
activityCount++;
}
@Override
public void onActivityStarted(Activity activity) {}
@Override
public void onActivityResumed(Activity activity) {}
@Override
public void onActivityPaused(Activity activity) {}
@Override
public void onActivityStopped(Activity activity) {}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
@Override
public void onActivityDestroyed(Activity activity) {
activityCount--;
}
});
and use it to keep track of whether any of your activities are still running.
EDIT: Ok, if you want to avoid the situation where a finished activity keeps hanging for some time before the onDestroyed()
method is called, you can use a bit more advanced approach, where you check whether the activity is finishing in the onActivityPaused
and onActivityStopped
. So you make a class like this:
private class ActivityWatcher implements Application.ActivityLifecycleCallbacks {
//a set of currently running activities
private Set<Activity> activities = new HashSet<>();
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
activities.add(activity);
}
@Override
public void onActivityStarted(Activity activity) {}
@Override
public void onActivityResumed(Activity activity) {}
@Override
public void onActivityPaused(Activity activity) {
if (activity.isFinishing()) {
activities.remove(activity);
}
}
@Override
public void onActivityStopped(Activity activity) {
if (activity.isFinishing()) {
activities.remove(activity);
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
@Override
public void onActivityDestroyed(Activity activity) {
activities.remove(activity);
}
public boolean isAnyActivityRunning() {
return !activities.isEmpty();
}
}
and then in your application class you create an instance and register it as activity lifecycle callback:
public class MyApplication extends Application {
private ActivityWatcher activityWatcher = new ActivityWatcher();
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(activityWatcher);
}
public boolean isAppAlive() {
return activityWatcher.isAnyActivityRunning();
}
}
Should work.