2015-12-15 2 views
1

У меня есть служба, которая прослушивает некоторые события с сервера. Служба имеет флаг START_STICKY, который заставляет его перезапускаться, когда он был убит ОС. Когда услуга получает событие, у меня есть два сценария. Во-первых, если активность не убита, мне нужно отправить результат локальному широковещательному приемнику и обновить интерфейс. Во-вторых, если он был убит ОС, я хочу его воссоздать и отправить данные в комплекте.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

OMG! Спасибо. Ты прав! Даже в android javadocs нет ничего о возвращаемом значении sendBroadcast(). Я не ожидал такого простого решения! –

+0

Для проблемы с документацией существует открытая проблема [AOSP Issue] (https://code.google.com/p/android/issues/detail?id=59626). Я посмотрел исходный код, чтобы узнать, что означает возвращаемое значение sendBroadcast(). –