要实现接收系统广播,一般需要分两步:
1 编写一个继承 BroadcastReceiver(抽象类)的子类 ,并实现onReceive方法,如果应用程序接收到系统发送到的广播,就会调用onReceive方法
2 在AndroidManifest.xml 文件中使用<receiver>标签来指定接收哪一个Broadcast Action, 也可以不在AndroidManifest.xml文件中配置,直接在Java类通过registerReceiver 方法进行注册
以下示例一个可以开机启动的程序,代码见 ch07_startup工程,当手机或模拟器启动后,就会运行本例实现的程序,
要实现开机启动的功能,需要接收如下系统广播: android.intent.action.BOOT_COMPLETED
主要代码:
第一步 编写一个StartupReceiver类,用于接收系统广播
public class StartupReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent mainIntent = new Intent(context, Main.class);
mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainIntent);
}
}
第二步 在AndroidManifest.xml 中配置StartupReceiver 类
<receiver android:name="StartupReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
------------------------------------------------------------------------
又一个示例,当用户接收到短信后,手机会向系统发送广播,如果我们的应用程序要在手机接收短信后做点什么,就需要先接收这个系统广播,再作进一步处理
主要代码:
第一步,编写java类:
public class SMSReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if ("android.provider.Telephony.SMS_RECEIVED".equals(intent.getAction()))
{
StringBuilder sb = new StringBuilder();
// 接收由SMS传过来的数据
Bundle bundle = intent.getExtras();
// 判断是否有数据
if (bundle != null)
{
// 通过pdus可以获得接收到的所有短信消息
Object[] objArray = (Object[]) bundle.get("pdus");
/* 构建短信对象array,并依据收到的对象长度来创建array的大小 */
SmsMessage[] messages = new SmsMessage[objArray.length];
for (int i = 0; i < objArray.length; i++)
{
messages[i] = SmsMessage .createFromPdu((byte[]) objArray[i]);
}
/* 将送来的短信合并自定义信息于StringBuilder当中 */
for (SmsMessage currentMessage : messages)
{
sb.append("短信来源:");
// getDisplayOriginatingAddress() 方法获得接收短信的电话号码
sb.append(currentMessage.getDisplayOriginatingAddress());
sb.append("\n------短信内容------\n");
// 获得短信的内容
sb.append(currentMessage.getDisplayMessageBody());
}
}
Intent mainIntent = new Intent(context, Main.class);
mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainIntent);
//这里的处理就是显示出接收的短信
Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();
}
}
}
第二步,在配置中写入SMSReceiver 类
<receiver android:name="SMSReceiver">
<intent-filter>
<!-- 指定SMSReceiver 可以接收的Broadcast Action -->
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
注意: (1) 接收短信的Broadcast Action 是android.provider.Telephony.SMS_RECEIVED
(2) 应用程序要接收SMS_RECEIVED广播,必须声明权限 <uses-permission android:name="android.permission.RECEIVE_SMS" />
示意图:
具体代码 参见 ch07_sms工程
第三个示例,显示手机电池的当前电量. 查看手机的电量需要接收一个系统广播,本示例中不在AndroidManifest.xml文件中配置,而是在Java类中通过registerReceiver 方法进行注册
主要代码:
public class Main extends Activity
{
private TextView tvBatteryChanged;
private BroadcastReceiver batteryChangedReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction()))
{
int level = intent.getIntExtra("level", 0);
int scale = intent.getIntExtra("scale", 100);
tvBatteryChanged.setText("电池用量:" + (level * 100 / scale) + "%");
}
}
};
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tvBatteryChanged = (TextView) findViewById(R.id.tvBatteryChanged);
registerReceiver(batteryChangedReceiver, new IntentFilter(
Intent.ACTION_BATTERY_CHANGED));
}
}
具体代码参见 ch07_battery工程