ChaoYoung 2012-02-02
广播接受者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用
Context.sendBroadcast(),Context.sendOrdereBroadcast()来实现。通过一个广播Intent可以被
订阅了此Intent的多个广播接受者所接收。这个特性跟JMS中的Topic消息接收者类似,
要实现一个广播接收者方法如下:
第一步:继承BroadcastReceiver,并重写onReceive()方法
第二步:订阅感兴趣的广播Intent,订阅方法有俩种:
第一种:使用代码订阅
IntentFilterfilter=newIntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiverreceiver=newIncomingSMSReceiver();
receiverReceiver(receiver,filter);
第二种:在androidManifest.xml文件中的<application>节点里进行订阅
<receiverandroid:name=".IncomingSMSReceiver">
<intent-filter>
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver><!-- 接受短信权限 --><uses-permission android:name="android.permission.SEND_SMS"/>
广播被分为俩种不同的类型,普通广播和有序广播,普通广播是完全异步的。可以在同一时刻被所有的接收者收到。
消息传递的效率比较高,但是缺点是:接收者不能将结果传递给下一个接收者。并且无法终止广播intent的传播。
然后有序广播是按照接收者申明的优先级别(申明在intent-filter元素的android:property属性中,数越大,
优先级别越高,取值范围-1000到1000,也可以调用IntentFilter对象的setProperty()进行设置).被接收者依次
接收广播,如:A的级别高于B,B的级别高于C,那么广播先传给A,在传给B,最后传给C,A得到广播后,可以在
广播里存入数据,当广播传给B时,B可以从广播中取出A存入的数据。Context.sendBroadcast();
发送的是普通广播,所有订阅者都有机会获得并进行处理。
Context.sendOrderBroadcast();
发送的有序广播接收电池电量变化广播Intent
<receiverandroid:name=".Myclass">
<intent-filter>
<actionandroid:name="android.intent.action.BATTERY_CHANGED"/>
</intent-filter>
</receiver>接收开机启动广播
<receiverandroid:name=".MyClass">
<intent-filter>
<actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
并且要进行权限的申明
<uses-premission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>在android中,程序的相应被活动管理器和窗口管理器这俩个系统服务所监视,当BroadcastReceiver在10秒
内没有执行完毕,android会认为该程序无响应,会弹出ANR(applicationNoresponse)对话框,所以
不执行耗时的工作