广播收器注册一共两种形式 :静态注册和动态注册
1 广播的定义
用于程序之间传消息的机制
3、Anroid为什么要这样设计?
大大减少开发工作量和开发周期
作为开发者,只需要掌握BroadcastReceiver
普通广播 (Normal broadcast)
- 所有监听该广播接受者都可以监听到该广播
- 同级别接收先后顺序是随机的(无序)
- 级别低的后收到广播
- 接收器不能截断广播的继续传播,也不能处理广播
- 同级别动态注册高于静态注册
有序广播 (Oredered broadcast)
- 按照接收者的优先顺序来接收广播,优先级别在intent-filter中的priority中声明,-1000到1000之间,值越大优先级越高,可以终止广播的继续传播,接受者可以修改intent的内容。
- 同级别接收顺序是随机的
- 级别低的后收到
- 能截断广播的继续传播,高级别的广播接收器接收广播后能决定时候截断。
- 能处理广播
- 同级别动态注册高于静态注册
异步广播 (粘滞性滞留广播) ps:已被弃用
- 不能处理结果给下一个接收者,无法终止广播。
- 一直存在
- 可以先发送广播,再注册接收器
- 需要在清单文件添加android.permission.BROADCAST_STICKY权限
BroadReceiver生命周期只有十秒左右,不能直接执行耗时操作,不然会出现ANR(应用程序无响应),也不能用子线程来做,因为每次广播来的时候都会创建一个Reveiver对象,并且调用onReceiver,执行完之后 ,对象会立刻被销毁,子线程也没了
要做耗时操作的话,应该通过发送Intent给Service,由Service来完成。
动态注册广播接受者的话要在Destory回调事件进行unregister
两者及接收广播的区别:
1 动态注册的广播要快于静态注册的广播,不管注册还是的优先级设置多高 不管动态的优先级有多低
2 动态的广播不是常驻广播 ,也就是说国安博跟着activity的生命周期 注意在activity结束前移除广播接收器
静态注册是常驻行 也就是说关闭程序后 如果信息广播来随actitivity 的生命周期。注意:在 activity 结束前 移除广播接收器。
3 在同一个优先级下,谁先启动的快,谁将先接收到广播
动态的注册代码:
UpdateBroadcast broadcast=new UpdateBroadcast();
IntentFilter filter=new IntntFileter(com。UntiUPdate“);
registerReceiver(broadcast,filter);
静态注册代码在配置文件中添加
常驻广播:
常驻型广播 当程序关闭时 如果有信息来 写的接受器一样能够接受到广播 他的注册方式就是在你的androidManifast。Xml 中进行注册 这种注册的方式成为静态的注册
1 系统启动广播
2.USER_PRESENT 等类型的广播,但是不一定有效,App打开的时候有效,(Android3.1 以后)
非常注型广播
当程序结束时 广播自然没了 在activity 中的oncreate 或者onresume 中的广接受者在 onDestory 中注销广播接受者 这样的你的广播接收就是非常型广播又叫动态的广播这种类型的广播的生命周期和Context保持一致。注意,注册时候对应的Context销毁的时候,需要对广播也进行unregist操作,避免内存溢出或者应用报错。
生存期,静态广播的生存期可以比动态广播的长很多,因为静态广播很多都是用来对系统时间进行监听,比如我们可以监听手机开机。而动态广播会随着context的终止而终止
优先级动态广播的优先级比静态广播高
动态广播无需在AndroidManifest.xml中声明即可直接使用,也即动态;而静态广播则需要,有时候还要在AndroidManifest.xml中加上一些权限的声明