Android四大组件之BroadcastReceiver
导读
- 移动开发知识体系总章(Java基础、Android、Flutter)
- Android四大组件之Activity
- Android四大组件之Service
- Android四大组件之ContentProvider
- BroadcastReceiver简介
- 注册方式
- Android 8.0静态注册有什么变化
- 广播的优先级
- 广播的类别
BroadcastReceiver简介
BroadcastReceiver(广播接收器)是Android四大组件之一,通过广播的方式进行消息传递,其本质是一个全局的监听器,可以监听到各种广播,可以用来实现不同组件之间的通信。广播最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的,通过这样的形式来达到接、收双方的完全解耦合。
广播接收者:
public class MyReceivre extends BroadcastReceiver{
// 复写onReceive()方法,接收到广播后,则自动调用该方法
@Override
public void onReceive(Context context, Intent intent) {
//写入接收广播后的操作
}
}
注册方式
静态注册(AndroidManifest.xml注册广播并添加接收的广播)
在配置文件中注册的接收者的特点是即使应用程序已被关闭,该接收者依然可接受它感兴趣的广播,比如手机电池电量的广播接收者,没有必要将某个程序开启。
<receiver android:name=".MyReceivre">
<intent-filter>
<!--屏幕被打开之后的广播-->
<action android:name="android.intent.action.ACTION_SCREEN_ON"/>
</intent-filter>
</receiver>
动态注册广播
在Activity中绑定接收者必须依附该应用程序存在,或者一个BroadcastReceiver用于更新UI,就没有必要再程序关闭时接收者还运行,故无需在AndroidManifest.xml中注册而可以放在Activity/Service中注册。
对于动态广播,有注册就必然得有注销,否则会导致内存泄露,重复注册、重复注销也不允许。
public class MainActivity extends AppCompatActivity {
private MyReceivre mMyReceivre;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.实例化BroadcastReceiver子类 & IntentFilter
mMyReceivre = new MyReceivre();
IntentFilter intentFilter = new IntentFilter();
//2.设置接收广播的类型
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
//3.动态注册:调用Context的registerReceiver()方法
registerReceiver(mMyReceivre, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//销毁在onDestroy()方法中的广播
unregisterReceiver(mMyReceivre);
}
}
Android 8.0静态注册有什么变化
在Android 8.0(API级别26)的平台上,应用不能对大部分的广播进行静态注册,也就是说,不能在AndroidManifest文件对有些广播进行静态注册,这里必须强调是有些广播,因为有些广播还是能够注册的。比如,经过楼主测试,对接收Android 开机的广播通过静态注册还是能够正常接收的。
相关链接https://developer.android.google.cn/about/versions/oreo/android-8.0
广播的优先级
添加优先级取值范围:-1000到1000,优先级越大就优先接收到广播
静态设置:<intent-filter android:priority="100">
动态设置:filter.setPriority(100);
广播的类别
- 普通广播(Normal Broadcast)
- 有序广播(Ordered Broadcast)
- 粘性广播(Sticky Broadcast)
- 系统广播(System Broadcast)
- 本地广播(Local Broadcast)
普通/无序 广播(Normal Broadcast)
这种广播完全是异步的,所有与广播Intent匹配的BroadcastReceiver,都可以收到这条广播,并且不分先后顺序,视为同时收到,通过Context.sendBroadcast()方法发送。这种广播的效率比较高,但缺点是接收器不能将处理结果传递给下一个接收器,并且无法在中途终止广播。
Intent intent = new Intent();
//对应BroadcastReceiver中intentFilter的action
intent.setAction("test");
//发送广播
sendBroadcast(intent);
有序广播(Ordered Broadcast)
这是一种同步执行的广播,通过Context.sendOrderedBroadcast()方法发送,这种广播发出后,通过receiver的intent-filter中的android:priority属性来设置优先级,优先级从-1000~1000,数越大,优先级越高,使用setResult()方法把结果传递给下一个接收者,通过getResult()方法获取上一个接收者传递过来的结果,并可以通过abortBroadcast()方法丢弃该广播,使该广播不再传递给下一个接收者。
粘性广播(Sticky Broadcast)
粘性广播通过Context.sendStickBroadcast()方法来发送,用此方法发送的广播会一直滞留,当有匹配此广播的接收器被注册后,该广播接收器就会收到此广播。使用此广播时,需要获得BROADCAST_STICKY权限。(在 android 5.0/api 21后不再推荐使用)
系统广播(System Broadcast)
Android系统中内置了多个系统广播,只要涉及到手机的基本操作,基本上都会发出相应的系统广播。如:开启启动,网络状态改变,拍照,屏幕关闭与开启,点亮不足等等。每个系统广播都具有特定的intent-filter,其中主要包括具体的action,系统广播发出后,将被相应的BroadcastReceiver接收。系统广播在系统内部当特定事件发生时,有系统自动发出。
本地广播(Local Broadcast)
以上广播都属于全局广播,发出去的广播,只要有匹配的接收者,就可以收到广播。这样一来会造成一些问题,一是消耗性能,二是容易引起安全性的问题,为了能够简单的解决这方面的问题,Android引入了一套广播本地广播机制,使用该机制发出的广播只能够在本应用内部进行传递,并且广播接收器也只能接收来自本应用发出的广播。