Android四大组件Activity、Service、BroadcastReceiver、ContentProvide
三、BroadcastReceiver
1.什么是BroadcastReceiver
BroadcastReceiver组件的主要作用是消息的传递,该消息的传递可以在应用内,也可以在应用之间,它的角色是一个消息的传递者。是在组件之间传播数据的一种机制,这些组件可以位于不同的进程中,起到进程间通信的作用。
2.生命周期
1、BroadCastReceiver 的生命周期很短暂,当接收到广播的时候创建,当onReceive()方法结束后销毁
2、正因为BroadCastReceiver的声明周期很短暂,所以不要在广播接收器中去创建子线程做耗时的操作,因为广播接受者被销毁后,这个子进程就会成为空进程,很容易被杀死
3、因为BroadCastReceiver是运行在主线程的,所以不能直接在BroadCastReceiver中去做耗时的操作,否则就会出现ANR异常
最后建议:耗时的较长的工作最好放到Service中去完成
3.广播的两种注册方式
注册方式 | 使用方式 | 特点 | 应用场景 |
---|---|---|---|
静态注册(常驻广播)
|
在AndroidManifest中通过<receiver>标签声明 | 常驻,不受任何声明周期组件的影响应用程序关闭后,如果有信息广播来,程序依旧会被系统调用
|
需要时刻监听的广播 |
动态注册(非常驻广播)
|
Context.registerReceiver() | 灵活,跟随生命组件的周期变化(组件结束=广播结束 在组件结束前必须移除广播接收器)
|
需要特定时刻监听的广播 |
- 静态注册方式在应用安装时就被系统解析它的缺点是耗电、占内存
- 动态注册一定要在onDestroy()方法里面onRegisterReceiver这方法,否则你会引起内存泄漏
4. 广播有几种形式 ? 都有什么特点 ?
- 普通广播:开发者自身定义Intent的广播(最常用),所有的广播接收器几乎会在同一时刻接收到广播信息,接收的先后顺序随机
- 有序广播:发送出去的广播被广播接收者按照先后顺序接收,同一时刻只有一个广播接收器能够收到这条广播信息。当这个广播接收器中的逻辑处理完毕后,广播才会继续传递,且优先级(priority)高的广播接收器会优先收到广播消息。有序广播可以被接收器截断使得后面的接收器无法收到它。
- 本地广播:仅在自己的应用内发送接收广播,也就是只有自己的应用能收到,数据更加安全,效率更高因为它内部是通过Handler来实现广播的发送的,但只能采用动态注册的方式;
- 黏性广播:这种广播会一直滞留,当有匹配该广播的接收器被注册后,该接收器就会收到此条广播;
5.内部通信实现机制
1.自定义广播接收者BroadcastReceiver,并复用onRecvice()方法;
2.通过Binder机制向AMS(Activity Manager Service)进行注册;
3.广播发送者通过Binder机制向AMS发送广播;
4.AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到5.BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;
6.消息循环执行拿到此广播回调BroadcastReceiver中的onReceive()方法.
网友评论