本文主要是介绍Android中BroadcastReceiver与LocalBroadcastReceiver的区别,即本地广播和全局广播的区别,下面则从通信范围,是否跨进程传递,注册方式和接收方式等方面进行逐步分析。
一、通信息范围的比较1、LocalBroadcastReceiver即本地广播,而 BroadcastReceiver 是 全局广播。
2、LocalBroadcastReceiver只能接收来自本应用App发送的广播,并且它只能用于应用内的通信,所以它的安全性更好,但是通信范围比较小,仅局限于App应用内;而 BroadcastReceiver它不仅针对App内的广播有效,而且对App应用之间的广播通信、App应用和系统间的广播通信也有效,它的通信范围更大。
二、通信效率的比较1、LocalBroadcastManager的核心实现其实还是 Handler,因此它是应用内的通信,自然安全性更好,运行效率更高。
2、而 BroadcastReceiver 是全局广播,可以跨进程通信,范围更广,从而导致它的运行效率没有本地广播高效,毕竟一个是本地的通信,一个是跨进程的通信方式,效率肯定相对较低点,但对于实时性不高的应用场景我们可以忽略不计。
三、注册方式的比较1、本地广播不能用静态注册的方式,只能采用动态注册的方式。
2、全局广播可以用静态注册的方式,也可以采用动态注册的方式。
四、注册代码的比较1、本地广播注册代码
// 添加注册的意图
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_LOCAL_SEND);
LocalBroadcastManager.getInstance(this).registerReceiver(mLocalBroadcastReceiver, filter);
2、全局广播注册代码
IntentFilter filter = new IntentFilter();
// 添加注册的意图
filter.addAction(ACTION_ALL_SEND);
getBaseContext().registerReceiver(mBroadcastReceiver, filter);
五、取消注册代码的比较1、本地广播取消注册代码
if (mLocalBroadcastReceiver != null) {
LocalBroadcastManager.getInstance(this).unregisterReceiver(mLocalBroadcastReceiver);
}
2、全局广播取消注册代码
if (mBroadcastReceiver != null) {
getBaseContext().unregisterReceiver(mBroadcastReceiver);
}
六、发送广播代码的比较1、本地广播发送代码
Intent intent = new Intent(ACTION_LOCAL_SEND);
Bundle extras = new Bundle();
extras.putString(KEY_MSG, "book_local");
intent.putExtras(extras);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
2、全局广播发送代码
Intent intent = new Intent(ACTION_ALL_SEND);
Bundle extras = new Bundle();
extras.putString(KEY_MSG, "book_all");
intent.putExtras(extras);
getBaseContext().sendBroadcast(intent);