Android:旋转显示时服务被破坏

我有一个在单独进程中运行的服务.我发现在主进程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()时我都会泄漏一个绑定.我可以“记住”我有一个泄漏的绑定,只泄漏那个,但后来我有级联黑客,它真的很难看.

最佳答案
1)是的,我认为你的理解是正确的(我说我想是因为我认为我理解你在说什么;-)).您正在使用的标志意味着“如果有人试图绑定它并且只要有人绑定它就会自动启动它,但是一旦没有人绑定它,就可以自由地杀死它”.

2)查看here所述的START_STICKY标志.这应该允许您启动服务并使其保持运行,无论调用上下文发生什么

通常,onDestroy()表示您的活动即将被杀死.旋转显示时,将杀死并重新创建活动.您负责以适当的方法将任何状态保存到Bundle,然后在onCreate()中恢复它.

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...