Android中BroadcastReceiver
1、? BroadcastReceiver(廣播接受者)
該組件接受被廣播的intent,Context可以通過sendBroadcast()和sendOrderedBroadcast()方法實(shí)現(xiàn)廣播。
public class IncomingSMSReceiver extends BroadcastReceiver{
???????? public void onReceiver(Context context,Intent intent){
?
}
}
注冊(cè)接收者
編程式((意圖action name))
Filter = new IntentFilter(“android.provider.Telephony.SMS_RECEIVED”);
IncomingSMSReceiver receiver = new IcomingSMSReceiver();
registerReceiver(receiver,filter);
聲明式
???????? <receiver android:name=”.IncomingSMSReceiver”
//要發(fā)送者具有該權(quán)限
Android:permission=”cn.android.permission.customer”
>?
?????????????????? <intent-filter>
??????????????????????????? <action android:name=”android.provider.Telephony.SMS_RECEIVED”></action>
</intent-filter>
</receiver>
?
ctx.sendBroadcast(intent,”接受者必須具有的權(quán)限串”);
?
手機(jī)收到短信后,android系統(tǒng)會(huì)廣播一個(gè)意圖(收到短信意圖),由接受者收到。
public class IncomingSMSReceiver extends BroadcastReceiver{
???????? //android.provider.Telephony.Sms.Intents.SMS_RECEIVED_ACTION
???????? String SMS_RECEIVED=”android.provider.Telephony.SMS_RECEIVED”;?? //action名稱
???????? public void onReceive(Context context,Intent intent){
?????????????????? if(intent.getAction().equals(SMS_RECEIVED)){
?????????????????? SmsManager sms = SmsManager.getDefault();
?????????????????? Bundle bundle = intent.getExtras();
?????????????????? Object[] pdus = (Object[])bundle.get(“pdus”);
?????????????????? SmsMessage[] messages = new SmsMessage[pdus.length];
?????????????????? for(int i=0;i<pdus.length;i++){
??????????????????????????? messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
??????????????????????????? for(SmsMessage message : messages){
???????????????????????????????????? String msg = message.getMessageBody();
???????????????????????????????????? sms.sendTextMessage(to,null,msg,null,null);
}
}
}
}
}
<uses-permission android:name=”android.permission.RECEIVE_SMS”/>
<uses-permission android:name=”android.permission.SEND_SMS”/>
注:android.provider.Telephony.Sms.Intents.getMessageFromIntent(null);
?
廣播類型
?
普通廣播(Normal broadcasts)
異步的,同時(shí)被很多接受者一同接收到,不能將處理傳給下一個(gè)接收者,無法終止廣播。
?
有序廣播(Ordered broadcasts)
按照接收者的優(yōu)先級(jí)順序接收廣播,優(yōu)先級(jí)別再intent-filter中的priority中聲明,-1000到1000之間,值越大,優(yōu)先級(jí)越高,可以終止廣播意圖的繼續(xù)傳播,接收者可以篡改內(nèi)容。
<intent-filter android:priority=”1”>
???????? <action android:name=”com.android.frameworks..BROADCST_ABORT”/>
context.sendBroadCast(intent);
//指定權(quán)限串發(fā)送廣播
context.sendBroadCast(intent,permissionStr);
context.sendOrderedBroadCast();
receiver.setResultExtra(bundle);
receiver.getResultExtra(true);
?
?
廣播接收者的響應(yīng)
每次廣播到來時(shí),會(huì)重新創(chuàng)建receiver對(duì)象,并且調(diào)用onReceive()方法,執(zhí)行完成之后,該對(duì)象即被銷毀。當(dāng)onReceive()方法在10秒內(nèi)沒有執(zhí)行完畢,Android會(huì)認(rèn)為該程序無響應(yīng),所以在BroadcastReceiver里不能做一些比較耗時(shí)的操作,否則會(huì)彈出ANR(Application No Response)的對(duì)話框。
?
如果需要完成一項(xiàng)比較耗時(shí)的工作,應(yīng)該通過發(fā)送Intent給Service,由Service來完成,這里不能使用子線程來解決,因?yàn)?span style="font-family:Calibri">BroadcastReceiver的生命周期很短,子線程可能還沒有結(jié)束。
BroadcastReceiver就先結(jié)束了。BroadcastReceiver一旦結(jié)束,此時(shí)BroadcastReceiver的所在進(jìn)程很容易在系統(tǒng)需要內(nèi)存是被優(yōu)先殺死,因?yàn)樗鼘儆诳者M(jìn)程(沒有任何活動(dòng)組件的進(jìn)程)。如果它的宿主進(jìn)程被殺死,那么正在工作的子線程也會(huì)被殺死,所以采用子線程來解決時(shí)不可靠的。
?
public void onReceive(Context context,Intent intent){
???????? //發(fā)送Intent啟動(dòng)服務(wù),有服務(wù)來完成比較耗時(shí)的操作
???????? Intent Service = new Intent(content,XxxService.class);
???????? Context.startService(service);
}
<action android:name=”android.intent.action.BATTERY_CHANGED”/>//電量變化
<action android:name=”android.intent.action.BOOT_COMPLETED”/>//啟動(dòng)完成
<uses-permission
android:name=”android.permission.RECEIVE_BOOT_COMPLETED”/>
?
?
總結(jié)
以上是生活随笔為你收集整理的Android中BroadcastReceiver的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android中Activity和tas
- 下一篇: 零基础怎样开花店 学会这些没基础一样赚钱