Android: Насколько привязан Сервис, может быть замечен по убитому клиенту? - PullRequest
2 голосов
/ 29 декабря 2011

Мне привязана активность и услуга.

Если служба уничтожена системой, об этом будет замечено действие из-за ServiceConnection.onServiceDisconnected (ComponentName) .

Но когда процесс Activity убивается системой, происходит ли обратный вызов Service? Как Сервис может узнать, что клиент был убит? (Когда весь процесс завершается, к сожалению, нет вызова метода onDestroy())

Единственное, что я вижу сейчас, это следующее:

У меня есть список обратных вызовов в моем Service:

RemoteCallbackList<IModConnClient> mCallbacks

Когда я начинаю трансляцию, позвонив по номеру mCallbacks.beginBroadcast();, мне возвращается количество клиентов. Итак, я могу вспомнить предыдущее количество клиентов и проверить, уменьшилось ли оно. Но, похоже, это не очень хорошее решение. Я бы хотел получить ответный звонок, но, к сожалению, не могу его найти.

Может кто-нибудь дать предложение?

Ответы [ 2 ]

1 голос
/ 18 марта 2014

Существует и простое решение.Это onTaskRemoved метод обслуживания.Это даст вам знать, когда деятельность была убита.На док.он говорит ..........

public void onTaskRemoved (Intent rootIntent)

Добавлено в API уровня 14 Это вызывается, если служба в данный момент работает и пользователь удалилзадача, которая исходит из приложения службы.Если вы установили ServiceInfo.FLAG_STOP_WITH_TASK, вы не получите этот обратный вызов;вместо этого служба будет просто остановлена.

Параметры rootIntent Исходное намерение root, которое использовалось для запуска удаляемой задачи.

Если вы хотите знать, когда весь процесс будет убитбез onDestroy вам нужно знать о DeathRecipient .Есть доброе сообщение в блоге .

Я надеюсь, что этот ответ поможет вам другим способом:)

1 голос
/ 17 января 2012

Я нашел решение.

Как указано в RemoteCallbackList документации , " Если процесс зарегистрированного обратного вызова завершится, этот класс позаботится об его автоматическом удалении изсписок. Если вы хотите выполнить дополнительную работу в этой ситуации, вы можете создать подкласс, который реализует метод onCallbackDied (E)."

Итак, я создал подкласс для RemoteCallbackList и интерфейсIRemoteCallbackDied:

   private interface IRemoteCallbackDied<E extends IInterface> {
      public void remoteCallbackDied(E callback, Object cookie);
   }

   private final class RemoteCallbackListWithDiedCB<E extends IInterface> extends RemoteCallbackList<E> {
      IRemoteCallbackDied<E> mRemoteCallbackDied;

      public RemoteCallbackListWithDiedCB(IRemoteCallbackDied<E> mRemoteCallbackDied)
      {
         this.mRemoteCallbackDied = mRemoteCallbackDied;
      }

      @Override public void onCallbackDied(E callback, Object cookie){
         super.onCallbackDied(callback, cookie);
         this.mRemoteCallbackDied.remoteCallbackDied(callback, cookie);
      }
   }

затем я создал реализацию для IRemoteCallabackDied:

   private final IRemoteCallbackDied<IModConnClient> mRemoteCallbackDied = new IRemoteCallbackDied<IModConnClient>() {
      public void remoteCallbackDied(IModConnClient mModConnClient, Object cookie)
      {
         Log.v("my_tag", "remote callback died!");
         /*
          * Some code
          */
      }
   };

и, наконец, мой список обратных вызовов определен так:

private RemoteCallbackListWithDiedCB<IModConnClient> mClients = new RemoteCallbackListWithDiedCB<IModConnClient>(mRemoteCallbackDied);
...