【问题标题】:How to know if my activity is destroyed in service?如何知道我的活动是否在服务中被破坏?
【发布时间】:2019-06-11 20:52:38
【问题描述】:

我想要实现的是,当我从最近关闭我的应用程序时,我仍然可以通过我的通知来控制我的应用程序。

一切正常,但是当我的应用程序仍在运行时单击通知中的关闭按钮时,我得到了很多 NPE。

点击通知中的关闭按钮时执行的代码:

mMediaSessionCompat.setCallback(new MediaSessionCompat.Callback() {
        @Override
        public void onStop() {
            super.onStop();
            Main.unbindService(getApplicationContext());
            stopSelf();
            Log.d(TAG,"stop!");
}

现在,当我关闭我的应用程序,然后通过通知销毁我的 服务 时,一切正常。

所以我的问题是我如何确定我的应用程序何时仍在运行(对用户可见或在后台(最近的应用程序)可见,以及何时被销毁且仅存在通知?

然后我可以创建 if 语句,仅在应用程序被销毁时调用 stopSelf();,而在我的应用程序仍在运行时不调用它。

【问题讨论】:

    标签: java android service


    【解决方案1】:

    也许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();
        }
    }
    

    应该可以。

    【讨论】:

    • OnDestroy 并不总是被调用,因此这不是检查我的活动是否仍在运行的安全方法。
    • 如果您的活动没有被破坏,那么它仍在运行,不是吗?无论如何,如果您担心完成的活动可能需要很长时间才能真正销毁,您可以在onActivityPaused 中检查活动是否正在完成(调用activity.isFinishing())并像活动一样处理它被摧毁。当然,在这种情况下,您不能使用简单的计数器,因为您可以针对单个活动将其递减两次。相反,您需要跟踪 哪个 活动正在完成和/或被销毁。
    • 但似乎可能存在 onDestroy 没有被调用的情况。 stackoverflow.com/a/19608985
    • 如果发生这种情况,我的应用程序会崩溃,这会给用户带来糟糕的体验。
    • 是的,如果操作系统杀死你的整个进程,onDestroy 就不会被调用。但如果发生这种情况,您的服务也会被调用,所以整个问题都没有实际意义,不是吗?
    猜你喜欢
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多