安卓四大组件:BroadCastReceiver

基础原理

采用观察者模式:基于消息的发布/订阅事件模型
分为三个角色:①消息订阅者(广播接收者)②消息发布者(广播发布者)③消息中心

基本流程: ①广播接收者 在 消息中心 进行注册
②广播发布者 先向 消息中心 发送广播
③消息中心 依据 广播发布者 要求筛选 接收者
④消息中心 将广播发送到合适 接收者 的消息队列中
⑤广播接收者 通过消息循环拿到广播,调用onReceive

使用流程

自定义广播接收者BroadcastReceiver

要求: ①继承BroadcastReceiver基类
②必须复写抽象方法onReceive()

public class mBroadcastReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    }
}

注:onReceive中不应执行耗时操作(广播接收器运行在UI线程)

广播接收器注册

静态注册

在AndroidManifest中用标签声明

<receiver 
    android:enabled=["true" | "false"]
//此broadcastReceiver能否接收其他App的发出的广播
//默认值是由receiver中有无intent-filter决定的:如果有intent-filter,默认值为true,否则为false
    android:exported=["true" | "false"]
    android:icon="drawable resource"
    android:label="string resource"
//继承BroadcastReceiver子类的类名
    android:name=".mBroadcastReceiver"
//具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收;
    android:permission="string"
//BroadcastReceiver运行所处的进程
//默认为app的进程,可以指定独立的进程
//注:Android四大基本组件都可以通过此属性指定自己的独立进程
    android:process="string" >

//用于指定此广播接收器将接收的广播类型
//本示例中给出的是用于接收网络状态改变时发出的广播
 <intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

配置好后,当APP首次启动时,系统会自动实例化mBroadcastReceiver并注册

动态注册

在代码中调用Context.registerReceiver()方法

@Override
  protected void onResume(){
      super.onResume();

    // 1. 实例化BroadcastReceiver子类与IntentFilter
     mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
     IntentFilter intentFilter = new IntentFilter();

    // 2. 设置接收广播的类型
    intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);

    // 3. 动态注册:调用Context的registerReceiver()方法
     registerReceiver(mBroadcastReceiver, intentFilter);
 }

// 注册广播后,要在相应位置记得销毁广播
 @Override
 protected void onPause() {
     super.onPause();
     unregisterReceiver(mBroadcastReceiver);
     }
}

注:①动态广播最好在onResume中注册,在onPause中注销(①首先保证不发生内存泄漏,需要进行注册、注销成对出现 ②在生命周期中,onResume和onPause是成对出现的,并且此处会保证广播在APP执行时一定会注册,死亡时一定被注销(系统有时需要腾出内存执行更高优先级任务时,Activity会在执行onStop后就销毁,并不会执行到onStop和onDestroy,所以在onStop中注销))
②上述两种注册方式,动态更为灵活,可以用于特定时期获取广播时使用;静态注册的广播会持续运行,用在需要时刻保持广播获取时使用

广播发送分类

普通广播

开发者自定义intent的广播。
发送:

Intent intent = new Intent();
//对应BroadcastReceiver中intentFilter的action
intent.setAction(BROADCAST_ACTION);
//发送广播
sendBroadcast(intent);

接收:

<receiver 
    android:name=".mBroadcastReceiver" >
    <intent-filter>
    	//此处action需要和发送方对应
        <action android:name="BROADCAST_ACTION" />
    </intent-filter>
</receiver>

系统广播

系统广播涉及手机的基本操作(开关机、网络变化等),都有特定的intent-fliter。
例如:监听网络变化(android.net.conn.CONNECTIVITY_CHANGE)等
在使用系统广播时,只需要在注册时设置对应的action即可,不需要用户手动发送广播

有序广播

该广播会被广播接收者按先后顺序接收
顺序规则:①按照Priority属性从大-小排序(相同时,动态注册的广播优先)
特点: ①广播会按顺序接收 ②先接收的广播接收者可以截断 ③先接收的广播接收者可以对广播进行修改,那么后接收到的接收修改后的广播
具体使用: 和普通广播相同,只是发送方式不同

sendOrderedBroadcast(intent);

App应用内广播

安卓广播可以跨App通信,那么会导致不同app中若有相同intent-fliter,导致广播出问题
使用:
①将全局广播设置为局部广播:
a.注册时将exported设置为false,即非本app内部发出的广播不被接收
b.广播发送和接收时设置响应权限permission,用于权限验证
c.发送广播时指定广播接收器所在的包名intent.setPackage(packageName)
②用封装好的LocalBroadcastManager
该类只能动态注册

//注册应用内广播接收器
//步骤1:实例化BroadcastReceiver子类 和 IntentFilter mBroadcastReceiver 
mBroadcastReceiver = new mBroadcastReceiver(); 
IntentFilter intentFilter = new IntentFilter(); 

//步骤2:实例化LocalBroadcastManager的实例
localBroadcastManager = LocalBroadcastManager.getInstance(this);

//步骤3:设置接收广播的类型 
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);

//步骤4:调用LocalBroadcastManager单一实例的registerReceiver()方法进行动态注册 
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);

//取消注册应用内广播接收器
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);

//发送应用内广播
Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
localBroadcastManager.sendBroadcast(intent);

粘性广播

注意事项

在onReceive(Context context, Intent intent)中context返回值不同:
①静态注册:返回的是ReceiverRestrictedContext
②全局广播的动态注册:返回的是ActivityContext
③应用内的动态注册(封装类):返回的是ApplicationContext
④应用内的动态注册(非封装类):返回的是ActivityContext

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔幻音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值