1.简介
Android中的广播主要可以分为两种类型: 标准广播和有序广播
标准广播 (Normal broadcasts) 是一种完全异步执行的广播, 在广播发出之后, 所有的广播接收器几乎都会在同一时刻接收到这条广播消息,无序。广播效率高,无法被截断的。
有序广播 (Ordered broadcasts)则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。有先后顺序,优先级高的广播接收器就可以先收到广播消息,并且可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
2.注册方式
2.1 动态注册(在代码注册)
1.首先继承BroadcastReceiver实现一个监听器类(这里是在MainActivity中实现的内部类)实现onReceive方法,首先获得系统服务类(对哪方面进行监听),然后获得该服务类详细信息的实例,最后对这个实例的信息进行判断或其他操作
示例:首先通过getSystemService() 方法得到了ConnectivityManager 的实例,这是一个系统服务类,专门用于管理网络连接的。然后调用它的getActiveNetworkInfo() 方法得到NetworkInfo 的实例,接着调用NetworkInfo 的isAvailable() 方法判断是否存在网络
2.然后进行注册
首先创建消息过滤器,为其添加一个参数确定想要获取的消息类型
然后创建监听器实例,调用注册函数将监听器和消息过滤器作为参数传递进来
3.最后要注意在AndroidManifest.xml文件声明权限< uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2.2 静态注册监听
在AndroidManifest.xml中注册,开机就启动
- 首先创建一个新的接收器类,继承BroadcastReceiver,然后在注册表中进行注册,Exported 属性表示是否允许这个广播接收器接收本程序以外的广播, Enabled 属性表示是否启用这个广播接收器。
- Android系统启动之后会发出一条
android. intent. act ion. BOOT_ COMPLETED的广播,所以在过滤器< intent-filter>标签里面添加了相应的action
最后也要声明权限<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
OnReceive方法不能运行过长时间,因为不能开启线程
3.实现自定义广播
- 首先实现自定义广播的接收:创建接收器并且注册
- 然后实现广播的发送,设置按钮,按钮点击实现该功能
首先生成一个自定义的广播的实例,然后通过setBroadcast(intent)发送广播信息;其中setComponent方法是告诉系统谁接收广播,ComponentName有两个参数,第一个参数是目标广播接收器所在的包名,第二个参数是目标广播接收器具体路径。
如果发送的是有序广播,需要注意的是这应该是两个程序接收同一个程序发出来的广播
发送函数修改:sendOrderedBroadcast(intent,null);
接收顺序修改:
如果接收器的onReceive() 方法中调用了abortBroadcast() 方法, 就表示将这条广播截断, 后面的广播接收器将无法再接收到这条广播。
4.实现本地广播
该机制下广播只能在应用程序内部传递,接收器也只能接受本应用程序发出的广播
- 添加依赖LocalBroadcastManager
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0' - 动态注册接收器、设置点击事件、发送广播
首先是通过LocalBroadcastManager的getInstance()方法得到了它的一个实例,然后在注册广播接收器的时候调用的是LocalBroadcastManager的registerReceiver() 方法,在发送广播的时候调用的是LocalBroadcastManager的sendBroadcast() 方法 - 分析:
本地广播是无法通过静态注册的方式来接收的。因为静态注册主要就是为了让程序在未启动的情况下也能收到广播,而发送本地广播时,程序已经启动
可以明确地知道正在发送的广播不会离开目前的程序, 因此不必担心机密数据泄漏。
其他的程序无法将广播发送到程序的内部, 因此不需要担心会有安全漏洞的隐患。
发送本地广播比发送系统全局广播将会更加高效
5.实现粘性广播
实例
- 首先我们要确定一个所有活动的集合管理类ActivityCollector.java类
- 然后我们需要建一个所有活动的父类BaseActivity
- 接着我们需要完成登录活动的编写 也要完成activity_login.xml的编写
- 进入到主页,完成主页活动的编写以及xml文件的编写 设立按钮 实现发出广播操作
需要注意的是这里的广播发出和自定义广播有区别,暂时没整明白 备注代码部分 - 接收广播 我们为了避免在每个活动设置一个接收器 于是在父类BaseActivity中设置
需要保证只有处于栈顶的活动才能接收到这条强制下线广播,非栈顶的活动不应该也没有必要去接收这条广播,所以写在onResume() 和onPause()方法里解决注册和取消注册 - 最后检查注册表 确定主活动应该是登录活动LoginActivity 所有活动是否都已经注册