2015-12-15 33 views
1

我有一个服务正在监听来自服务器的一些事件。 服务具有START_STICKY标志,使其在被操作系统杀死时可以重新启动。 当服务收到一个事件我有两种情况。 首先,如果活动没有中止,我需要将结果发送到本地广播接收器并更新UI。其次,如果它被操作系统杀死了,我想重新创建它并发送数据包。Android:检查活动是否被系统从服务中销毁

但我不知道如何识别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); 
    } 
+0

如果知道它是否可见,这还不够吗?如果是这样,http://stackoverflow.com/a/5446680/3209739是不够的? – cgr

+0

不是。这是不够的。我需要更新我的用户界面,即使它在后台(已停止并暂停) –

+1

然后,您还应该检查它是否在不可见的后退栈中可用。如果它们在堆栈中更新那里。 – cgr

回答

4

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

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

+0

谢谢。你是对的!即使在android javadoc中,也没有关于返回sendBroadcast()的值。我没有想到这样一个简单的解决方案! –

+0

有关文档问题的公开[AOSP问题](https://code.google.com/p/android/issues/detail?id=59626)。我查看了源代码,以了解sendBroadcast()的返回值的含义。 –

相关问题