应用程序和Android系统都可以使用Intent发送广播消息。其中,广播消息的内容可以是与应用程序密切相关的数据信息,也可以是Android的系统信息,例如,网络连接变化、电池电量变化、接收短信和系统设置变化等。如果应用程序注册了BroadcastReceiver,则可以接收到指定的广播消息。
下面将介绍广播信息的使用方法。
首先,创建一个Intent。调用sendBroadcast()函数,就可把Intent携带的消息广播出去,如果要在Intent传递额外数据,可以用Intent的putExtra()方法。
注意:在构造Intent时必须用全局唯一的字符串标识其要执行的动作,通常使用应用程序包的名称。
利用Intent发送广播消息,并添加了额外的数据,然后调用sendBroadcast()发送广播消息的代码如代码清单6-22所示。
代码清单6-22 利用Intent发送广播消息
String UNIQUE_STRING = "com.example.BroadcastReceiverDemo";
Intent intent = new Intent(UNIQUE_STRING);
intent.putExtra("key1", "value1");
intent.putExtra("key2", "value2");
sendBroadcast(intent);
广播消息发送后,利用BroadcastReceiver监听广播消息。具体方法如下:在AndroidManifest.xml文件或在代码中注册一个BroadcastReceiver,并在其中使用Intent 过滤器指定要处理的广播消息。在BroadcastReceiver接收到与之匹配的广播消息后,onReceive()方法会被调用;onReceive()方法必须要在5秒内执行完毕,否则Android系统会认为该组件失去响应,并提示用户强行关闭该组件。
创建BroadcastReceiver需继承BroadcastReceiver类,并重载onReceive()方法。代码如代码清单6-23所示。
代码清单6-23 利用BroadcastReceiver监听广播消息
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//TODO: React to the Intent received.
}
}
BroadcastReceiver的应用程序不需要一直运行,当Android系统接收到与之匹配的广播消息时,会自动启动此BroadcastReceiver。基于以上特征,BroadcastReceiver适合做一些资源管理的工作。
如图6-6所示,BroadcastReceiverDemo示例说明了如何在应用程序中注册BroadcastReceiver,并接收指定类型的广播消息。

图6-6 BroadcastReceiverDemo示例
如图6-6所示,在单击“发送广播消息”按钮后,EditText控件中内容将以广播消息的形式发送出去,示例内部的BroadcastReceiver将接收这个广播消息,并显示在用户界面的下方。
BroadcastReceiverDemo.java文件中包含发送广播消息的代码,其关键代码如代码清单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行代码创建Intent,将com.example.BroadcastReceiverDem作为识别广播消息的字符串标识;第4行代码添加了额外信息;第5行代码调用sendBroadcast()函数发送广播消息。
为了能够使应用程序中的BroadcastReceiver接收指定的广播消息,首先要在AndroidManifest.xml文件中添加Intent过滤器,声明BroadcastReceiver可以接收的广播消息。其中,AndroidManifest.xml文件的完整代码如代码清单6-25所示。
代码清单6-25 AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="//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行代码中创建了一个<receiver>节点;在第15行中声明了Intent过滤器的动作为“com.example.BroadcastReceiverDemo”,这与BroadcastReceiverDemo.java文件中Intent的动作相一致,表明这个BroadcastReceiver可以接收动作为“com.example. BroadcastReceiverDemo”的广播消息。
MyBroadcastReceiver.java文件创建了一个自定义的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()函数,当接收到AndroidManifest.xml文件定义的广播消息后,程序将自动调用onReceive()函数。