- BroadReceiver 为系统级的(重量级)的跨进程通讯机制;例如:广播短信,收到本广播的可以进行处理。
- BroadReceiver 分为静态广播 和动态广播。
a、动态广播的优点,其一,动态广播的生命周期是和其宿主的生命周期是一致的,例如Acitivity创建的时候注册,destroy的时候注销,节省内存资源。而静态广播当应用程序启动之后就注册了,注册之后和APP的进程是否存活无关,例如广播拉活的应用。
b、动态广播的优点,其二,相对静态广播来说,动态广播不存在安全性问题,静态广播的安全性见下面解说。
c、动态广播的缺点,动态广播需要自己去注销,否则可能因为持有context而发生内存泄漏,并且广播只能注册一次,如果没有注销再次注册会抛出异常。
d、静态广播优点,在AndroidManifest.xml注册,常驻内存,因此不同多次注册,平凡性注册会损耗性能,当然常驻内存会占有一部分内存空间。
e、静态广播缺点,其一,上面说过常驻内存占用内存空间;其二,如果android:exported = true,即是全局广播(在各个APP之间可以传播),则存在安全性问题。安全性问题主要表现在2个方面:一,如果外部不断的发送和本应用定义的广播向匹配的广播,则本应用可能会带来持续性能攻击;二、如果外面定义的接收广播类型和本应用发送的广播类型相匹配,则带来了本应用数据安全性问题。
f、 针对全局广播的安全性问题,有以下几方面可以解决。一,android:exported = false,将广播接收端设置为只接收本应用内的发送者,但是解决不了信息泄露性问题;二、通过设置权限android:permission,只有通过权限认证的才会处理;三、广播发送端,intent.setPackage,通过设置包名,只有匹配包名的接收者才能接收;四、采用本地广播LocalBroadcaseManager,LocalBroadcaseManager解决了全局广播风险性问题,以下会对LocalBroadcaseManager进行详解。 - BroadReiceiver 和 LocalBroadcase的区别。
BroadReiceiver 的风险性问题前面已经说过,而LocalBroadcase通过LocalBroadcaseManager很好的解决了以上2个安全性问题,因为LocalBroadcaseManager的广播只能本应用接收者才能接收、广播发送只能发送到本应用的广播接收者。 - 广播的基本应用如下:
<receiver android:name=".BroadReceiverOne"
android:exported="true"
android:permission="">
<intent-filter>
<action android:name="" />
<category android:name="" />
<data android:host="" />
</intent-filter>
</receiver>
public class BroadReceiverOne extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
Intent intent = new Intent();
intent.setPackage("")
mContext.sendBroadcast(new );
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(mContext);
localBroadcastManager.sendBroadcast(new Intent());
//本地广播的接收
roadReceiverOne broadReceiverOne = new BroadReceiverOne()
LocalBroadcastManager.getInstance(mContext).registerReceiver(broadReceiverOne,new IntentFilter())
LocalBroadcastManager.getInstance(mContext).unregisterReceiver(broadReceiverOne)