天天看點

Android中BroadcastReceiver

1、 

broadcastreceiver(廣播接受者)

該元件接受被廣播的intent,context可以通過sendbroadcast()和sendorderedbroadcast()方法實作廣播。

public class incomingsmsreceiver extends broadcastreceiver{

         public void onreceiver(context context,intent intent){

}

注冊接收者

程式設計式((意圖action name))

filter = new intentfilter(“android.provider.telephony.sms_received”);

incomingsmsreceiver receiver = new icomingsmsreceiver();

registerreceiver(receiver,filter);

聲明式

         <receiver android:name=”.incomingsmsreceiver”

//要發送者具有該權限

android:permission=”cn.android.permission.customer”

> 

                   <intent-filter>

                            <action android:name=”android.provider.telephony.sms_received”></action>

</intent-filter>

</receiver>

ctx.sendbroadcast(intent,”接受者必須具有的權限串”);

手機收到短信後,android系統會廣播一個意圖(收到短信意圖),由接受者收到。

         //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)

異步的,同時被很多接受者一同接收到,不能将處理傳給下一個接收者,無法終止廣播。

有序廣播(ordered broadcasts)

按照接收者的優先級順序接收廣播,優先級别再intent-filter中的priority中聲明,-1000到1000之間,值越大,優先級越高,可以終止廣播意圖的繼續傳播,接收者可以篡改内容。

<intent-filter android:priority=”1”>

         <action android:name=”com.android.frameworks..broadcst_abort”/>

context.sendbroadcast(intent);

//指定權限串發送廣播

context.sendbroadcast(intent,permissionstr);

context.sendorderedbroadcast();

receiver.setresultextra(bundle);

receiver.getresultextra(true);

廣播接收者的響應

每次廣播到來時,會重新建立receiver對象,并且調用onreceive()方法,執行完成之後,該對象即被銷毀。當onreceive()方法在10秒内沒有執行完畢,android會認為該程式無響應,是以在broadcastreceiver裡不能做一些比較耗時的操作,否則會彈出anr(application

no response)的對話框。

如果需要完成一項比較耗時的工作,應該通過發送intent給service,由service來完成,這裡不能使用子線程來解決,因為broadcastreceiver的生命周期很短,子線程可能還沒有結束。

broadcastreceiver就先結束了。broadcastreceiver一旦結束,此時broadcastreceiver的所在程序很容易在系統需要記憶體是被優先殺死,因為它屬于空程序(沒有任何活動元件的程序)。如果它的宿主程序被殺死,那麼正在工作的子線程也會被殺死,是以采用子線程來解決時不可靠的。

public void onreceive(context context,intent intent){

         //發送intent啟動服務,有服務來完成比較耗時的操作

         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”/>//啟動完成

<uses-permission

android:name=”android.permission.receive_boot_completed”/>

繼續閱讀