与服务中的活动(LocalService)进行通信 - Android最佳实践

时间:2011-02-05 17:13:09

标签: android service android-activity android-intent communication

常见方案 - 具有后台服务的活动以轮询服务器。

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

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

但是在示例中,“活动”引用了活动mBoundService,但没有反向连接(服务无法调用活动)。

服务调用活动的最佳方式是什么?

我是否使用Intents,BroadcastReceivers,Messages?怎么样?

3 个答案:

答案 0 :(得分:9)

  

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

我不会。尽可能使用最松散的联轴器。因此,平均而言,使用startService()而不是使用bindService()的绑定模式来瞄准命令模式。值得注意的是,在处理配置更改(例如,屏幕旋转)时,绑定会有点痛苦。

  

服务调用活动的最佳方式是什么?我是否使用Intents,BroadcastReceivers,Messages?怎么样?

请参阅Notify activity from service

答案 1 :(得分:1)

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

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

如果活动源自(由于您的示例“从服务器获取内容”),可以使用AsyncTask或类似方法异步处理。也就是说,您可以从AsyncTask.doInBackground()中的服务器获取,并将结果发布回AsyncTask.onPostExecute中的活动。如果请求的操作需要很长时间,这种情况会有点复杂 - 在这种情况下,我会将其解耦,并从服务中发回广播。

答案 2 :(得分:0)

写为here

  

当您希望通过服务与活动或片段进行通信时   未启动服务或未从服务与多个活动/片段进行通信的用户,则可以使用事件总线或   广播意图,因为它们可以接收任何事件的回调   活动或片段在任何实现的地方。如果您想   从服务到开始活动的活动/片段进行通信   服务,那么您可以使用Pending Intent或Messenger,因为它们可以   放入Intent Extra并传递给Service。

     

待定意图

     

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

     

事件总线

     

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

     

信使

     

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

     

广播意图

     

服务可以发送广播,活动可以响应该广播。