1,系统在收到短息时,会产生一条短信广播,短信广播里,包含了短信的发信人号码和短信的内容,短信应用之所以能收到短信,其实是收到了短信广播。
2,为了介绍priority(优先级),这里做一个小案例,除了接收广播短信外,还要对特定的短信实现拦截功能。要想实现拦截短信的功能,就要在短信应用在拿到广播之前,把短信广播拦截,那么短信应用就不会收到广播。
3,广播接收者的代码如下:
<span style="font-size:14px;">public class SmsReceiver extends BroadcastReceiver{ /** * 从广播中取出短信的过程: * 1,从intent中取出bundle(短信在广播时存在了bundle中) * 2,以pdus为key取出Object数组,Object中的每个元素都是一条短信 * 3,通过Object构造出一个短信对象 * 4,通过短信对象来获取发信人号码及短信内容 */ //intent:广播发送时使用的intent @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Bundle bundle = intent.getExtras(); // 数组中的每个元素都是一条短信 Object[] objects = (Object[])bundle.get("pdus"); for (Object object : objects) { // 通过pdu创建短信对象 SmsMessage sms = SmsMessage.createFromPdu((byte[]) object); // 获取发信人的号码 String address = sms.getOriginatingAddress(); // 获取短信内容 String body = sms.getMessageBody(); System.out.println(address+"-----"+body); // 实现短信拦截功能 if ("138438".equals(address)) { // 阻止其他广播接收者接收这条短信,类似于拦截. // 注意:需在清单文件里配置优先级,不然拦截不成功 abortBroadcast(); } } } }</span>
4,BroadcastReceiver和其他三个组件一样,在使用之前都需在清单文件中进行配置:
<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.stopSms" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /> <!-- 需添加接收短信的权限 --> <uses-permission android:name="android.permission.RECEIVE_SMS"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.stopSms.MainActivity" 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="com.example.stopSms.SmsReceiver"> <!-- 要实现拦截功能,需要设置优先级(-1000~1000) --> <intent-filter android:priority="1000"> <!-- 短信广播需要手写(Alt+/ 无提示) --> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver> </application> </manifest></span>
5,Activity中不需要实现什么功能,这里不再给出。