我的应用程序有一个我想一直运行的本地服务,我通过让服务启动另一个线程并响应发送到它的请求来完成Handler
. 绑定到服务返回后台线程的处理程序,以便客户端活动可以发出请求。
到目前为止,一切都很好。
我的应用程序使用Fragment
需要使用服务的 s 来设置它们的初始状态。当片段被实例化以响应用户输入时,没关系,因为到那时服务已绑定到片段的父活动。也就是说,ServiceConnection.onServiceConnected
已经被框架调用了,并且activity知道Handler
它的Fragments可以用来与服务通信。
当我的活动被重新实例化以响应方向变化时,我的问题就开始了。从我对堆栈跟踪的阅读看来,在这种情况下,框架在通过主线程的消息循环的同一通道中重新创建了所有活动片段,之前 ServiceConnection.onServiceConnected
通过主线程的消息循环在同一通道中重新创建所有活动片段,因此它们无法在重新创建阶段访问服务。
我找到的唯一解决方案是让服务将与其后台线程关联的 Handler 发布到应用程序全局状态。(我Application
为此目的进行子类化,尽管还有其他技术。)我毕竟使用它的“线程”而不是它的“服务”。
这似乎是一种简单而有效的方法来做一些 Android 似乎想要变得尴尬和复杂的事情。除了通常对全局状态的一般保留之外,我的方法是否忽略了任何特定于 Android 的注意事项?或者有什么更好的方法来实现相同的目标,我希望这是清楚的?