[英]How to know if my activity is destroyed in service?
我想要实现的是,当我从最近关闭我的应用程序时,我仍然可以通过通知来控制我的应用程序。
一切正常,但是当我的应用程序仍在运行时,当我单击通知中的关闭按钮时,会得到很多NPE。
单击通知中的关闭按钮时执行的代码:
mMediaSessionCompat.setCallback(new MediaSessionCompat.Callback() {
@Override
public void onStop() {
super.onStop();
Main.unbindService(getApplicationContext());
stopSelf();
Log.d(TAG,"stop!");
}
现在,当我关闭我的应用程序,然后通过通知销毁我的服务时,一切运行正常。
所以我的问题是我如何确定我的应用程序何时仍在运行(对于用户或后台可见(最近的应用程序)以及何时被销毁且仅存在通知?
因此,我可以创建if语句仅调用stopSelf();
当应用程序被销毁时,并且在我的应用程序仍在运行时不要调用它。
也许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--;
}
});
并使用它来跟踪您的任何活动是否仍在运行。
编辑 :好的,如果要避免在调用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();
}
}
应该管用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.