关于Broadcast

前言

广播分类

标准广播:异步收发,所有的广播接收器几乎可以同时收到广播。
有序广播:同步收发,当上一个广播接收器处理逻辑之行完毕后才会继续传递给下一个广播接收器。这样上一个接收器就可以拦截广播,使其中断传递,或者篡改数据继续传递。

本地广播

前面所有广播都是系统全局广播,即发出的广播可以被其他任何应用程序接收到,并且我们也可以接收来自其他任何应用程序的广播。这样就很容易引起安全问题,比附说我们发送一些携带关键性数据的广播可能被其他应用程序所截获,或者其他应用程序不停地向我们的应用发各种垃圾信息。为了能简单地解决广播的安全性问题,android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收本应用的广播。只能动态注册。

LocalBroadcastManager.getInstance(this).registerReceiver(myBroadcastReceiver, inFilter);
LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.hdib.broadcast.TEST"));
LocalBroadcastManager.getInstance(this).unregisterReceiver(myBroadcastReceiver);

粘性广播

粘性广播在发送后就一直存在于系统的广播容器里面,等待对应的处理器去处理,如果暂时没有处理器处理这个消息则一直在广播容器里面处于等待状态,粘性广播的Receiver如果被销毁,那么下次重建时会自动接收到广播数据。
注意只能保存最后一次广播数据。
发布粘性广播需要权限:<uses-permission android:name="android.permission.BROADCAST_STICKY" />

已过时,官方不建议使用。

@deprecated Sticky broadcasts should not be used. They provide no security (anyone
can access them), no protection (anyone can modify them), and many other problems.
The recommended pattern is to use a non-sticky broadcast to report that something
has changed, with another mechanism for apps to retrieve the current value whenever
desired.

广播接收者(BroadcastReceiver)

接受来自各处的广播,广播接收者的 onReceive() 方法是在主线程中执行的。

一、简单使用

定义广播接受者

/**
 * 需要注意的是,Receiver被注册(包括静态和动态注册)了几次,就会有几个Receiver对象生成,同时也意味着同一个广播被接收几次。
 */
public class MyBroadcastReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {//这里intent也可以传递参数,但不能被篡改。
        Log.d("MyBroadcastReceiver", "onReceive: " + intent.getAction());
        Bundle bundle = getResultExtras(true); //获取可被篡改的参数
        if (isOrderedBroadcast()) {
        	//  篡改参数
            bundle.putString("KEY", "edf");
            setResult(Activity.RESULT_OK, "", bundle);

			//  中断广播
			//  abortBroadcast(); 
        }
    }
}

广播接受者动态注册和取消注册

//动态注册广播,一般在宿主的onCreate()方法中调用
IntentFilter infilter = new IntentFilter();//监听网络状态变化
infilter.addAction("com.hdib.broadcast.TEST");
mbr = new MyBroadcastReceiver();
registerReceiver(mbr, infilter);

//取消动态注册广播,一般在宿主的onDestroy()方法中调用
unregisterReceiver(mbr);

静态注册广播

// 静态注册
<receiver android:name=".receivers.BootCompletedReceiver"
	android:exported="true"
	android:enabled="true">
	<intent-filter>
	    <action android:name="com.hdib.broadcast.TEST"/>
	</intent-filter>
</receiver>

发送/中断广播

Intent intent = new Intent("com.hdib.broadcast.TEST");

sendBroadcast(intent); //发送无序广播,所有匹配的广播接收者都会收到广播

sendOrderedBroadcast(intent,null);//发送有序广播,第二个参数是权限,能接受该广播的接收者必须有相应权限,如无需权限传null即可。
sendOrderedBroadcast(intent, null, null, null, Activity.RESULT_OK, "", bundle);//发送有序广播,可以指定广播接收者,以及传递一些可被拦截篡改的参数bundle。

isOrderedBroadcast()//判断是否是有序广播
abortBroadcast()//中断有序广播,只有有序广播才能被中断否则抛异常
clearAbortBroadcast()//清除中断标识,也就是恢复广播

sendStickyBroadcast(new Intent("com.hdib.broadcast.TEST"));//发送粘性广播
sendStickyOrderedBroadcast(intent, null, null, null, Activity.RESULT_OK, "", bundle);//发送粘性有序广播
isInitialStickyBroadcast()//判断是否是粘性广播
context.removeStickyBroadcast(intent);//移除粘性广播

二、常见系统广播

广播名说明备注
Intent.ACTION_AIRPLANE_M关闭或打开飞行模式时的广播
Intent.ACTION_BATTERY_CH充电状态,或者电池的电量发生变化电荷级别改变,只能在代码注册
Intent.ACTION_BATTERY_LO电池电量低
Intent.ACTION_BATTERY_OK电池电量充足
Intent.ACTION_AIRPLANE_MODE_CHANGED关闭或打开飞行模
Intent.ACTION_BATTERY_CHANGED充电状态,或者电池的电量发生变化电荷级别改变,只能在代码注册
Intent.ACTION_BATTERY_LOW电池电量低
Intent.ACTION_BATTERY_OKAY电池电量充足从电池电量低变化到饱满时会发出广播
Intent.ACTION_BOOT_COMPLETED在系统启动完成后,这个动作被广播一次只有一次
Intent.ACTION_CAMERA_BUTTON按下照相时的拍照按键时发出的广播硬件按键
Intent.ACTION_CLOSE_SYSTEM_DIALOGS当屏幕超时进行锁屏时,当用户按下电源按钮,长按或短按(不管有没跳出话框),进行锁屏
Intent.ACTION_CONFIGURATION_CHANGED设备当前设置被改变时发出的广播界面语言,设备方向,等 请参考Configuration.java
Intent.ACTION_DATE_CHANGED设备日期发生改变时
Intent.ACTION_DEVICE_STORAGE_LOW设备内存不足时发出的广播此广播只能由系统使用,其它APP不可用
Intent.ACTION_DEVICE_STORAGE_OK设备内存从不足到充足时发出的广播此广播只能由系统使用,其它APP不可用
Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE移动APP完成之后,发出的广播移动是指:APP2SD
Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE正在移动APP时,发出的广播移动是指:APP2SD
Intent.ACTION_GTALK_SERVICE_CONNECTEDGtalk已建立连接时发出的广播
Intent.ACTION_GTALK_SERVICE_DISCONNECTEDGtalk已断开连接时发出的广播
Intent.ACTION_HEADSET_PLUG在耳机口上插入耳机时发出的广播
Intent.ACTION_INPUT_METHOD_CHANGED改变输入法时发出的广播
Intent.ACTION_LOCALE_CHANGED设备当前区域设置已更改时发出的广播
Intent.ACTION_MANAGE_PACKAGE_STORAGE表示用户和包管理所承认的低内存状态通知应该开始
Intent.ACTION_MEDIA_BAD_REMOVAL未正确移除SD卡扩展卡已经从SD卡插槽拔出,但是挂载点 (mount point) 还没解除 (unmount)
Intent.ACTION_MEDIA_BUTTON按下”Media Button” 按键时发出的广播有”Media Button” 按键的话(硬件按键)
Intent.ACTION_MEDIA_CHECKING插入外部储存装置比如SD卡时,系统会检验SD卡,此时发出的广播
Intent.ACTION_MEDIA_EJECT已拔掉外部大容量储存设备发出的广播不管有没有正确卸载
Intent.ACTION_MEDIA_MOUNTED插入SD卡并且已正确安装扩展介质被插入而且已经被挂载
Intent.ACTION_MEDIA_NOFS拓展介质存在,但使用不兼容FS(或为空)的路径安装点检查介质包含在Intent.mData领域
Intent.ACTION_MEDIA_REMOVED外部储存设备已被移除,扩展介质被移除不管有没正确卸载,都会发出此广播
Intent.ACTION_MEDIA_SCANNER_FINISHED已经扫描完介质的一个目录
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE请求媒体扫描仪扫描文件并将其添加到媒体数据库
Intent.ACTION_MEDIA_SCANNER_STARTED开始扫描介质的一个目录
Intent.ACTION_MEDIA_SHARED扩展介质的挂载被解除 (unmount)它已经作为 USB 大容量存储被共享
Intent.ACTION_PACKAGE_ADDED成功的安装APK数据包括包名(最新安装的包程序不能接收到这个广播)
Intent.ACTION_PACKAGE_CHANGED一个已存在的应用程序包已经改变包括包名
Intent.ACTION_PACKAGE_DATA_CLEARED清除一个应用程序的数据时发出的广播清除包程序不能接收到这个广播
Intent.ACTION_PACKAGE_INSTALL触发一个下载并且完成安装时发出的广播比如在电子市场里下载应用
Intent.ACTION_PACKAGE_REMOVED成功的删除某个APK之后发出的广播正在被安装的包程序不能接收到这个广播
Intent.ACTION_PACKAGE_REPLACED替换一个现有的安装包时发出的广播(不管现在安装的APP比之前的新还是旧)
Intent.ACTION_PACKAGE_RESTARTED用户重新开始一个包重新开始包程序不能接收到这个广播
Intent.ACTION_POWER_CONNECTED插上外部电源时发出的广播
Intent.ACTION_POWER_DISCONNECTED已断开外部电源连接时发出的广播
Intent.ACTION_REBOOT重启设备时的广播
Intent.ACTION_SCREEN_OFF屏幕被关闭之后的广播
Intent.ACTION_SCREEN_ON屏幕被打开之后的广播
Intent.ACTION_SHUTDOWN关闭系统时发出的广播
Intent.ACTION_TIMEZONE_CHANGED时区发生改变时发出的广播
Intent.ACTION_TIME_CHANGED时间被设置时发出的广播
Intent.ACTION_TIME_TICK当前时间已经变化(正常的时间流逝)每分钟都发送,只能通过来注册
Intent.ACTION_UID_REMOVED一个用户ID已经从系统中移除发出的广播
Intent.ACTION_UMS_CONNECTED设备已进入USB大容量储存状态时发出的广播
Intent.ACTION_UMS_DISCONNECTED设备已从USB大容量储存状态转为正常状态时发出的广播
Intent.ACTION_WALLPAPER_CHANGED设备墙纸已改变时发出的广播
Intent.ACTION_USER_PRESENT用户唤醒设备
Intent.ACTION_NEW_OUTGOING_CALL拨打电话

附:参考

官方文档
优快云 cc_want 博文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值