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

Haz*_*ass 7 android

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

我认为BroadcastReceivers是最简单的通信方式,但我想知道为什么以及何时使用其他方式?或者换句话说,在哪些情况下,信使或AIDL将是广播接收者使用的最佳做法?

Xav*_*ler 13

我大多倾向于使用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
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

然后,您可以注册和取消注册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);
}
Run Code Online (Sandbox Code Playgroud)

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

Intent intent = new Intent(Intent.SOME_ACTION);

LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
manager.sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)

  • 同意.这个或第三方消息总线(Square's Otto,greenrobot的EventBus)是目前的最佳实践. (2认同)

azi*_*kim 11

您可以使用BroadcastReceiver,当你想之间的通信Service,并Activity在应用程序中.

MessengerAIDL当您的应用程序需要与其他进程(IPC)通信时,主要使用和.在这种情况下,您的界面应该有一个Service定义Handler响应不同类型Message对象的接口.

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

为了更好地理解绑定服务

您还应该通过Handler检查BroadcastReceiver或Messenger的答案