1. 程式人生 > >Android 的廣播機制和兩種註冊方式

Android 的廣播機制和兩種註冊方式

1.Android 的廣播機制

在 Android 裡面有各種各樣的廣播,比如電池的使用狀態,電話的接收和簡訊的接收都會產生一個廣播,應用程式開發者也可以監聽這些廣播並做出程式邏輯的處理。下面我畫一張粗略的圖來幫助大家理解廣播的執行機制。


Android 中有各式各樣的廣播,各種廣播在Android 系統中執行,當系統/應用程式執行時便會向 Android 註冊各種廣播,Android 接收到廣播會便會判斷哪種廣播需要哪種事件,然後向不同需要事件的應用程式註冊事件,不同的廣播可能處理不同的事件也可能處理相同的廣播事件,這時就需要Android 系統為我們做篩選。

2.註冊

在android下,要想接受廣播資訊,那麼這個廣播接收器就得我們自己來實現了,我們可以繼承BroadcastReceiver

,就可以有一個廣播接受器了。有個接受器還不夠,我們還得重寫BroadcastReceiver裡面的onReceiver方法,當來廣播的時候我們要幹什麼,這就要我們自己來實現,不過我們可以搞一個資訊防火牆。具體的程式碼:

publicclassSmsBroadCastReceiverextendsBroadcastReceiver
{

@Override
publicvoidonReceive(Contextcontext,Intentintent)
{
Bundlebundle
=intent.getExtras();
Object[]object
=(Object[])bundle.get("pdus
");
SmsMessagesms[]
=newSmsMessage[object.length];
for(inti=0;i<object.length;i++)
{
sms[
0]=SmsMessage.createFromPdu((byte[])object[i]);
Toast.makeText(context,
"來自"+sms[i].getDisplayOriginatingAddress()+"的訊息是:"+sms[i].getDisplayMessageBody(),Toast.LENGTH_SHORT).show();
}
//終止廣播,在這裡我們可以稍微處理,根據使用者輸入的號碼可以實現簡訊防火牆。
abortBroadcast();
}

}

當實現了廣播接收器,還要設定廣播接收器接收廣播資訊的型別,這裡是資訊:android.provider.Telephony.SMS_RECEIVED

我們就可以把廣播接收器註冊到系統裡面,可以讓系統知道我們有個廣播接收器。這裡有兩種,一種是程式碼動態註冊:

//生成廣播處理smsBroadCastReceiver=newSmsBroadCastReceiver();
//例項化過濾器並設定要過濾的廣播 IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

//註冊廣播BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver,intentFilter);

一種是在AndroidManifest.xml中配置廣播

<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android"
package
="spl.broadCastReceiver"
android:versionCode
="1"
android:versionName
="1.0"><applicationandroid:icon="@drawable/icon"android:label="@string/app_name"><activityandroid:name=".BroadCastReceiverActivity"
android:label
="@string/app_name"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity><!--廣播註冊--><receiverandroid:name=".SmsBroadCastReceiver"><intent-filterandroid:priority="20"><actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter></receiver></application><uses-sdkandroid:minSdkVersion="7"/><!--許可權申請--><uses-permissionandroid:name="android.permission.RECEIVE_SMS"></uses-permission></manifest>

兩種註冊型別的區別是:

1)第一種不是常駐型廣播,也就是說廣播跟隨程式的生命週期。

2)第二種是常駐型,也就是說當應用程式關閉後,如果有資訊廣播來,程式也會被系統呼叫自動執行。