«

android broadcast

时间:2024-3-2 17:33     作者:韩俊     分类: Android


转载请注明出处: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的操作。也不能在里面弹出对话框。


应用场景暂略。








标签: android

热门推荐