一. 写一个接收器(onReceive
中处理逻辑)
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("MyReceiver", "收到了" + intent.getAction());
}
}
onReceive是主线程不要做耗时操作否则阻塞10s会ANR
二. 注册
两种方式:
1. 静态注册
Manifest里添加receiver
,标明action
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="kt.com.MyReceiver"/>
</intent-filter>
</receiver>
注册的是常驻型广播。从 Android8.0 开始,不再支持静态注册
2. 动态注册
在上下文中添加
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("kt.com.MyReceiver");
registerReceiver(new MyReceiver(),intentFilter);
注册的是非常驻型广播。在适当的时机调用 unregisterReceiver();
解除注册
三. 使用
发送广播(发送的内容放在 intent
内)
Intent intent = new Intent();
intent.setAction("kt.com.MyReceiver");
sendBroadcast(intent);
富强民主文明和谐 自由平等公正法治 爱国敬业诚信友善
广播类型
1. 默认广播:context.sendBroadcast();
对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。
2. 有序广播:context.sendOrderedBroadcast();
每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播。
静态注册时<intent-filter>
中使用android:priority
属性,或者动态注册使用filter.setPriority();
数值越大,优先级越高。
在BroadcastReceiver
中使用setResultExtras
方法将一个Bundle对象设置为结果集对象,传递到下一个接收者那里,这样优先级低的接收者可以用getResuttExtras
获取到最新的经过处理的信息集合。
使用sendOrderedBroadcast方法发送有序广播时,需要一个权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null则表示接收者若要接收此广播,需声明指定权限。这样做是从安全角度考虑的,例如系统的短信就是有序广播的形式,一个应用可能是具有拦截垃圾短信的功能,当短信到来时它可以先接受到短信广播,必要时终止广播传递,这样的软件就必须声明接收短信的权限。
接收优先级
1. 默认广播:无视优先级,动态注册优先于静态注册接收。(同优先级:动态:按照注册顺序;静态:按照扫描顺序)
2. 有序广播:无视动态注册还是静态注册,全部由优先级决定。(同优先级:动态先于静态)