Android学习笔记—— 六、关于广播的基础知识

广播分为两种:
  • 标准广播:是一种完全异步执行的广播,广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,没有先后顺序。这种广播的效率比较高,但是这也意味着它是无法截断的。
  • 有序广播:这是一种同步执行的广播,在广播发出之后,同一时刻只有一个广播接收器能够接收到这条广播消息,当这个广播接收器中的逻辑执行完毕后广播在会继续传递。所以此时的广播是有先后顺序的,其顺序由广播接收器的注册信息中的优先度大小决定,优先度越大越先接收到广播。而且先接收到广播的广播接收器可以使用abortBroadcast();停止广播发送。

1. 广播的发送

发送广播有两种:

  • 系统发送的广播,比如电量过低、系统启动完成或网络变化等
  • 程序自定义并发送的广播,分为全局广播和本地广播两种,全局广播发送方法如下:
/**
 *全局广播,所有应用都可以收到
 */
//自定义广播配置并发送
Intent intent = new Intent("com.example.MY_BROADCAST");
                
//发送标准广播
//sendBroadcast(intent);
                
//发送有序广播,第二个参数是用于设置要求的接受权限,设为null即为不设权限
sendOrderedBroadcast(intent,null);

2. 广播的接收

广播的接收需要用到广播接收器,广播接收器有两种创建方法。静态在AndroidManifest.XML中注册或者在java文件中动态声明。

两者优缺点对比:
静态方法注册的接收器在程序不启动时就可以接收到广播但是注册比较固定,灵活度不足;相比之下,动态注册方法可以自由控制注册和注销,但是只有在程序启动之后才可以接收到广播。

1. 在AndroidManifest.XML中注册 (静态)
		<receiver
            android:name=".MyBroadcastReceiver"
            android:enabled="true"  //表示是否启用这个广播接收器
            android:exported="true">  //表示是否接受本程序以外的广播
            <intent-filter 
            	android:priority="100"> //当这个广播接收器用于接收有序广播使用android:priority属性设置接收有序广播的优先度
                <action android:name="com.example.MY_BROADCAST"/> //使用intent-filter设置广播接收器接收什么样的广播
            </intent-filter>
        </receiver>

使用静态注册的方法还需要建议一个对应名称的自定义类,继承BroadcastReceiver并重写onReceive方法用于书写接收到广播后的逻辑处理

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // 书写逻辑处理方法
    }
}
2. 在java文件中注册(动态)
  • 自定义要注册的广播接收器类或者使用内部类重写onReceive方法
  • 实例化自定义广播接收器类并进行设置
		//使用IntentFilter创建广播过滤器并设置规则
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.MY_BROADCAST");

		//使用setPriority方法设置有序广播优先度
		intentFilter.setPriority(100);
        
        //实例化自定义广播接收器
        MyBroadcastReceiver = new MyBroadcastReceiver();
        
        //注册广播,第一个参数为广播接收器,第二个参数为接收广播的类型,通过Intent过滤器实现
        registerReceiver(MyBroadcastReceiver,intentFilter);

使用这种方法注册的广播接收器最后一定都要使用unregisterReceiver方法取消注册,比如重写在onDestroy中:

	@Override
    protected void onDestroy() {
        super.onDestroy();
        //应用退出时注销广播接收器
        unregisterReceiver(MyBroadcastReceiver);
    }

3. 本地广播

本地广播发送的广播只会在程序内部传递,本地广播接收器也只会接收到程序内部的广播。

本地广播需要在本地实例化一个LocalBroadcastManager对象用于发送广播进行动态注册本地广播接收器

本地广播的优点:

  1. 发送的广播不会离开程序自身,不必担心广播会泄露机密数据
  2. 其他的程序无法将广播发送到该程序内部,不必担心相关部分会有安全漏洞的隐患
  3. 发送本地广播比发送全局广播更高效

本地广播的发送
Intent intent = new Intent("com.example.MY_BROADCAST");
				
//使用实例化的本地广播管理器发送本地广播
localBroadcastManager.sendBroadcast(intent);
本地广播接收器

因为本地广播只能使用本程序发送,所以不需要使用静态方法注册广播接收器.
动态注册方法和之前一样,唯一不同的地方就是注册和取消注册的方法是调用实例化的本地广播管理器的方法:

//注册
localBroadcastManager.registerReceiver(localReceiver,intentFilter_local);

//取消注册
localBroadcastManager.unregisterReceiver(localReceiver);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值