常见方案 - 具有后台服务的活动以轮询服务器。
服务将通过AlarmManager定期运行,并执行活动任务(用户点击按钮,从服务器获取内容)。
我想知道这里的最佳做法。我认为最好的设计是Android LocalService示例: http://developer.android.com/reference/android/app/Service.html#LocalServiceSample
但是在示例中,“活动”引用了活动mBoundService
,但没有反向连接(服务无法调用活动)。
服务调用活动的最佳方式是什么?
我是否使用Intents,BroadcastReceivers,Messages?怎么样?
答案 0 :(得分:9)
我认为最好的设计是Android LocalService示例:http://developer.android.com/reference/android/app/Service.html#LocalServiceSample
我不会。尽可能使用最松散的联轴器。因此,平均而言,使用startService()
而不是使用bindService()
的绑定模式来瞄准命令模式。值得注意的是,在处理配置更改(例如,屏幕旋转)时,绑定会有点痛苦。
服务调用活动的最佳方式是什么?我是否使用Intents,BroadcastReceivers,Messages?怎么样?
答案 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对象 发送。
广播意图
服务可以发送广播,活动可以响应该广播。