IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 安卓四大组件:BroadCastReceiver -> 正文阅读

[移动开发]安卓四大组件: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

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-07-05 23:36:33  更:2022-07-05 23:37:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 2:53:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码