我有一个在单独进程中运行的服务。我发现在主进程 UI 线程从 onDestroy() 退出后,我的服务正在被销毁,即使我已经为应用程序上下文提供了绑定并指定了 BIND_AUTO_CREATE。
在我的主进程的 UI 线程 onCreate() 我有这个绑定代码:
Intent intent = new Intent(mAppContext, MyService.class);
mAppContext.bindService(intent, mMyServiceConnection, Context.BIND_AUTO_CREATE);
在我的主进程的 UI 线程 onDestroy() 我有这个解绑代码:
mAppContext.unbindService(mMyServiceConnection);
请注意,我从不调用 stopService()。
Android 的 bindService() 文档说:
只要调用上下文存在,系统就会认为该服务是必需的。
如果我没看错的话,因为我提供了应用程序的上下文,所以系统认为该服务在应用程序的整个生命周期内都是必需的。
我认为应用程序的上下文可能会随着 onDestroy() 而消失。这就是 Android 的文档对 getApplicationContext() 所说的:
返回当前进程的单个全局应用程序对象的上下文。
如果应用程序的上下文因 onDestroy() 而死,那么我认为 Android 有一个大问题。问题在于,当显示器旋转时,会调用 onDestroy()(并立即调用 onCreate())。因此,效果是当显示器旋转时 - 在我的情况下它经常发生!-- 我的服务总是退出。
请注意,我的应用程序进程的 pid 永远不会改变,即它是同一个进程。鉴于 getApplicationContext() 的文档说明“当前进程”,这一点很重要。
以下是我的调试日志显示的内容:
04-03 05:15:12.874: DEBUG/MyApp(841): 主 onDestroy
04-03 05:15:12.895: DEBUG/MyApp(847): 服务 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): 服务绑定
所以我的问题是:
1)我对绑定/解除绑定的理解是否正确?
2) 有没有办法让我的服务在调用 UI 线程的 onDestroy() 时不被破坏?
问题 #2 的一个技巧是永远不要解除绑定。但我不喜欢它,因为每次调用 onDestroy() 时我都会泄漏一个绑定。我可以“记住”我有一个泄露的绑定,并且只泄露了那个,但是我有级联的黑客攻击,它真的很难看。