繁体   English   中英

如何知道我的活动是否在使用中被破坏?

[英]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()方法之前完成的活动保持挂起一段时间的情况,可以使用更高级的方法,在该方法中检查活动是否在onActivityPausedonActivityStopped 因此,您创建了这样的课程:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM