转载请注明出处:http://blog.csdn.net/zhouli_csdn/article/details/45645743
广播是一种广泛运用的在应用程序之间传输信息的机制 。而 BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件;BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知后, BroadcastReceiver 可以启动Activity 作为响应,或者通过 NotificationMananger 提醒用户,或者启动 Service 等等。
broadcastReceiver属性:
android:enabled="true",只有application和自身的这两个属性都为true,才可以被实例化。
android:exported="true",默认值依据是否有intent filters,有就为true,没有为false。
android:permissino,使用name属性指定权限
权限在manifesst中使用permission声明。例如:(权限声明部分摘录自:http://berdy.iteye.com/blog/1782854)
<permission android:description="string resource"
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permissionGroup="string"
android:protectionLevel=["normal" | "dangerous" |
"signature" | "signatureOrSystem"] />
android:description :对权限的描述,一般是两句话,第一句话描述这个权限所针对的操作,第二句话告诉用户授予app这个权限会带来的后果
android:label: 对权限的一个简短描述
android:name :权限的唯一标识,一般都是使用 报名加权限名
android:permissionGroup: 权限所属权限组的名称
android:protectionLevel: 权限的等级,
normal 是最低的等级,声明次权限的app,系统会默认授予次权限,不会提示用户
dangerous 权限对应的操作有安全风险,系统在安装声明此类权限的app时会提示用户
signature 权限表明的操作只针对使用同一个证书签名的app开放
signatureOrSystem 与signature类似,只是增加了rom中自带的app的声明
android:name 属性是必须的,其他的可选,未写的系统会指定默认值
两种注册方法:
系统注册:
< receiver android:name = ".MyBroadcastReceiver" > < intent-filter android:priority = "1000" > < action android:name = " android.provider.Telephony.SMS_RECEIVED" /> </ intent-filter > </ receiver >
代码注册:
IntentFilter filterB = new IntentFilter(); filterB.addAction("sendMyBroadcastReceiverB"); MyBroadcastReceiverB myBroadcastReceiverB = new MyBroadcastReceiverB(); this.registerReceiver(myBroadcastReceiverB, filterB);
andorid broadcast类型:
sendBroadcast:发送普通广播,广播发送后所有接收者以不同的顺序运行,通常在同一时刻。
在有些情况下,例如那些需要创建一个进程的广播,只有一个会被执行避免系统因为创建进程负载。
sendOrderedBroadcast:一次只有一个广播在执行,可以给下一个广播提供一个结果或者终止广播继续传递。可以通过android:priority控制广播的顺序,相同优先级的广播的执行顺序不确定。
sendStickyBroadcast:粘性广播,发出后系统会保留最后一次发送的intnet,在有广播注册后可以立即收到广播,且会一直存在。(退出发送广播的应用也会存在)
1):相同的intent,系统只会保留最后一次
2):不同的intent,可以一起存在。
安全:
1)确保intent actions和其它的条件是唯一的,否则会冲突
2)使用registerReceiver(BroadcastReceiver, IntentFilter),任何其它应用都可以给它发送广播
3)当你在manifest中注册广播,其它任何应用都可以给它发送广播,使用android:exported="false"阻止。
4)sendBroadcast(Intent),任何其它应用都可以收到广播,可以通过权限控制。从ICE_CREAM_SANDWICH开始,可以设置Intent.setPackage发给一个应用。
使用LocalBroadcastManager不会发生上述问题,因为他不会将intent广播出当前进程
可以使用sendBroadcast(Intent, String)或者sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle)指定权限,只有那么在manifest中注册了permission的receiver可以收到广播。
广播生命周期:
一个正在执行广播的onRecieve的方法的进程会被认为是前台进程。一旦从onReveieve返回,就和其他运行在进程中的组件优先级相同。
onReceieve方法:
通常运行在UI线程,除非指定registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)是它运行在其它线程。当广播运行在主线程的时候,不能在onReceieve方法执行超过10s的操作。也不能在里面弹出对话框。
应用场景暂略。