什么是更有效的广播接收器或处理程序?

Roh*_*kde 15 multithreading android handler broadcastreceiver

我知道广播接收器的onReceive()和Handler的handleMessage()在同一个UI线程上运行.假设我想在同一个app(进程)中的两个服务之间进行通信.我可以扩展广播接收器类并注册事件

要么

一个Handler,然后将其实例传递给另一个用于sendMessage()调用的服务.在这两种情况下,我都需要添加一些新的开关案例.但哪种方法更有效?让我们假设代码是线程安全的(没有UI更新).

Xav*_*ler 26

您不应该使用普通广播在您自己的应用之间ActivitiesServices内部进行通信.你应该使用本地广播!首先,你必须BroadcastReceiver为普通广播定义一个类似的东西:

private static final String ACTION_EXAMPLE = "ACTION_EXAMPLE";

private final BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(ACTION_EXAMPLE.equals(intent.getAction())) {
            ...
        }  
    }
};
Run Code Online (Sandbox Code Playgroud)

之后你就可以LocalBroadcastManager这样:

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

你可以注册BroadcastReceiver像这样的(通常你注册BroadcastRecieveronResume()):

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

    LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
    IntentFilter filter = new IntentFilter(ACTION_EXAMPLE);
    manager.registerReceiver(this.receiver, filter);
}
Run Code Online (Sandbox Code Playgroud)

不要忘记取消注册BroadcastReceiver后面的(in onPause()):

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

    LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
    manager.unregisterReceiver(this.receiver);
}
Run Code Online (Sandbox Code Playgroud)

最后你可以发送这样的本地广播:

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

  • 你的答案非常好.我指出你做的一个错字.您描述的用例是用于服务和活动之间的通信.在发送和接收时获取LocalBroadcastMamager时使用了getActivity().据推测,发送或接收应该来自服务,你应该在服务案例中使用`this`而不是getActivity(). (6认同)

Com*_*are 23

我可以扩展广播接收器类并注册事件

如果你的意思是你正在这样做LocalBroadcastManager(参见Kapeller先生对细节的出色答案)Handler,那么LocalBroadcastManager使用a 会略微提高效率Handler.但是,性能差异不应该足够重要.其他进程中的事件总线实现也是如此,例如greenrobot的EventBus和Square的Otto.所有这些都应该足够快,以至于其他问题,例如可维护性,应该是最重要的.

如果你的意思,你是通过系统广播这样做(例如,sendBroadcast()叫上Context),然后Handler,LocalBroadcastManager或其他事件总线实现将是显著更快,更安全的为好.

所有这些都假定这两个服务处于同一个过程中.

最快的解决方案是将两种服务合二为一.如果它们具有相同的寿命,则尤其如此.有很多情况下,应用程序中有2个以上的服务是合理的,但如果没有明确的理由,不要创建大量独立的小服务.