Android四大组件之Broadcast Receiver

一.定义

用来接收系统和应用的广播,并作出相应的处理,比如Wifi打开后,提示用户wifi已经打开.

二.定义广播接受者

1 静态注册广播

(1) 静态注册广播

a. 定义类继承BroadcastReceiver,重写onReceiver方法

b. 清单文件中声明<receiver>,需要在其中配置<intent-filter>指定接收广播的动作

c. 当接收到匹配广播之后就会执行onReceive方法.

d. BroadcastReceiver 的优先级

	priority = 2147483647 (最高级)
			   0    	  (最低级)

注意事项

a.Android在 8.0系统后,大部分静态广播在清单文件中注册是接受不到广播了,需要指定广播的包名和类名.

- 用动态广播代替静态广播
- 保留原来的静态广播, 但是加入 Component 参数.
eg:
	        Intent intent = new Intent();
            intent.setAction(ACTION);
            //pkg 是指当前这个app的包名, cls 是指需要打开的receiver的完整路径
            intent.setComponent(new ComponentName("lxx.demo.testone","lxx.demo.testone.broadcast.MyReceiver"));
            sendBroadcast(intent);
			- 第一个参数  是指当前应用的包名
			- 第二个参数  当前receiver的完整path名

(2) 动态注册广播

a. 在代码中声明, 使用registerReceiver方法注册Receiver

b. 要记得 注销广播 register和unregister是对应的
(不回收的化可能会导致内存溢出)

三. 发送广播

无序广播

- 使用sendBroadcast方法发送

- 被所有广播接收者接收,无序,不可中断

- 广播时可设置接收者权限,仅当接收者含有权限才能接收

- 接收者的<receiver>也可设置发送方权限,只接收含有权限应用的广播

无序广播发送方法

void sendBroadcast (Intent intent, String receiverPermission)

intent 传给接受者的意图
permission 接受者必须拥有的权限,没有要求就为null.

有序广播

- 使用sendOrderedBroadcast方法发送

- 接收者可以在<intent-filter>中定义android:priority定义优先级,数字越大优先级越高

- 被各个广播接收者逐个接收,中途可以中断或者添加数据

有序广播发送方法

void sendOrderedBroadcast (Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)

例子:

`Intent intent = new Intent("com.top.broadcast.TEST");         // 创建意图对象, 设置广播的动作
intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); // 广播是否启动那些没有启动过的应用
intent.putExtra("data", "最初的数据!!!");                                  // 这里的数据不会被修改
Bundle bundle = new Bundle();
bundle.putString("name", "张三");
sendOrderedBroadcast(intent, "com.top.permission.BROADCAST", new ResultReciever(), null, 1, "MainActivity", bundle);`

Android 8.0 上不限制的隐式广播

/**
开机广播
Intent.ACTION_LOCKED_BOOT_COMPLETED
Intent.ACTION_BOOT_COMPLETED
*/
“保留原因:这些广播只在首次启动时发送一次,并且许多应用都需要接收此广播以便进行作业、闹铃等事项的安排。”

/**
增删用户
Intent.ACTION_USER_INITIALIZE
“android.intent.action.USER_ADDED”
“android.intent.action.USER_REMOVED”
*/
“保留原因:这些广播只有拥有特定系统权限的app才能监听,因此大多数正常应用都无法接收它们。”

/**
时区、ALARM变化
“android.intent.action.TIME_SET”
Intent.ACTION_TIMEZONE_CHANGED
AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED
*/
“保留原因:时钟应用可能需要接收这些广播,以便在时间或时区变化时更新闹铃”

/**
语言区域变化
Intent.ACTION_LOCALE_CHANGED
*/
“保留原因:只在语言区域发生变化时发送,并不频繁。 应用可能需要在语言区域发生变化时更新其数据。”

/**
Usb相关
UsbManager.ACTION_USB_ACCESSORY_ATTACHED
UsbManager.ACTION_USB_ACCESSORY_DETACHED
UsbManager.ACTION_USB_DEVICE_ATTACHED
UsbManager.ACTION_USB_DEVICE_DETACHED
*/
“保留原因:如果应用需要了解这些 USB 相关事件的信息,目前尚未找到能够替代注册广播的可行方案”

/**
蓝牙状态相关
BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED
BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED
BluetoothDevice.ACTION_ACL_CONNECTED
BluetoothDevice.ACTION_ACL_DISCONNECTED
*/
“保留原因:应用接收这些蓝牙事件的广播时不太可能会影响用户体验”

/**
Telephony相关
CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED
TelephonyIntents.ACTION_*_SUBSCRIPTION_CHANGED
TelephonyIntents.SECRET_CODE_ACTION
TelephonyManager.ACTION_PHONE_STATE_CHANGED
TelecomManager.ACTION_PHONE_ACCOUNT_REGISTERED
TelecomManager.ACTION_PHONE_ACCOUNT_UNREGISTERED
*/
“保留原因:设备制造商 (OEM) 电话应用可能需要接收这些广播”

/**
账号相关
AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION
*/
“保留原因:一些应用需要了解登录帐号的变化,以便为新帐号和变化的帐号设置计划操作”

/**
应用数据清除
Intent.ACTION_PACKAGE_DATA_CLEARED
*/
“保留原因:只在用户显式地从 Settings 清除其数据时发送,因此广播接收器不太可能严重影响用户体验”

/**
软件包被移除
Intent.ACTION_PACKAGE_FULLY_REMOVED
*/
“保留原因:一些应用可能需要在另一软件包被移除时更新其存储的数据;对于这些应用,尚未找到能够替代注册此广播的可行方案”

/**
外拨电话
Intent.ACTION_NEW_OUTGOING_CALL
*/
“保留原因:执行操作来响应用户打电话行为的应用需要接收此广播”

/**
当设备所有者被设置、改变或清除时发出
DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED
*/
“保留原因:此广播发送得不是很频繁;一些应用需要接收它,以便知晓设备的安全状态发生了变化”

/**
日历相关
CalendarContract.ACTION_EVENT_REMINDER
*/
“保留原因:由日历provider发送,用于向日历应用发布事件提醒。因为日历provider不清楚日历应用是什么,所以此广播必须是隐式广播。”

/**
安装或移除存储相关广播
Intent.ACTION_MEDIA_MOUNTED
Intent.ACTION_MEDIA_CHECKING
Intent.ACTION_MEDIA_EJECT
Intent.ACTION_MEDIA_UNMOUNTED
Intent.ACTION_MEDIA_UNMOUNTABLE
Intent.ACTION_MEDIA_REMOVED
Intent.ACTION_MEDIA_BAD_REMOVAL
*/
“保留原因:这些广播是作为用户与设备进行物理交互的结果:安装或移除存储卷或当启动初始化时(当可用卷被装载)的一部分发送的,因此它们不是很常见,并且通常是在用户的掌控下”

/**
短信、WAP PUSH相关
Telephony.Sms.Intents.SMS_RECEIVED_ACTION
Telephony.Sms.Intents.WAP_PUSH_RECEIVED_ACTION

注意:需要申请以下权限才可以接收
“android.permission.RECEIVE_SMS”
“android.permission.RECEIVE_WAP_PUSH”
*/
“保留原因:SMS短信应用需要接收这些广播”

    原文作者:消失的小尾巴刀
    原文地址: https://blog.csdn.net/qq_36252044/article/details/86636702
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞