首先,由于BroadReceiver是Android组件之一,所以需要先声明才能使用,声明的方法如下:
<!-- 建立receiver聆聽系統廣播訊息 --> <receiver android:name="EX06_01_SMSreceiver"> <!-- 設定要捕捉的訊息名稱為provider中Telephony.SMS_RECEIVED --> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>
接着,我们看下实现本实例的截图:
1.程序开始运行时
2.当程序收到短信的时候
下面给出实现本实例的代码:
1.继承自BroadReceiver的类对象
//这个类实现的是处理操作系统的事件,它处于一直监听的状态,知道操作系统有事件发生时才会有所响应 /* 自定义继承自BroadcastReceiver类,监听系统服务广播的信息 */ public class EX06_01_SMSreceiver extends BroadcastReceiver { /*声明静态字符串,并使用android.provider.Telephony.SMS_RECEIVED作为Action为短信的依据*/ private static final String mACTION = "android.provider.Telephony.SMS_RECEIVED"; /* * 实现广播的监听反应必须要重载的函数 * 这个函数有一个重要的参数Intent,它是系统或用户发送的Intent变量 * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent) */ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub /* 判断传来Intent是否为短信 * 需要在过滤器中设置 * */ if (intent.getAction().equals(mACTION)) { /*建构一字符串集集合变量sb*/ StringBuilder sb = new StringBuilder(); /*接收由Intent传来的数据*/ Bundle bundle = intent.getExtras(); /*判断Intent是有资料*/ if (bundle != null) { Set<String> keysSet=bundle.keySet(); for(String keyString:keysSet){ Log.d("key", keyString); } /* pdus为 android内建短信参数 identifier * 透过bundle.get("")并传一个包含pdus的对象*/ Object[] myOBJpdus = (Object[]) bundle.get("pdus"); /*建构短信对象array,并依据收到的对象长度来建立array的大小*/ SmsMessage[] messages = new SmsMessage[myOBJpdus.length]; for (int i = 0; i<myOBJpdus.length; i++) { messages[i] = SmsMessage.createFromPdu ((byte[]) myOBJpdus[i]); } /* 将送来的短信合并自定义信息于StringBuilder当中 */ for (SmsMessage currentMessage : messages) { sb.append("接收到来告:\n"); /* 来讯者的电话号码 */ sb.append(currentMessage.getDisplayOriginatingAddress()); sb.append("\n------传来的短信------\n"); /* 取得传来讯息的BODY */ sb.append(currentMessage.getDisplayMessageBody()); } } /* 北Notification(Toase)显示短信信息 */ Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show(); /* 返并加Activity */ Intent i = new Intent(context, EX06_01.class); Bundle bundle2=new Bundle(); bundle2.putString("SMS", sb.toString()); i.putExtra("SMSS", bundle2); /*设定让加Activity以一个新的task来执行*/ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } } }
说明:由于BroadReceiver不是一旦单独的进程,且不是一个单独的线程,所以可以对UI界面进行更新。
2.主程序代码:
public class EX06_01 extends Activity { private TextView mTextView1; private TextView textView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /*透过findViewById建构巳建立TextView对象*/ textView=(TextView)findViewById(R.id.myTextView2); mTextView1 = (TextView) findViewById(R.id.myTextView1); mTextView1.setText("等待接收短信..."); Bundle bundle=getIntent().getBundleExtra("SMSS"); //初始时并没有短信的内容(因为没有发送),若没有判断会造成空指针异常 if(bundle!=null){ String smsString=bundle.getString("SMS"); textView.setText(smsString); } } }
3.AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="irdc.EX06_01" android:versionCode="1" android:versionName="1.0.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".EX06_01" 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聆聽系統廣播訊息 --> <receiver android:name="EX06_01_SMSreceiver"> <!-- 設定要捕捉的訊息名稱為provider中Telephony.SMS_RECEIVED --> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> </application> <uses-sdk android:minSdkVersion="7" /> <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> </manifest>