線上服務咨詢
Article/文章
記錄成長點滴 分享您我感悟
Android的四個主要組件BroadcastReceiver廣播接收器
發表時間:2019-07-30 16:25:09
文章來源:沈陽軟件開發
標簽:網站建設 小程序開發 小程序制作 微信小程序開發 公眾號開發 微信公眾號開發 網頁設計 網站優化 網站排名 網站設計 微信小程序設計 小程序定制 微信小程序定制
瀏覽次數:0
當系統收到短消息時,它將發送一個動作名為android.provier.Telephony.SMS_RECEIVED的廣播Intent。 Intent存儲接收的短消息內容,并且可以使用名稱“pdus”從Intent獲取短消息內容。
Pdus是一個對象類型數組,每個對象都是一個byte []字節數組,每個項目都是一條文本消息。
Object [] pduses=(Object [])intent.getExtras()。get('pdus');
for(Objectpdus: pduses){
byte[] pdusmessage=(byte[])pdus;
SmsMessage sms=SmsMessage.createFromPdu(pdusmessage);
Stringmobile=sms.getOriginatingAddress(); //發送手機號碼
Stringcontent=sms.getMessageBody(); //短信內容
日期日期=new日期(sms.getTimestampMillis());
SimpleDateFormat format=newSimpleDateFormat('yyyy-MM-dd HH: mm: ss');
Stringtime=format.format(date); //獲取發送時間
}
廣播接收器(BroadcastReceiver)用于接收廣播Intent。通過調用Context.sendBroadcast(),Context.sendOrdeedBroadcast(),context.sendStickyBroadcast()來發送廣播Intent,通常廣播Intent可以訂閱此Intent。由多個廣播接收器接收,此功能類似于JMS中的主題消息接收器。為了實現廣播接收器,該方法如下:
第一步是繼承BroadcastReceiver并覆蓋onReceive()方法
public classSMSBroadcastReceiverextendsBroadcastReceiver {
@override
public voidonReceive(Context context,Intent intent){
}
}
onReceive的生命周期為10秒,因此內部操作不能超過10秒
第二步是訂閱感興趣的廣播Intent。有兩種訂閱方式:
第一個:使用代碼訂閱
SMSBroadcastReceiver receiver=new SMSBroadcastReceiver();
IntentFilter filter=newIntentFilter();
filter.addAction( 'android.provider.Telephony.SMS_RECEIVED');
context.registerReceiver(接收器,過濾器);
第二:在AndroidManifest.xml文件中的節點中訂閱
'.SMSBroadcastReceiver' >
'android.provider.Telephony.SMS_RECEIVED'/>
第三步是增加接收短信的能力
'android.permission.RECEIVE_SMS' >
廣播分為兩種不同的類型,“普通廣播”和“有序廣播”。普通廣播是完全異步的,并且可以由所有接收者同時(邏輯上)接收。消息傳遞的效率相對較高,但缺點是接收器不能將處理結果傳遞給下一個接收器而不能終止廣播。意圖傳播;但是,有序廣播符合接收者聲明的優先級(在intent-filter元素的android: priority屬性中聲明,數據優先級越高,值范圍:-1000到1000也可以調用IntentFilter對象setPriority()已設置),接收器依次接收廣播。例如,如果A的級別高于B并且B的級別高于C,則首先將廣播發送到A,然后發送到B,最后發送到C.在A廣播之后,可以將數據存儲在廣播。當廣播被發送到B時,B可以從廣播中獲得存儲在A中的數據。
Context.sendBroadcast()發送普通廣播,所有訂閱者都可以訪問它并進行處理。
Context.sendOrderedBroadcast()發送有序廣播。系統根據接收器聲明的優先級逐個執行接收器。如果前一個接收者接收到廣播,則前一個接收者有權終止廣播(BroadcastReceiver.abortBroadcast())。終止后,后續收件人將無法再獲得廣播。對于有序廣播,前一個接收者可以將處理結果存儲在廣播Intent中,然后將其傳遞給下一個接收者。
sendStickyBroadcast()表示如果發送廣播則執行registerReceiver(BroadcastReceiver,IntentFilter)。這種方法仍然可以接受。換句話說,在ReceiverActivity中,Recevier是通過代碼注冊的,而不是在Manifest中注冊的。 sendStickyBroadcast發布的最后一個Intent將被保留,并在下次Recevier激活時被接受。需要添加BROADCAST_STICKY權限,否則會拋出SecurityException
接收電池電量變化廣播:
'android.intent.action.BATTERY_CHANGED'/>
接收啟動匯海廣播
'android.intent.action.BOOT_COMPLETED'/>
并制作許可聲明
在Android中,程序(響應)的響應由兩個系統服務Activity Manager和Window Manager監視。當BroadcastReceiver在10秒內未執行時,Android將認為該程序不存在。響應,因此您無法在BroadcastReceiver中執行一些耗時的操作,否則將彈出ANR(應用程序無響應)對話框。如果您需要完成一項相對耗時的工作,您應該通過向服務發送一個Intent來完成此操作,該Intent由Service完成,而不是使用子線程,因為BroadcastReceiver的生命周期很短(一個實例)在執行onReceive()之后的BroadcastReceiver。將被銷毀),子線程可能在它結束之前不結束BroadcastReceiver。如果BroadcastReceiver完成且其主機進程仍在運行,則子線程將繼續執行。但是,當系統需要內部時,主機進程現在很容易被殺死。因為它屬于空進程(沒有任何活動組件的進程)。
每次廣播消息到達時,都會創建一個BroadcastReceiver實例來執行onReceive()方法。
例如:
[java]查看plaincopy
Packagecom.king.sms;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importandroid.content.BroadcastReceiver;
Importandroid.content.Context;
importandroid.content.Intent;
importandroid.telephony.SmsMessage;
publicclassSMSBroadcastReceiverextendsBroadcastReceiver {
@override
publicvoidonReceive(Contextcontext,Intentintent){
對象[] pduses=(對象[])intent.getExtras()得到( '的PDU');
對于(Objectpdus: pduses){
字節[] pdusmessage=(字節[])的PDU;
SmsMessagesms=SmsMessage.createFromPdu(pdusmessage);
Stringmobile=sms.getOriginatingAddress(); //發送手機號碼
Stringcontent=sms.getMessageBody(); //短信內容
Datedate=newDate(sms.getTimestampMillis());
SimpleDateFormatformat=newSimpleDateFormat('yyyy-MM-ddHH: mm: ss');Stringtime=format.format(date); //獲取發送時間
}
}
}
//AndroidManifest.xml
[java]查看plaincopy
網站建設,小程序開發,小程序制作,微信小程序開發,公眾號開發,微信公眾號開發,網頁設計,網站優化,網站排名,網站設計,微信小程序設計,小程序定制,微信小程序定制