我的应用程序有一个我想要一直运行的本地服务,我通过让服务启动另一个线程来完成,并响应发送到其Handler
的请求。
绑定到服务会返回后台线程的Handler,以便客户端活动可以发出请求。
到目前为止一切顺利。
我的应用使用需要使用该服务的Fragment
来设置其初始状态。当响应用户输入实例化片段时,这没关系,因为到那时服务被绑定到片段的父活动。也就是说,框架已调用ServiceConnection.onServiceConnected
,并且活动知道其片段可用于与服务通信的Handler
。
我的问题在我的活动被重新实例化以响应方向更改时开始。从我读取堆栈跟踪看来,在这种情况下,框架会在调用 ServiceConnection.onServiceConnected
之前通过主线程的消息循环重新创建所有活动片段,所以他们无法在娱乐阶段访问该服务。
我找到的唯一解决方案是服务将与其后台线程关联的Handler发布到应用程序全局状态。 (我为此目的继承了Application
,尽管还有其他技术。)我毕竟使用它的'线程'而不是'服务'。
这似乎是一种简单而有效的方式来做一些Android似乎想要变得笨拙和复杂的事情。除了通常对全球状态的一般保留之外,我的方法是否会忽略任何特定于Android的注意事项?或者任何更好的方法来达到同样的目标,我希望这是明确的?
答案 0 :(得分:1)
如果我理解正确,您可能有兴趣研究IntentService。 IntentService是一个服务,它在绑定时启动自己的Thread,并在收到Intents时处理它们。你有没看过它?
答案 1 :(得分:1)
Android有办法 - 这通常很尴尬,但是 - 公平 - 只是因为它意味着要解决一些非常棘手的问题。
你可以:
将这两种方法结合起来很棘手,因为它经常让你处于两个世界中最糟糕的状态。
在你的情况下(我知道你使用绑定服务,因为你需要传递真正的引用 - 所以切换到基于意图的服务是 - 由于某种原因 - 不可能),我会删除服务和应用程序子类。在您描述的场景中,您根本不需要它们。一个简单,纯粹的Java单例就行了。
另一个组合是采用Android方式。在这种情况下,您将围绕连接到Service
的代码创建一个包装器,并使其成为Loader
的子类。这样,您就可以拥有由LoaderManager
管理的单个连接实例。
API的原始作者可能会要求您重新编写应用程序,以便从内容提供程序读取所有数据并通过异步服务进行修改(或者可能不是,谁知道......)。