應(yīng)用程序和Android系統(tǒng)都可以使用Intent發(fā)送廣播消息。其中,廣播消息的內(nèi)容可以是與應(yīng)用程序密切相關(guān)的數(shù)據(jù)信息,也可以是Android的系統(tǒng)信息,例如,網(wǎng)絡(luò)連接變化、電池電量變化、接收短信和系統(tǒng)設(shè)置變化等。如果應(yīng)用程序注冊了BroadcastReceiver,則可以接收到指定的廣播消息。
下面將介紹廣播信息的使用方法。
首先,創(chuàng)建一個Intent。調(diào)用sendBroadcast()函數(shù),就可把Intent攜帶的消息廣播出去,如果要在Intent傳遞額外數(shù)據(jù),可以用Intent的putExtra()方法。
注意:在構(gòu)造Intent時必須用全局唯一的字符串標(biāo)識其要執(zhí)行的動作,通常使用應(yīng)用程序包的名稱。
利用Intent發(fā)送廣播消息,并添加了額外的數(shù)據(jù),然后調(diào)用sendBroadcast()發(fā)送廣播消息的代碼如代碼清單6-22所示。
代碼清單6-22 利用Intent發(fā)送廣播消息
String UNIQUE_STRING = "com.example.BroadcastReceiverDemo";
Intent intent = new Intent(UNIQUE_STRING);
intent.putExtra("key1", "value1");
intent.putExtra("key2", "value2");
sendBroadcast(intent);
廣播消息發(fā)送后,利用BroadcastReceiver監(jiān)聽廣播消息。具體方法如下:在AndroidManifest.xml文件或在代碼中注冊一個BroadcastReceiver,并在其中使用Intent 過濾器指定要處理的廣播消息。在BroadcastReceiver接收到與之匹配的廣播消息后,onReceive()方法會被調(diào)用;onReceive()方法必須要在5秒內(nèi)執(zhí)行完畢,否則Android系統(tǒng)會認(rèn)為該組件失去響應(yīng),并提示用戶強(qiáng)行關(guān)閉該組件。
創(chuàng)建BroadcastReceiver需繼承BroadcastReceiver類,并重載onReceive()方法。代碼如代碼清單6-23所示。
代碼清單6-23 利用BroadcastReceiver監(jiān)聽廣播消息
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//TODO: React to the Intent received.
}
}
BroadcastReceiver的應(yīng)用程序不需要一直運(yùn)行,當(dāng)Android系統(tǒng)接收到與之匹配的廣播消息時,會自動啟動此BroadcastReceiver。基于以上特征,BroadcastReceiver適合做一些資源管理的工作。
如圖6-6所示,BroadcastReceiverDemo示例說明了如何在應(yīng)用程序中注冊BroadcastReceiver,并接收指定類型的廣播消息。

圖6-6 BroadcastReceiverDemo示例
如圖6-6所示,在單擊“發(fā)送廣播消息”按鈕后,EditText控件中內(nèi)容將以廣播消息的形式發(fā)送出去,示例內(nèi)部的BroadcastReceiver將接收這個廣播消息,并顯示在用戶界面的下方。
BroadcastReceiverDemo.java文件中包含發(fā)送廣播消息的代碼,其關(guān)鍵代碼如代碼清單6-24所示。
代碼清單6-24 BroadcastReceiverDemo.java
button.setOnClickListener(new OnClickListener(){
public void onClick(View view){
Intent intent = new Intent("com.example.BroadcastReceiverDemo");
intent.putExtra("message", entryText.getText().toString());
sendBroadcast(intent);
}
});
在上述代碼中,第3行代碼創(chuàng)建Intent,將com.example.BroadcastReceiverDem作為識別廣播消息的字符串標(biāo)識;第4行代碼添加了額外信息;第5行代碼調(diào)用sendBroadcast()函數(shù)發(fā)送廣播消息。
為了能夠使應(yīng)用程序中的BroadcastReceiver接收指定的廣播消息,首先要在AndroidManifest.xml文件中添加Intent過濾器,聲明BroadcastReceiver可以接收的廣播消息。其中,AndroidManifest.xml文件的完整代碼如代碼清單6-25所示。
代碼清單6-25 AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.BroadcastReceiverDemo"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".BroadcastReceiverDemo"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.example.BroadcastReceiverDemo" />
</intent-filter>
</receiver>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
在上述代碼中,第14行代碼中創(chuàng)建了一個<receiver>節(jié)點(diǎn);在第15行中聲明了Intent過濾器的動作為“com.example.BroadcastReceiverDemo”,這與BroadcastReceiverDemo.java文件中Intent的動作相一致,表明這個BroadcastReceiver可以接收動作為“com.example. BroadcastReceiverDemo”的廣播消息。
MyBroadcastReceiver.java文件創(chuàng)建了一個自定義的BroadcastReceiver,其核心代碼如代碼清單6-26所示。
代碼清單6-26 MyBroadcastReceiver.java
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("message");
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
}
在上述代碼中,第1行代碼首先繼承了BroadcastReceiver類;第3行代碼重載了onReceive()函數(shù),當(dāng)接收到AndroidManifest.xml文件定義的廣播消息后,程序?qū)⒆詣诱{(diào)用onReceive()函數(shù)。