哪种服务和活动之间的最佳沟通方式?

时间:2014-05-11 20:14:55

标签: android

现在,Activity可以使用以下三种方式之一连接到服务:

我认为BroadcastReceivers是最简单的沟通方式,但我想知道为什么以及何时使用其他方式?或者换言之,使用信使或AIDL的最佳做法是广播接收者?

4 个答案:

答案 0 :(得分:12)

我主要倾向于使用LocalBroadcasts。它们基本上就像真正的广播一样,但只对您的应用程序可见。首先,您必须像普通广播一样创建BroadcastReceiver

private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if(Intent.SOME_ACTION.equals(action)) {
            // Do your work
        }
    }
};

然后您可以注册和取消注册BroadcastReceiver,如下所示:

@Override
public void onResume() {
    super.onResume();

    IntentFilter intentFilter = new IntentFilter(Intent.SOME_ACTION);

    LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
    manager.registerReceiver(broadcastReceiver, intentFilter);
}

@Override
public void onPause() {
    super.onPause();

    LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
    manager.unregisterReceiver(broadcastReceiver);
}

最后,您可以从Service或您应用中的任何其他位置发送广播,如下所示:

Intent intent = new Intent(Intent.SOME_ACTION);

LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
manager.sendBroadcast(intent);

答案 1 :(得分:10)

如果您希望在应用中BroadcastReceiverService之间进行通信,可以使用Activity

当您的应用程序需要与其他进程(IPC)通信时,主要使用

MessengerAIDL。在这种情况下,您的界面应该有一个Service,它定义了Handler,可以响应不同类型的Message个对象。

现在MessengerAIDL之间的差异非常简单。使用Messenger时,它会将所有请求排入单个线程。所以你的Service不一定是线程安全的。如果您希望Service同时处理多个请求,则可以直接使用AIDL。在这种情况下,您的Service必须能够进行多线程并且构建为线程安全的。事实上,Messenger是在AIDL的顶部实现的。

为了更好地理解,请查看Bound Services

您还应该检查BroadcastReceiver or Messenger via Handler

的答案

答案 2 :(得分:3)

Xaver Kapeller 的回答确实很好。但是,它有(主要)缺点:广播可能会被遗漏。

当用户离开Activity时(例如,通过显示最近的应用),您取消注册BroadcastReceiver。如果此时发送广播,则您的Activity不会收到广播。导航回Activity时,它可能处于无效状态。


使用ResultReceiver,在这种情况下仍会收到结果。此外,ResultReceiverparcelable,因此您可以在生命周期事件中保存和恢复它 它会导致一些开销,这就是为什么我创建this experimental library来缓解它的原因。现在它只使用IntentService,但它应该很容易扩展。

答案 3 :(得分:2)

如果您的service is used only by the local application并且不需要跨流程工作,则可以实施自己的Binder class,以便客户直接访问public methods in the service

注意:仅当客户端和服务位于同一应用程序和进程中时才有效。这是最常见的。

扩展Binder类 http://developer.android.com/guide/components/bound-services.html#Binder