四大组件之广播
大纲
- 广播机制简介
- 广播接收器
- 广播发信器
- 接收系统广播
- 发送自定义广播
- 本地广播
#广播机制简介
Android 中的每个应用程序都可以对自己感兴趣的广播进行注册,注册了的广播发出广播消息后应用程序就会收到并执行自定义逻辑。
#广播接收器 需要注册
广播接收者简单地说就是接收广播意图的Java类,此Java类继承BroadcastReceiver类。
重写:public void onReceive(Context context,Intent intent)方法。其中 intent 可以获得传递的数据
广播意图
通过Context.sendBroadcast(Intent intent)或Context.sendOrderedBroadcast(Intent intent)发送的意图。
发信方在 Intent 设置
action="com.my_broadcast"
收信方在 AndroidManifest.xml中设置 也可以使用动态注册
<action android:name="com.my_broadcast"/>
通过设置的action值,发信方能够广播给所有满足条件的广播接收器
#广播发信器
通常广播发送方就是调用
Context.sendBroadcast()
,sendOrderedBroadcast
的程序。
通常广播发送方都是通过隐式意图,这样才能发送给多人。
##广播分类
-
标准广播
Normal broadcasts
:异步执行,广播发出后所有 接收器 几乎同时接收到广播信息,并同时执行 接收器的逻辑。标准广播无法截断。 -
有序广播
Ordered broadcasts
:同步执行,广播发出后同时只有一个 接收器 能接收到信息 按照优先级顺序最高1000
,当 接收器执行完逻辑 之后这条广播才会继续往下传递。可以截断。截断广播后,后续的广播接收器就接不到这条广播了
#接收系统广播接收广播需要注册
动态注册 IntentFilter
广播接收器的创建:继承 BroadcastReceiver 类并重写 onReceiver() 方法。
onReceiver() 方法:接收到广播后回调该方法。
##动态注册
注册广播:registerReceiver(BroadcastReceiver 广播接收器对象, intentFilter);
注销广播:unregisterReceiver(BroadcastReceiver 广播接收器对象);
// 想要接收什么广播就添加响应的 action
IntentFilter intentFilter = new IntentFilter("com.cheng.broadcast.MY_BROADCAST");
// 自定义广播接收器
MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
// 注册广播
registerReceiver(myBroadcastReceiver, intentFilter);
##静态注册
在
AndroidMainfest
文件中注册广播接收器
<application
...>
<receiver
android:name=".receiver.MyBroadcastReceiver"
android:enbled="true" // 是否启用这个广播接收器
android:exported="true" // 是否允许这个广播计算器接收外部程序发出的广播
>
<intent-filter
android:priority="100"> // 接收器的优先级
<action android:name="actionValue"/> // 监听的广播
</intent-filter>
</receiver>
</application>
#发送广播
##标准广播
发出:sendBroadcast(Intent intent);
##有序广播
发出:sendOrderedBroadcast(Intent intent, String 权限字符串
null即可
);
截断:abortBroadcast();
// 发出一条广播
Intent intent = new Intent("com.cheng.broadcast.MY_BROADCAST");
sendOrderedBroadcast(Intent intent, null);
#本地广播
本地广播只能在应用程序内部传递。
LocalBroadcastManager 类:本地广播管理器
注册/注销本地广播需要用到此类
localBroadcastManager.registerReceiver
(BroadcastReceiver 广播接收器对象, intentFilter):注册本地广播
localBroadcastManager.unregisterReceiver
(BroadcastReceiver 广播接收器对象):注销本地广播
##使用本地广播 动态注册 IntentFilter
...
// 获取管理器实例
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
// 注册广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.cheng.broadcast.MY_BROADCAST");
// 自定义广播接收器类 与系统广播接收器是一样的 用LocalBroadcastManager注册后就只能接收本地广播了
LocalReceiver localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter);
// 发送广播
Intent intent = new Intent("com.cheng.broadcast.MY_BROADCAST");
LocalBroadcastManager.sendBroadcast(intent);
#总结
广播发信器
调用Context.sendBroadcast()的程序
广播接收器
继承 BroadcastReceiver 类
接收到广播后执行:onReceiver() 方法
注册广播:registerReceiver(广播接收器, intentFilter);
注销广播:unregisterReceiver(广播接收器);
本地广播
LocalBroadcastManager 对象来注册与注销接收器
LocalBroadcastManager.getInstance(Context):获取实例
注意
onReceive方法必须在10秒内完成,如果没有完成,则抛'Application No Response'。
当广播接收者onReceive方法需要执行很长时间时,最好将此耗时工作通过Intent发送给Service,由Service完成。并且不能使用子线程解决,因为BroadcastReceiver是接收到广播后才创建的,并且生命周期很短,因此子线程可能在没有执行完就已经被杀死了。