本篇根据郭大神的《第一行代码》而来, 建议初学者买本看看.
一.广播的类型
- 标准广播
- 有序广播
区别 | |||
---|---|---|---|
标准广播 | 异步 | 无序 | 无法截断 |
有序广播 | 同步 | 有序 | 可截断 |
二.广播接收器的注册方式
在代码中注册 (又称动态注册)
- 定义内部类,继承BroadcastReceiver,并重写onReceiver();当接收到广播时onReceiver()方法会被调用.
- 创建过滤器(IntentFilter)实例,并调用addAction(String actionName)方法设置action属性;actionName可以是任意字符串.
- 调用Context.registerReceiver(BroadcastReceiver receiver, IntentFilter intentFilter);
在AndroidManifest.xml文件中注册 (又称静态注册)
- 定义内部类,继承BroadcastReceiver,并重写onReceiver();当接收到广播时onReceiver()方法会被调用.
- 在AndroidManifest.xml文件中注册广播和拦截器
<receiver android:name=".BootCompleteReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
两种注册方式的优点和缺点:动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大的优势,但是它也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的。而静态注册的方式可以让程序在未启动的情况下就能接收到广播。
三.发送广播
- 发送标准广播
sendBroadcast(Intent intentName); 发送有序广播
sendOrderedBroadcast(Intent intent, String receiverPermission);设定广播接收器的先后顺序
在广播注册的时候设定过滤器的android:priority属性设置广播接收器的优先级,优先级比较高的广播接收器可以先收到广播广播截断
在onReceiver()方法中调用abortBroadcast();方法可以终止广播传递
四.发送本地广播 (LocalBroadcastManager)
什么是本地广播?
之前发送的都是属于系统全局广播,即发出的广播可以被其他任何应用程序接收到;这样广播中的数据有可能被其他程序截获.为了能够解决广播的安全性问题.Android引用了一套本地广播机制.
本地广播和标准广播的区别就是本地广播的操作都是调用LocalBroadcastManager中的方法,而标准广播是调用的Context中的方法.注册本地广播
//获取LocalBroadcastManager实例
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
// 广播过滤器
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
// 广播接收者
localReceiver = new LocalReceiver();
// 注册本地广播监听器
localBroadcastManager.registerReceiver(localReceiver, intentFilter);
- 发送本地广播
// 发送本地广播
localBroadcastManager.sendBroadcast(intent);
- 销毁本地广播
// 本地广播销毁
localBroadcastManager.unregisterReceiver(localReceiver);
注意:
广播注册后记得调用Context.unregisterReceiver(BroadcastReceiver receiver)
取消广播