У меня есть служба, работающая в отдельном процессе. Я обнаружил, что после выхода потока пользовательского интерфейса основного процесса из onDestroy () моя служба уничтожается, хотя я предоставил контекст приложения с привязкой и указал BIND_AUTO_CREATE.
В потоке пользовательского интерфейса основного процесса onCreate ( ) У меня есть этот код привязки:
Intent intent = new Intent(mAppContext, MyService.class);
mAppContext.bindService(intent, mMyServiceConnection, Context.BIND_AUTO_CREATE);
В моем основном процессе "UI thread onDestroy () I" у нас есть код отмены привязки:
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
04-03 05: 15: 12.975: DEBUG / MyApp (847): service onBind
Итак, мои вопросы:
1) Верно ли мое понимание привязки / отмены привязки?
2) Есть ли способ не уничтожить ли мою службу при вызове onDestroy () потока пользовательского интерфейса?
Уловка для ответа на вопрос №2 - никогда не отменять привязку. Но мне это не нравится, потому что при каждом вызове onDestroy () происходит утечка привязки. Я мог «вспомнить», что у меня произошла утечка привязки, и утечка только этого, но затем у меня есть каскадные хаки, и это действительно ужасно.