У меня есть служба, которая работает в отдельном процессе. Я обнаружил, что после того, как поток пользовательского интерфейса основного процесса выходит из 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): main onCreate
04-03 05:15:12.966: DEBUG/MyApp(847): служба onCreate
03-04 05:15:12.975: DEBUG/MyApp(847): служба onBind
Итак, мои вопросы:
1) Правильно ли я понимаю привязку/отвязку?
2) Есть ли способ, чтобы мой сервис не уничтожался при вызове onDestroy() потока пользовательского интерфейса?
Хитрость для вопроса № 2 — никогда не отвязываться. Но мне это не нравится, потому что тогда я пропускаю привязку каждый раз, когда вызывается onDestroy(). Я мог бы «вспомнить», что у меня есть одна утечка привязки и утечка только этой, но тогда у меня есть каскадные хаки, и это действительно уродливо.