在安卓开发中,broadcast是一种APP直接传输信息的机制。它是对广播进行过滤并接受响应的一类组件。它可以运用于接收广播intent,广播intent发送通过调用sendbroadcast/sendorderedBroadcast来实现。通常一个广播intent可以被订阅此intent的多个广播接收者所接收。
比如我静态注册一个SDcardunmountedreceiver的广播代码如下:
在清单文件中声明<receiver>,需要在其中配置<intent--filter>指定接收广播的动作action
或者动态注册,在JAVA代码中注册:
两种注册的区别:代码注册也就是动态注册,它不是一个常驻的广播,也就是说他的广播是跟随着程序的生命周期,一旦代码所在进程被杀死,广播接收者就失效。而在清单文件中注册的静态广播是常驻型,在当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。在平时我们手机中,需要启动一次才能接受到广播,它才会生效。
安卓中常见的广播
监听拨打电话广播
监听系统开机的广播,监听安装和卸载程序的广播,拦截短信等。
发送自定义广播
无序广播不可以被拦截,所有接收无序广播的广播接收者在此广播被发送时均能接收此广播,并且是同时接收。无序广播使用sendbroadcast方法来发送,核心代码如下:
这个intent的action可以是自定义的动作。那么接收者也要定义发送广播的意图动作。
注意:符合某广播条件的所有广播接收者的特点:无序、无优先级、不可中断、不可传递数据。
广播时可设置接收者权限,仅当接收者含有权限才能接收。
接收者的<receiver>也可以设置发送方权限,只接收含有权限应用的广播Receiver节点属性
发送广播是,通过intent.setFlag(intent.flag_include_stopped_packeages),包含从未启动过的程序,这样的设置,可以让从未启动的接收者也收到广播。
有序广播
有序广播可以被拦截或者添加数据,优先级高的接收者可以拦截低优先级,使用abortBroadcast,添加数据:通过bundle传递。前面的接收者可以将数据通过setResultExtras(Bundle)方法存进结果对象,然后传递给下一个接收者,下一个接收者通过代码:Bundle bundle = getResultExtras(true)可以获取上一个接收者存入在结果对象中的数据。
谷歌规定的优先级是1000~~负1000,系统默认优先级是0。
粘性广播(sendstickBroadcast),号称是阴魂不散的广播,它会一直等待intent指定的事件处理完毕才会消失。他需要API的权限BROADCAST_STICKY。它不会像普通广播那样10秒钟以后就会被干掉。
注意一些细节问题:
1.广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
2.广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
3.最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
4.耗时的较长的工作最好放在服务中完成