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

问题描述 投票:20回答:3

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

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

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

但是在示例中,Activity具有对活动mBoundService的引用,但没有反向连接( Service无法调用Activity )。

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

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

android service android-activity android-intent communication
3个回答
9
投票

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

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

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

请参阅从服务通知活动


1
投票

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

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

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


0
投票

正如这里所写

当您想要从服务到未启动服务的Activity或Fragment或从服务到多个活动/片段进行通信时,您可以使用Event Bus或Broadcast Intents,因为它们可以接收任何活动或片段中的事件的回调无论它们在何处实现。如果您想要从服务到启动服务的活动/片段进行通信,那么您可以使用Pending Intent或Messenger,因为它们可以放入Intent extra并传递给Service。

待定意图

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

活动巴士

您可以使用事件或片段可以监听的服务引发事件,并使用事件总线进行响应。

信使

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

广播意图

服务可以发送可以由活动响应的广播。

© www.soinside.com 2019 - 2024. All rights reserved.