Android - эффективный способ управления привязкой / отменой привязки от локального сервиса для нескольких действий - PullRequest
1 голос
/ 06 мая 2011

Таргетинг и построение с уровня API 4 и выше.

Сейчас я имею дело с проблемой, в которой я пытаюсь сохранить привязки к моей локальной службе в нескольких действиях и остановить службу, когда последнее соединение не установлено.

В двух словах, моя служба просто вызывает системную службу в HandlerThread, которая быстро возвращается к BroadcastReceiver, а затем снова выполняет тот же вызов после ожидания предварительно определенного количества времени (не менее 15 секунд).

Предположим, у меня есть базовое действие: создайте первую связь со своим сервисом в onCreate () следующим образом:

Intent service = new Intent(ActivityA.this, MyLocalService.class);
getApplicationContext().bindService(service, mConnection, BIND_AUTO_CREATE);

Предположим также, что из-за того, что я поддерживаю привязку к поворотам экрана, перенося связыватель и соединение, я не отсоединяюсь от службы до завершения действия: // onRetainNonConfigurationInstance переносит мое связующее и соединение, так как я привязан к контексту приложения, поэтому они являются честной игрой.

public void onDestroy(){
   super.onDestroy();
   //using binder, remove callback to service from current activity
   if(isFinishing(){
      getApplicationContext().unbindService(mConnection);
   }
}

Я в значительной степени делаю эту настройку для любой другой Деятельности, которая хочет прослушивать сервис.

Моя проблема заключается в том, что в конечном итоге некоторые действия не мгновенно связываются, поэтому служба все равно будет зависать в соответствии с поведением шаблона привязки / отмены привязки, если служба создается автоматически. Мне пришлось пойти так далеко, что остановил свой поток, прежде чем отменить привязку к последнему действию, что предотвратило вызов любых системных служб в BG. Есть ли лучший способ управления службами привязки и отмены привязки, или я делаю все возможное с моей текущей настройкой? Кроме того, поскольку на мою службу (через связыватель) ссылаются слабо, уменьшит ли это мой риск утечки памяти?

1 Ответ

1 голос
/ 16 мая 2011

Очевидно, это не было отменено из-за того, что я не передавал привязку через повороты и использовал внутренний флаг состояния, чтобы определить, вращается ли действие (было установлено значение true, когда onRetainNonConfigurationInstance() назывался).В большинстве случаев он не читал состояние должным образом в onDestroy ().

В конечном итоге я отменил привязку, когда isFinishing () разрешил значение true в onDestroy (), а также передал привязки через onRetainNonConfigurationInstance (), и в результате служба смогла завершиться при последней отмене привязки.

...