Возможно, метод Application.registerActivityLifecycleCallbacks()
может быть вам полезен.Вы можете поместить что-то вроде этого в метод onCreate()
вашего приложения:
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--;
}
});
и использовать его для отслеживания того, выполняется ли какое-либо из ваших действий.
EDIT : Хорошо, если вы хотите избежать ситуации, когда законченное действие продолжает зависать в течение некоторого времени перед вызовом метода onDestroyed()
, вы можете использовать более продвинутый подход, где вы проверяете, заканчивается ли действие в onActivityPaused
и onActivityStopped
.Итак, вы создаете класс, подобный этому:
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();
}
}
, а затем в своем классе приложения вы создаете экземпляр и регистрируете его как обратный вызов жизненного цикла действия:
public class MyApplication extends Application {
private ActivityWatcher activityWatcher = new ActivityWatcher();
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(activityWatcher);
}
public boolean isAppAlive() {
return activityWatcher.isAnyActivityRunning();
}
}
Должно работать.