Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中BroadcastReceiver

Android中BroadcastReceiver

編輯:關於Android編程

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系統會廣播一個意圖(收到短信意圖),由接受者收到。

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)

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

 

有序廣播(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   www.2cto.com

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

 

 


作者:toto1297488504
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved