android核心组件之BroadReceiver(广播)

本文介绍了BroadcastReceiver在Android系统中的作用,如跨进程通讯,特别是静态广播和动态广播的优缺点。动态广播与生命周期一致,节省内存,但需手动注销,而静态广播常驻内存,可能存在安全性问题。针对安全性问题,提出了几种解决方案,包括限制广播范围、设置权限、指定包名以及使用LocalBroadcastManager。最后,强调了LocalBroadcastManager如何解决BroadcastReceiver的安全性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. BroadReceiver 为系统级的(重量级)的跨进程通讯机制;例如:广播短信,收到本广播的可以进行处理。
  2. 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进行详解。
  3. BroadReiceiver 和 LocalBroadcase的区别。
    BroadReiceiver 的风险性问题前面已经说过,而LocalBroadcase通过LocalBroadcaseManager很好的解决了以上2个安全性问题,因为LocalBroadcaseManager的广播只能本应用接收者才能接收、广播发送只能发送到本应用的广播接收者。
  4. 广播的基本应用如下:
//静态广播,android:permission设置权限,android:exported设置是全局广播还是局部广播
 <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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值