我的android 第35天 - BroadcastReceiver(三)
三、使用广播接收者窃听短信
当系统收到短信时,会发出一个action名称为android.provider.Telephony.SMS_RECEIVED的广播Intent,该Intent存放了接收到的短信内容,使用名称“pdus”即可从Intent中获取短信内容。
public class IncomingSMSReceiver extends BroadcastReceiver {
private static final StringSMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
@Override public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(SMS_RECEIVED)) {
SmsManagersms = SmsManager.getDefault();
Bundlebundle = intent.getExtras();
if(bundle != null) {
Object[]pdus = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdus.length];
for(inti = 0; i < pdus.length; i++) messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
for(SmsMessage message : messages){
Stringmsg = message.getMessageBody();
Stringto = message.getOriginatingAddress();
sms.sendTextMessage(to, null, msg, null, null);}}}}}
在AndroidManifest.xml文件中的<application>节点里对接收到短信的广播Intent进行订阅:
<receiver android:name=".IncomingSMSReceiver">
<intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter></receiver>
在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 -->
四、系统广播
除了短信到来广播Intent,Android还有很多广播Intent,如:开机启动、电池电量变化、时间已经改变等广播Intent。
android.provider.Telephony.SMS_RECEIVED
android.intent.action.BATTERY_LOW
android.intent.action.CAMERA_BUTTON
android.intent.action.BOOT_COMPLETED
android.intent.action.DEVICE_STORAGE_LOW
android.intent.action.TIMEZONE_CHANGED
android.net.wifi.WIFI_STATE_CHANGED
android.intent.action.PHONE_STATE
五、有序与无序广播
无序广播:用Context.sendBroadcast发送,是完全异步的,所有的广播接收器运行在一个
未定义的顺序,不 能屏蔽结果不能将处理结果传给下一个接收者 ,无法终止广播
有序广播:用Context.sendOrderBroadcast 在同一时间传送到一个接收器。由于每个接收器
依次执行,它可以结果传播到下一个接收器,或者它可以完全中止的广播,需定义优先级优先级别在 intent-filter 中的priority 中声明,-1000 到1000之间 ,值越大 ,优先级越高 .接收者可以截取广播等