當前位置:名人名言大全網 - 短信平臺 - android裏broadcast裏面的onrecive方法不斷循環執行是什麽情況

android裏broadcast裏面的onrecive方法不斷循環執行是什麽情況

BroadCastReceiver 簡介 (末尾有源碼)

BroadCastReceiver 源碼位於: framework/base/core/java/android.content.BroadcastReceiver.java

廣播接收者( BroadcastReceiver )用於接收廣播 Intent ,廣播 Intent 的發送是通過調用Context.sendBroadcast() 、 Context.sendOrderedBroadcast() 來實現的。通常壹個廣播 Intent 可以被訂閱了此Intent 的多個廣播接收者所接收。

廣播是壹種廣泛運用的在應用程序之間傳輸信息的機制 。而 BroadcastReceiver 是對發送出來的廣播進行過濾接收並響應的壹類組件;

來自普通應用程序,如壹個應用程序通知其他應用程序某些數據已經下載完畢。

BroadcastReceiver 自身並不實現圖形用戶界面,但是當它收到某個通知後, BroadcastReceiver 可以啟動Activity 作為響應,或者通過 NotificationMananger 提醒用戶,或者啟動 Service 等等。

BroadCastReceiver 的機制

1. 機制

在 Android 裏面有各種各樣的廣播,比如電池的使用狀態,電話的接收和短信的接收都會產生壹個廣播,應用程序開發者也可以監聽這些廣播並做出程序邏輯的處理。如圖:

2. 實現

用接收短信舉例:

第壹種方式 :

實現

public class MyBroadcastReceiver extends BroadcastReceiver {

// action 名稱

String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED" ;

public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals( SMS_RECEIVED )) {

// 相關處理 : 地域變換、電量不足、來電來信;

}

}

}

系統註冊:在 AndroidManifest.xml 中註冊

< receiver android:name = ".MyBroadcastReceiver" >

< intent-filter android:priority = "1000" >

< action android:name = " android.provider.Telephony.SMS_RECEIVED" />

</ intent-filter >

</ receiver > 當然了需要權限 :

< uses-permission android:name = "android.permission.RECEIVE_SMS" />

< uses-permission android:name = "android.permission.SEND_SMS" />

第二種方式:

// 廣播接收者 - 廣播的接收

private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

// 相關處理,如收短信,監聽電量變化信息

}

};

代碼中註冊:

IntentFilter intentFilter = new IntentFilter( "android.provider.Telephony.SMS_RECEIVED " );

registerReceiver( mBatteryInfoReceiver , intentFilter);

3. 生命周期

描述了 Android 中廣播的生命周期,其次它並不像 Activity 壹樣復雜,運行原理很簡單如下圖:

生命周期只有十秒左右,如果在 onReceive() 內做超過十秒內的事情,就會報錯 。

每次廣播到來時 , 會重新創建 BroadcastReceiver 對象 , 並且調用 onReceive() 方法 , 執行完以後 , 該對象即被銷毀 . 當 onReceive() 方法在 10 秒內沒有執行完畢, Android 會認為該程序無響應 . 所以在

BroadcastReceiver 裏不能做壹些比較耗時的操作 , 否側會彈出 ANR(Application No

Response) 的對話框 . 。