在我的主进程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): 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的hack方法是永远不解绑。但我不喜欢它,因为每次调用onDestroy()时都会泄漏一个绑定。我可以“记住”我有一个泄漏的绑定,并且仅泄漏那一个,但这样就会有级联的hack,而且很难看。
startService(intent)
启动服务,可以防止活动销毁时服务重新启动。 - Nicolas Girardin