Android四大組件BroadcastReceiver廣播接收者
當系統(tǒng)收到短信時,會發(fā)出一個action名稱為android.provier.Telephony.SMS_RECEIVED的廣播Intent,該Intent存放了接收到的短信內(nèi)容,使用名稱 “pdus”即可從Intent中獲取短信內(nèi)容。
pdus是一個object類型的數(shù)組,每一個object都是一個byte[]字節(jié)數(shù)組,每一項為一條短信。
Object[] pduses= (Object[])intent.getExtras().get("pdus");
for(Objectpdus: pduses){
byte[] pdusmessage = (byte[])pdus;
SmsMessage sms = SmsMessage.createFromPdu(pdusmessage);
String mobile = sms.getOriginatingAddress();//發(fā)送短信的手機號碼
String content = sms.getMessageBody(); //短信內(nèi)容
Date date = new Date(sms.getTimestampMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = format.format(date); //得到發(fā)送時間
}
廣播接收者(BroadcastReceiver)用于接收廣播Intent,廣播Intent的發(fā)送是通過調(diào)用 Context.sendBroadcast()、Context.sendOrdeedBroadcast()、 context.sendStickyBroadcast()來實現(xiàn)的,通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收,這 個特性跟JMS中的Topic消息接收者類似,要實現(xiàn)一個廣播接收者方法如下:
第一步,繼承BroadcastReceiver,并重寫onReceive()方法
public class SMSBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
}
}
onReceive的生命周期為10秒,所以里面的操作不能超過10秒
第二步,訂閱感興趣的廣播Intent,訂閱方法有兩種:
第一種:使用代碼進行訂閱
SMSBroadcastReceiver receiver = new SMSBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
context.registerReceiver(receiver,filter);
第二種:在AndroidManifest.xml文件中的
第三步,增加接收短信權(quán)限
廣播被分為兩種不同的類型,“普通廣播(Normal broadcasts)”和“有序廣播(Ordered broadcasts)”。普通廣播是完全異步的,可以在同一時刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高,但缺點是:接收者不能將處理結(jié)果 傳遞給下一個接收者,并且無法終止廣播Intent的傳播;然而有序廣播是按照接收者聲明的優(yōu)先級別(聲明在intent-filter元素的 android:priority屬性中,數(shù)據(jù)大優(yōu)先級別越高,取值范圍:-1000到1000也可以調(diào)用IntentFilter對象的 setPriority()進行設(shè)置),被接收者依次接收廣播。如:A的級別高于B,B的級別高于C,那么,廣播先傳給A,再傳給B,最后傳給C。A得到 廣播后,可以往廣播里存入數(shù)據(jù),當廣播傳給B時,B可以從廣播中得到A存入的數(shù)據(jù)。
Context.sendBroadcast()發(fā)送的是普通廣播,所有訂閱者都有機會獲得并進行處理。
Context.sendOrderedBroadcast()發(fā)送的是有序廣播,系統(tǒng)會根據(jù)接收者聲明的優(yōu)先級別按順序逐個執(zhí)行接收者,前面的接收者有 權(quán)終止廣播(BroadcastReceiver.abortBroadcast() ),如果廣播被前面的接收者終止,后面的接收者就再也無法獲取到廣播。對于有序廣播,前面的接收者可以將處理結(jié)果存進廣播Intent,然后傳給下一個接 收者。
sendStickyBroadcast() 意思只要是如果發(fā)送廣播之后才執(zhí)行registerReceiver(BroadcastReceiver,IntentFilter).這個方法依然可 以接受到。換句話說,在ReceiverActivity里是通過代碼來注冊Recevier而不是在Manifest里面注冊的。 sendStickyBroadcast發(fā)出的最后一個Intent會被保留,當下次Recevier處于活躍的時候,又會接受到它。需要加 BROADCAST_STICKY權(quán)限,否則會拋SecurityException
接收電池電量變化廣播:
接收開機啟動廣播
并在進行權(quán)限聲明
在Android中,程序的響應(yīng)(Responsive)被活動管理器(Activity Manager)和窗口管理器(Window Manager)這兩個系統(tǒng)服務(wù)所監(jiān)視,當BroadcastReceiver在10秒內(nèi)沒有執(zhí)行完畢,Android會認為該程序無響應(yīng),所以在 BroadcastReceiver里不能做一些比較耗時的操作,否則會彈出ANR(Application No Response)的對話框。如果需要完成一項比較耗時的工作,應(yīng)該通過發(fā)送Intent給Service,由Service來完成,而不是使用子線程的 方法來解決,因為BroadcastReceiver的生命周期很短(在onReceive()執(zhí)行后BroadcastReceiver的實例就會被銷 毀),子線程可能還沒有結(jié)束BroadcastReceiver就先結(jié)束了。如果BroadcastReceiver結(jié)束了,它的宿主進程還在運行,那么 子線程還會繼續(xù)執(zhí)行。但宿主進程此時很容易在系統(tǒng)需要內(nèi)在時被優(yōu)先殺死。因為它屬于空進程(沒有任何活動組件的進程)。
每次廣播消息到來時,都會創(chuàng)建BroadcastReceiver實例來執(zhí)行onReceive()方法。
事例:
[java] view plaincopy
package com.king.sms;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
public class SMSBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Object[] pduses= (Object[])intent.getExtras().get("pdus");
for(Object pdus: pduses){
byte[] pdusmessage = (byte[])pdus;
SmsMessage sms = SmsMessage.createFromPdu(pdusmessage);
String mobile = sms.getOriginatingAddress();//發(fā)送短信的手機號碼
String content = sms.getMessageBody(); //短信內(nèi)容
Date date = new Date(sms.getTimestampMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = format.format(date); //得到發(fā)送時間
}
}
}
// AndroidManifest.xml
[java] view plaincopy
"1.0" encoding="utf-8"?>
package="com.king.sms"
android:versionCode="1"
android:versionName="1.0">
"color:#ff0000;">
推薦文章
2025-01-18
2024-11-28
2024-11-09
2024-10-25
2024-06-25
2024-01-04
2023-11-06
2023-10-30
2023-10-13
2023-10-10
穩(wěn)定
產(chǎn)品高可用性高并發(fā)貼心
項目群及時溝通專業(yè)
產(chǎn)品經(jīng)理1v1支持快速
MVP模式小步快跑承諾
我們選擇聲譽堅持
10年專注高端品質(zhì)開發(fā)聯(lián)系我們
友情鏈接: