Android:检查活动是否被系统从服务中破坏

Android:检查活动是否被系统从服务中破坏,android,service,kill,activity-lifecycle,Android,Service,Kill,Activity Lifecycle,我有一个服务正在侦听来自服务器的一些事件。 一个服务有一个START_粘性标志,当它被操作系统杀死时,它会重新启动。 当服务接收到一个事件时,我有两个场景。 首先,若活动并没有终止,我需要将结果发送到本地广播接收器并更新UI。 第二,如果它被操作系统杀死,我想重新创建它并以捆绑方式发送数据 但我不知道如何认识到android扼杀了我的活动。 onDestroy活动事件在这种情况下不会出现 @Override public void onComplete(CurrentOrders

我有一个服务正在侦听来自服务器的一些事件。 一个服务有一个START_粘性标志,当它被操作系统杀死时,它会重新启动。 当服务接收到一个事件时,我有两个场景。 首先,若活动并没有终止,我需要将结果发送到本地广播接收器并更新UI。 第二,如果它被操作系统杀死,我想重新创建它并以捆绑方式发送数据

但我不知道如何认识到android扼杀了我的活动。 onDestroy活动事件在这种情况下不会出现

    @Override
    public void onComplete(CurrentOrdersResponse response) {
        if (response == null) {
            return;
        }
        boolean isActivityDestroyed = mPreferences.getBoolean(MainActivity.IS_MAIN_ACTIVITY_DESTROYED_PREF_KEY, false);
        if (!isActivityDestroyed)
            sendResult(response.getResJSONStr(), CURRENT_ORDERS_ACTION);
        else {
            Intent intent = new Intent(this, MainActivity.class);
            intent.setAction(Intent.ACTION_VIEW);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtras(extras);
            startActivity(intent);
        }
        int resCode = response.getResCode();
        Log.i(LOG_TAG, "Service resCode" + " " + resCode);
    }

听起来您正在使用
LocalBroadcastManager
。那很好。它的方法返回一个布尔值,指示是否找到注册的接收器。您可以使用该结果确定您的接收活动(MainActivity)是否存在并已注册接收广播


当您的服务有事件要发送到MainActivity时,请首先尝试使用
sendBroadcast()
发送事件。如果返回true,则完成您的操作。如果返回false,则该活动未注册,必须使用
startActivity()
创建,并将事件作为额外事件传递,如您发布的代码所示。

如果您知道它是否可见,这还不够吗?如果是这样,还不够吗?不,还不够。我需要更新我的UI,即使它在后台(停止和暂停),然后你也应该检查它是否在其不可见的后堆栈中可用。如果在堆栈中,它们会在那里更新。我已经看到了解决方案。但是有人说它应该只用于调试目的。我不确定确切的位置,但后台堆栈是我们寻找活动/片段的地方,如果它们已经可用,并相应地执行操作。您可以考虑发布另一个问题,询问是否有其他方法来确定活动/片段对象是否可见。通过PackageManager,您可以知道类本身是否存在于device.OMG中!非常感谢。你说得对!即使在android javadocs中,也没有关于sendBroadcast()返回值的任何内容。我没想到会有这么简单的解决办法!对于文档中的问题,存在一个开放的解决方案。我查看了源代码以了解sendBroadcast()的返回值的含义。