BroadcastReceiver
前言
本文通过学习官方文档学习,简单学习BroadReceiver的基本用法。主要通过一些简单的例子,BroadReceiver对象的方法去学习如何发送和接收广播。.
广播接收者
Android 应用与 Android 系统和其他 Android 应用之间可以相互收发广播消息,这与发布-订阅设计模式相似。这些广播会在所关注的事件发生时发送。举例来说,Android 系统会在发生各种系统事件时发送广播,例如系统启动或设备开始充电时。再比如,应用可以发送自定义广播来通知其他应用它们可能感兴趣的事件(例如,一些新数据已下载)。
应用可以注册接收特定的广播。广播发出后,系统会自动将广播传送给同意接收这种广播的应用。
一般来说,广播可作为跨应用和普通用户流之外的消息传递系统。但是,您必须小心,不要滥用在后台响应广播和运行作业的机会,因为这会导致系统变慢。
简而言之:就像收音机一样,广播发送者就像电台125.25频率的电台,广播接收者就是收听125.25频道的司机。
一些例子
动态注册广播:registerReceiver(Receiver,IntentFilter)
监听电量变化
由于我们监听是系统的广播,所以我们已经知道了电台的频道号。现在我需要接收电台的信息,接收到信息后做相应的处理操作。
第一步需要一个收音机声明广播接收者类:继承BroadcastReceiver实现onReceiver方法,(上下文,Intent传递数据)
第二步需要收听的频道:new IntentFilter();
intentfilter.addAction(Intent.ACTION_BARTERY_LOW)
电量由三个,changed ,low 和
第三步注册广播:this.registerReceiver(Receiver,intentfilter);
在第一步的接收器(收音机测试数据变化。)通过Intent获取相关的数据。
Action:change通过BatteryManager看里面所可以获取的数据。通过intent.getExtra(key);
最后一步:在onDestory方法:
调用unregisterReceiver();防止内存泄漏;
监听USB线拨出以及插入
registerReceiver(Receiver,intentfilter);
第一步:继承BroadcastReceiver实现onReceiver方法,(上下文,Intent传递数据)
第二步需要收听的频道:new IntentFilter();
intentfilter.addAction(Intent.ACTION_POWER_CONNECTION).
intentfilter.addAction(Intent.ACTION_POWER_DISCONNECTION).
第三步注册广播:this.registerReceiver(Receiver,intentfilter);
第四步:通过判断onReceiver方法中intent.getAction值,来对不同的action做逻辑处理.
广播分类
有序广播和无序广播.
广播注册方式
静态注册和动态注册
动态注册广播
主要有:registReceiver(Receiver,IntentFilter);
在Receiver对收到的数据进行处理
在onDestory方法中解绑Receiver防止内存泄漏.
静态注册广播监听关机
静态注册:比较耗费资源,一直都在监听着.
主要步骤:
- 继承BroadcastReceiver
- 在manifest中静态注册Receiver并且设置IntentFilter, ;
3.需要权限获取开机权限
监听应用安装与下载
- 继承BroadcastReceiver
- 静态注册 intentFilter中action:PACKAGE_REMOVE,PACKAGE_ADD.data:shceme="package"用于过滤信息
- 在Receiver,通过intent获取Action.判断remove和add来处理卸载和安装的逻辑.intent.getData();查看详情.在根据信息做String.replace.
自定义广播
sendBroadcast(intent);
- new Intent(); intent.setAction(“包名.大写名字”);
- 设置数据,intent.putExtra(key,value);
- sendBroadcast(intent);
广播接收者;intentfilter:action=“包名.大写名字”
onReceiver中intent.getExtra(key)获取数据
有序广播
无序广播:一发出来,所有人都能监听到不能阻止.所有人都能就监听.
有序广播:1.有序2.可以终止往下传递,3.可以修改广播内容
有序
步骤一:
intent.setAction(“包名.大写名字”)
sendOrderBroadcast(intent,receiverPremission);
步骤二:
创建3个Receiver:
intent-filter的属性priority=“数值” 数值优先级:-1000-1000
intent-filter的方法: action=“包名.大写名字”
步骤三:
设置3个不同优先级的priority:1000,500,200
在三个Receiver中:onReceiver中对数据进行处理.
终止往下传达
在高优先级的Receiver中,
在onReceiver方法中,abortBroadcast();
修改广播内容
Bundle.putCharSequence(“content”,value);
sendOrderBroadcast(intent,null,null,null,Activity.RESULT_OK,null,Bundle);
(intent,接受权限,resultReceiver,Handler,初始码,用于数据传递,封装数据)
resultReceiver:广播接收者最终接收者,用于检查数据是否传达和数据是否修改.
handler:上面接收者的回调.
初始码:结果码,根据结果码
用于传递数据:这个数据在各个Receiver
Bundle:用于封装数据
在Intent的获取数据 getResultExtras;返回Bundle对象
resultExtra的getCharSequence(“content”).toString;
修改内容:
resultExtra的putCharSequence(“content”,value);
setResultExtras(resultExtras);
广播权限
广播权限谁可以接收到我的广播:
第一步: 定义权限:
第二步:先构建
sendOrderBroadcast(intent,Manifest.permission.大写权限)
在先的App中要收到该广播必须声明该权限.
注册广播, 意图过滤action.
广播接收者谁可以给我发权限
第一步: 定义权限:
第二步:在Receiver中实现Permission接收,静态注册中,在receiver android:permission=“包名.大写权限”;
在发送广播中的必须声明权限
才能够发送广播