我正在开发Android上的多人在线文字游戏,并希望实现一个检查服务器端事件的线程,如下所示:
线程将负责监听各种事件并将事件分派给负责的活动。如果用户可以看到它。
换句话说,为了更清楚,我有一个事件列表,每个活动必须注册到这些事件的子集。
E1 - E2 - E3 - E4
我问的是实现在后台运行的线程的最佳设计方法,并可以将事件分派给所有活动?
- 在应用程序级别实现AsyncTask。
- 向自定义操作发送广播意图。
- 服务不是最好的方法,因为当用户没有与您的应用程序交互时,它应该被创建为在后台运行。
您能提出最佳做法吗?
答案 0 :(得分:1)
一个好的方法是使用与AsyncTasks结合的服务。
虽然服务在用户不与您的应用程序交互时很有用,但这当然不是它的唯一用途。服务是任何不需要UI的逻辑之家。
在数据驱动的应用程序中,我使用了Services作为API适配器层。这很好,因为我可以从任何活动中启动它,而不必担心它是否已经实例化,或者我是否需要在完成之后进行任何清理工作。该框架管理服务的生命周期并跟踪客户。
我认为你的情况类似。只要需要,每个活动都可以使用bindService
和unbindService
注册更新。只要绑定任何Activity,服务将继续执行其操作。该服务可以使用onBind
和onUnbind
中收到的意图跟踪哪些活动需要更新,并通过特定意图发送更新,或者更合适的是,服务可以触发广播意图和活动可以注册他们需要的东西。
在服务中,您可以运行AsyncTasks(可能在AsyncTask.THREAD_POOL_EXECUTOR
运行它们,因此您可以获得多个线程)来执行更新。请记住,服务本身是在UI线程上启动的。
使用服务的另一个好处是它不需要运行Activity。想到这一点的一个用途是关机后清理。如果您需要在用户退出时发布分数或分析或某些内容,您可以允许活动快速关闭并在后台完成较长时间的工作。
活动可以使用startService
从服务请求更长的单个任务,并且在调用stopSelf
(或stopSelfResult
)之前服务不会退出。
start / stop和bind / unbind的组合确实可以实现对服务的干净管理。它将在需要的时候运行,并且您可以将所有API访问保存在一个位置。
修改强>
好像这不是一个坚固的文本墙,我想出了另一个使用服务的充分理由。来自the developer guide on processes & threads:
因为运行服务的进程排名高于进程 与后台活动,一个启动长期运行的活动 相反,操作可能会为该操作启动服务 而不是简单地创建一个工作线程 - 特别是如果操作将 可能比活动更持久......