我要实现的目标是,当我从最近关闭应用程序时,我仍然可以通过通知来控制我的应用程序。
一切正常,但是当我的应用程序仍在运行时,当我单击通知中的关闭按钮时,会得到很多NPE。
单击通知中的关闭按钮时执行的代码:
mMediaSessionCompat.setCallback(new MediaSessionCompat.Callback() {
@Override
public void onStop() {
super.onStop();
Main.unbindService(getApplicationContext());
stopSelf();
Log.d(TAG,"stop!");
}
现在,当我关闭我的应用程序,然后通过通知销毁我的服务时,一切正常。
所以我的问题是我如何确定我的应用程序何时仍在运行(用户可见或在后台(最近的应用程序)可见,何时销毁并且仅显示通知?
因此,我可以创建if语句,以仅在应用程序被销毁时调用stopSelf();
,而在我的应用程序仍在运行时不调用它。
答案 0 :(得分:0)
也许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();
}
}
应该工作。