我有一个在单独进程中运行的服务.我发现在主进程UI线程退出onDestroy()之后我的服务正在被销毁,即使我已经提供了带有绑定的应用程序上下文并指定了BIND_AUTO_CREATE.
在我的主进程’UI thread onCreate()中,我有这个绑定代码:
Intent intent = new Intent(mAppContext,MyService.class);
mAppContext.bindService(intent,mMyServiceConnection,Context.BIND_AUTO_CREATE);
在我的主进程’UI thread onDestroy()中,我有这个无法解释的代码:
mAppContext.unbindService(mMyServiceConnection);
请注意,我从不调用stopService().
Android的bindService()文档说:
The service will be considered required by the system only for as long as the calling context exists.
如果我正确地阅读,因为我提供了应用程序的上下文,系统认为该服务在应用程序的生命周期内是必需的.
我原以为应用程序的上下文可能会与onDestroy()一起消失.这就是Android的文档对getApplicationContext()的说法:
Return the context of the single,global Application object of the current process.
如果应用程序的上下文与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): service onUnbind
04-03 05:15:12.895: DEBUG/MyApp(847): service onDestroy
04-03 05:15:12.934: DEBUG/MyApp(841): main onCreate
04-03 05:15:12.966: DEBUG/MyApp(847): service onCreate
04-03 05:15:12.975: DEBUG/MyApp(847): service onBind
所以我的问题是:
1)我对绑定/解除绑定的理解是否正确?
2)当调用UI线程的onDestroy()时,有没有办法让我的服务不被破坏?
问题#2的黑客攻击永远不会解开.但是我不喜欢它,因为每次调用onDestroy()时我都会泄漏一个绑定.我可以“记住”我有一个泄漏的绑定,只泄漏那个,但后来我有级联黑客,它真的很难看.