У меня есть служба, которая работает в отдельном процессе. Я обнаружил, что после того, как поток пользовательского интерфейса основного процесса выходит из onDestroy (), мой сервис разрушается, хотя я предоставил контекст приложения с привязкой и указал BIND_AUTO_CREATE.
В потоке пользовательского интерфейса моего основного процесса onCreate () у меня есть этот код привязки:
Intent intent = new Intent(mAppContext, MyService.class);
mAppContext.bindService(intent, mMyServiceConnection, Context.BIND_AUTO_CREATE);
В потоке пользовательского интерфейса моего основного процесса onDestroy () у меня есть этот код привязки:
mAppContext.unbindService(mMyServiceConnection);
Обратите внимание, что я никогда не вызываю stopService ().
Документация Android для bindService () гласит:
Услуга будет считаться востребованной системой только до тех пор, пока существует вызывающий контекст.
Если я правильно читаю, потому что я предоставил контекст приложения, служба считается необходимой системе для жизни приложения.
Я думал, что, возможно, контекст приложения умирает с помощью onDestroy (). Это то, что говорится в документации Android для getApplicationContext ():
Возвращает контекст одного глобального объекта Application текущего процесса.
Если контекст приложения умирает с помощью onDestroy (), то я думаю, что в Android есть большая проблема. Проблема заключается в том, что при вращении дисплея вызывается onDestroy () (и сразу за ним следует onCreate ()). Таким образом, эффект заключается в том, что когда дисплей поворачивается - и это происходит довольно часто в моем случае! - Мой сервис всегда выходит.
Обратите внимание, что pid процесса моего приложения никогда не меняется, т.е. это тот же процесс. Это важно в свете документации для getApplicationContext () с указанием «текущий процесс».
Вот что показывают мои журналы отладки:
04-03 05: 15: 12.874: DEBUG / MyApp (841): main onDestroy
04-03 05: 15: 12.895: DEBUG / MyApp (847): служба onUnbind
04-03 05: 15: 12.895: DEBUG / MyApp (847): сервис onDestroy
04-03 05: 15: 12.934: DEBUG / MyApp (841): основное вкл. Создание
04-03 05: 15: 12.966: DEBUG / MyApp (847): обслуживание при создании
04-03 05: 15: 12.975: DEBUG / MyApp (847): служба onBind
Итак, мои вопросы:
1) Верно ли мое понимание привязки / отмены привязки?
2) Есть ли способ, чтобы мой сервис не был уничтожен при вызове onDestroy () потока пользовательского интерфейса?
Хак для вопроса №2 - никогда не отвязывать. Но мне это не нравится, потому что тогда я пропускаю привязку каждый раз, когда вызывается onDestroy (). Я мог бы «вспомнить», что у меня есть одна утечка привязки и утечка только этой, но потом у меня есть каскадные хаки, и это действительно ужасно.