BoardcastReceiver
1.两种广播类型
(1)按传播方式分类
标准广播:完全异步执行的广播,发出广播后,所有广播接收器几乎同时收到该广播通知
有序广播:同步执行的一种广播,发出广播后,同一时间只能有一个广播接收者能收到,当这个广播接收者的逻辑执行完后,才会传递到下一个接收者;当然,前面的接收者还可以阶段广播的传递,那么后续接收者就无法收到广播消息了。
(2)按传播范围分类
全局广播:当前App发出的广播其他App可收到,反之亦然
本地广播:发出的广播只能在App内部传播,而广播接收者也只能收到本应用发出的广播
2.两种注册广播的方式
动态注册:是在java代码中指定IntentFilter,然后添加不同的Action;动态添加的广播,一定要用unregisterReceiver让广播取消注册。
静态注册:动态注册需要在程序启动后才能接受广播,静态广播弥补了这个短板,在AndroidManifest文件中定义IntentReceiver就可以让整个程序在未启动的情况下就可以收到广播了。
3.发送广播
发送广播前,要先定义一个接收器(BroadcastReceiver),重写onReceive(),注册下;
(1)标准广播:sendBroadcast(intent)
(2)有序广播:sendOrderedBroadcast(intent,null)
可以在清单文件中的intent-filter中通过android:priority="100"设置优先级,值越大优先级越高,越先收到广播,而且还可以调用abortBroadcast拦截广播的继续传递,priority可选值为:-1000~1000之间。
4.本地广播
(1)核心用法:
使用LocalBroadcastManager来管理广播:
a.使用LocalBroadcastManager.getInstance()获得实例
b.调用~.registerReceiver()注册广播
c.调用~.sendBroadcast()发送广播
d.调用~.unregisterReceiver()取消注册
PS:本地广播无法通过静态注册方式来接受,相比起全局广播更加高效
(2)注意事项
a.在广播中启动Activity时需要为intent加入FLAG_ACTIVITY_NEW_TASK的标记,不然会报错,因为需要一个栈来存放新打开的Activity。
b.广播中弹出AlertDialog时需要设置对话框的类型为TYPE_SYSTEM_ALERT,不然是无法弹出的
5.广播和EventBus的区别
(1)广播的优缺点
优点:
a.同SDK的交互比较好,它可以直接获得Context和Intent
b.如果同Android交互,选择广播更便捷
缺点:
a.广播比较耗时间和空间
(2)EventBus的优缺点
优点:
a.灵活度高,不需要依赖Context
b.粘性事件能够保证,通知当时不在场时也能收到通知
c.父类对于通知的监听和处理能够继承给子类,可简化代码
d.通知的优先级,能够保证 Subscriber 关注最重要的通知
缺点:
a.不能跨进程通信,只能在应用内通信