与来自服务的活动(LocalService)通信 - Android 最佳实践

Posted

技术标签:

【中文标题】与来自服务的活动(LocalService)通信 - Android 最佳实践【英文标题】:Communicate with Activity from Service (LocalService) - Android Best Practices 【发布时间】:2011-06-21 22:49:30 【问题描述】:

常见场景 - 使用后台服务轮询服务器的活动。

Service 将通过 AlarmManager 定期运行,并为 Activity 执行任务(用户点击按钮,从服务器获取内容)。

我想了解这里的最佳做法。我认为最好的设计是 android LocalService 示例: http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

但在示例中,Activity 引用了 ActivitymBoundService,但没有反向连接(Service 无法调用 Activity)。

Service 调用 Activity 的最佳方式是什么?

我是否使用意图、广播接收器、消息?如何?

【问题讨论】:

【参考方案1】:

我认为最好的设计是 Android LocalService 示例:http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

我不会。使用您能承受的尽可能松的联轴器。因此,平均而言,目标是使用startService() 的命令模式,而不是使用bindService() 的绑定模式。值得注意的是,在处理配置更改(例如屏幕旋转)时,绑定有点麻烦。

Service 调用 Activity 的最佳方式是什么?我使用意图、广播接收器、消息吗?怎么样?

见Notify activity from service

【讨论】:

好吧,我实际上是根据您的教程得出的:github.com/commonsguy/cw-andtutorials/tree/master/… 这种方法有什么不好的地方吗? @paulpooch:好吧,假设我将在接下来的几个月内重写所有 Patchy 教程。 我觉得我需要在此处提供指向另一个 @CommonsWare 帖子的链接,他说当绑定到 Application 对象而不是 时,服务绑定可以减轻痛苦活动 ***.com/a/15235902/1028256))【参考方案2】:

如果您需要使用 bindService() 在活动之间进行紧密耦合,那么您的通信方式取决于发起通信的人。

如果服务是发起的(由于说有一些新信息要共享的警报),它通常会发送一个广播。

如果 Activity 是原始的(由于您的示例“从服务器获取某些内容”),则可以使用 AsyncTask 或类似方法异步处理它。也就是说,您可以在 AsyncTask.doInBackground() 中从服务器获取,并将结果发布回 AsyncTask.onPostExecute 中的活动。如果请求的操作预计需要很长时间,这种情况会稍微复杂一些——在这种情况下,我会将它解耦,然后从 Service 发回广播。

【讨论】:

【参考方案3】:

正如here所写的那样

当您想从服务与 Activity 或 Fragment 进行通信时 没有启动服务或从服务与多个活动/片段进行通信,那么您可以使用事件总线或 广播意图,因为它们可以接收任何事件的回调 活动或片段,无论它们在哪里实现。如果你想 从服务通信到启动 服务然后您可以使用 Pending Intent 或 Messenger,因为它们可以 放入 Intent extra 并传递给 Service。

待定意向

我们可以使用 createPendingResult() 创建一个新的 PendingIntent 您可以交给服务使用和发送结果数据的对象 回到你在 onActivityResult(int, int, Intent) 里面的活动 回调。

事件总线

您可以让服务引发哪些活动或片段的事件 可以使用 Event Bus 监听和响应。

信使

Messenger 是可包裹的,因此可以放入 Intent 额外,因此您的活动可以将此 Messenger 传递给服务。服务 将使用所需的任何数据填充 Message 对象 发送。

广播意图

服务可以发送一个可以被活动响应的广播。

【讨论】:

以上是关于与来自服务的活动(LocalService)通信 - Android 最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

LocalService 的“访问被拒绝”的解决方法

AIDL与service

另一个应用程序中的活动和服务之间的通信

有没有办法让活动与启动活动的服务进行通信?

Android:如何从活动活动中关闭前台活动?

从活动通信到服务