1. 生命周期长短的比较:
广播的生命周期是非常短的(通常我们说的10S限制),当发送之后intent会到AndroidManifest.xml文件中找是不是有匹配的action,如果有就会调用Receiver ,然后获得Receiver 对象,再执行重载的onReceive方法,这时候Receiver对象就没有用了,垃圾回收期不定期的回收相应资源,当我们再次点击按钮的时候就会重新获得对象,这就是BroadcastReceiver的生命周期.
由于以上原因,所以我们在使用BroadcastReceiver的时候,不能在BroadcastReceiver里做一些比较耗时的操作,否侧会弹ANR(Application Not Response)的对话框.这对于android开发绝对是不允许的。
如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成.这里不能使用子线程来解决,原因主要是: BroadcastReceiver的生命周期很短,子线程可能还没有结束,BroadcastReceiver就先结束了.BroadcastReceiver一旦结束,此时BroadcastReceiver的所在进程很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程).如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死.所以采用子线程来解决是不可靠的.
2. 广播分几种?他们有什么区别?
1. 普通广播:Context.sendBroadcast()
这种广播是无序的,也就是我们只管发出广播,不管接受的先后顺序。就像邮件发送一样,把要邮寄的邮件统一处理,然后全部发出去,不用管接收方的接受顺序。
2. 有序广播: Context.sendOrderedBroadcast()
这种广播可以在xml 或者java文件中设计广播的优先级。然后优先级高的首先接受广播,然后优先级高的可以填充数据给后面的广播接收者,同时也可以cancel广播,这样的话,后面的接收者就不能接受广播。这类似于防火墙和窃听器的原理。
3, 两种注册BroadcastReceiver的方法?
android 有两种注册广播的方法;一种是在androidmanifext.xml文件中 注册。另一种是在java文件中注册。各有利弊,只能说在了解区别的基础上为我所用。
区别:
第一种在XML文件中注册的广播属于常驻行的。也就是说隶属的应用程序关闭的时候,这个广播是依然存在的,可以接收广播消息的。
第二种在java代码中注册的广播,很好的解决了在xml文件中注册时遇到的问题,就是在程序不需要接收广播的时候,依然没有退出。体现出很好的灵活性,同时也提高了整个手机的资源浪费。
4, 广播发送方和接收方两种的制约:
1.使用环境:当发送方要求接收方有某种权限的时候,才能接收自己发送的消息。简单的说,就是接收方不仅要有相应的action匹配,还要有接收方申明的权限。使用如下:
/**
* 发送广播,指定接收者权限
*sendBroadcast(i, "com.iteye.permission.receiver");//指定接收者权限
*/
public voidsendBroadcast() {
//隐式意图,发送广播
Intent i = new Intent();
i.setAction("com.iteye.receiver.action");
i.putExtra("name", "tom");
this.sendBroadcast(i, " com.iteye.permission.receiver ");
Log.i("Other",".send ok!");
}
在清单文件里receiver必须有这个权限才能收到广播。
首先,需要定义权限:<permissionandroid:name=" com.iteye.permission.receiver " />
然后,声明权限:<uses-permissionandroid:name=" com.iteye.permission.receiver " />
这时接收者就能收到发送的广播。
2. 使用环境:当接收方要求发送方具有某种权限的时候,这样的广播自己才接收。简单的说,就是要给我发广播,不仅要有匹配的action,还要有相应的权限。使用如下:
<!-- 注册广播接收者
android:permission:控制发送方需要具备指定权限,才接收其广播.
-->
<receiver android:name=".MyReceiver"android:permission="com.permission.sender">
<intent-filterandroid:priority="100">
<action android:name="com.iteye.receiver.action" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
即使过滤器匹配,如果发送方没有相应权限,接收者也不会接收其广播
5. 还有一种广播,叫粘性广播。
虽然这种广播我们不常用,但是这种广播可以解决BroadcastReceiver生命周期短的限制。比如普通广播在接受到消息10S没有处理结束的时候,系统会终止这样的处理。 而这种广播就是解决这个问题的,它会保存intent一直到消息处理结束。
总结:
以上就是我对广播的粗浅理解,有些功能虽然我们不用,但我们要知道有这个东西,这样等我们遇到相应问题的时候,就可以有解决问题的思路。很快找到解决方案。