codeegginterviewgroup / CodeEggDailyInterview

码个蛋每日面试题
393 stars 55 forks source link

BroadcastReceiver与LocalBroadcastReceiver的区别 #81

Open kukyxs opened 5 years ago

lydlovezjr commented 5 years ago

Android中BroadcastReceiver与LocalBroadcastReceiver的区别 即本地广播和全局广播的区别

1)通信范围的比较 1:LocalBroadcastReceiver即本地广播,而BroadcastReceiver是全局广播. 2:LocalBroadcastReceiver只能接收来自本App发送的广播,并且它只能用于应用内的通信. 所以它的安全性更好,但是通信范围比较小,仅局限于App应用内. 而BroadcastReceiver它不仅针对App内的广播有效,而且对App应用之间的广播通信、App应用和系统间的广播通信也有效,它的通信范围更大.

2)通信效率的比较 1:LocalBroadcastManager的核心实现是Handler,因此它是应用内的通信,自然安全性更好,运行效率更高. 2:BroadcastReceiver的核心实现是Binder,是全局广播,可以跨进程通信,范围更广,从而导致它的运行效率没有本地广播高效,毕竟一个是本地的通信,一个是跨进程的通信方式,效率肯定相对较低点,但对于实时性不高的应用场景我们可以忽略不计.

3)注册方式的比较 1:本地广播不能用静态注册的方式,只能采用动态注册的方式. 2:全局广播可以用静态注册的方式,也可以采用动态注册的方式.

4)注册代码的比较 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);

5)取消注册代码的比较 1:本地广播取消注册代码 if (mLocalBroadcastReceiver != null) { LocalBroadcastManager.getInstance(this).unregisterReceiver(mLocalBroadcastReceiver); } 2:全局广播取消注册代码 if (mBroadcastReceiver != null) { getBaseContext().unregisterReceiver(mBroadcastReceiver); }

6)发送广播代码的比较 1:本地广播发送代码 Intent intent = new Intent(ACTION_LOCAL_SEND); Bundle extras = new Bundle(); extras.putString(KEY_MSG, "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, "all"); intent.putExtras(extras); getBaseContext().sendBroadcast(intent);