我們使用的Android手機在收到短信的時候會發出一條系統廣播。該條廣播中存放着接收到的短信的詳細信息。本文將詳細介紹如何通過動態注冊廣播來監聽短信。
注冊廣播有兩種方式,一種是動態注冊,另一種是靜態注冊。動態注冊,顧名思義就是在程序運行時注冊的,需要用到廣播的時候就注冊,用完即銷毀。靜態注是在AndroidManifest.xml中注冊的,在<application>中使用<receiver>標簽注冊。
那么如何創建一個監聽短信的廣播接收器呢,其實只需要新建一個類,讓這個類繼承BroadcastReceiver,並重寫父類的onReceiver方法就可以了。當有廣播來了,onReceiver()方法就會執行。
首先創建一個ListenerSMSBroadcast項目。然后在MainActivity中修改添加代碼。現在在MainActivity中創建一個SMSBroadcastReceiver類並繼承BroadcastReceiver,然后重寫onReceiver方法。
1 class SMSBroadcastReceiver extends BroadcastReceiver{ 2 3 @Override 4 public void onReceive(Context arg0, Intent intent) { 5
6 Object[] object=(Object[]) intent.getExtras().get("pdus"); 7 StringBuilder sb=new StringBuilder(); 8 for (Object pdus : object) { 9 byte[] pdusMsg=(byte[]) pdus; 10 SmsMessage sms=SmsMessage.createFromPdu(pdusMsg); 11 String mobile=sms.getOriginatingAddress();//發送短信的手機號 12 String content=sms.getMessageBody();//短信內容 13 //下面是獲取短信的發送時間 14 Date date=new Date(sms.getTimestampMillis()); 15 String date_time=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); 16 //追加到StringBuilder中 17 sb.append("短信發送號碼:"+mobile+"\n短信內容:"+content+"\n發送時間:"+date_time+"\n\n"); 18
19 } 20 Message msg=new Message(); 21 msg.what=RECEIVERED_MSG; 22 msg.obj=sb.toString(); 23 handler.sendMessage(msg); 24 } 25 26 }
以上代碼可以看到,SMSBroadcastReceiver類繼承了BroadcastReceiver 而且重寫了onReceive()方法。在onReceiver()方法中使用intent.getExtras().get("pdus")獲取到了一個Object[]類型的數組,而且每一個Object都是byte類型的。然后使用for循環遍歷數組,最后使用Handler將短信內容顯示在activity中。
下面是動態注冊廣播。
private IntentFilter intentFilter; private SMSBroadcastReceiver smsBroadcastReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_msg=(TextView) findViewById(R.id.tv_msg); intentFilter=new IntentFilter(); intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); smsBroadcastReceiver=new SMSBroadcastReceiver(); //動態注冊廣播 registerReceiver(smsBroadcastReceiver, intentFilter); }
在這段代碼中聲明了一個IntentFilter對象,並給它添加了一個值為android.provider.Telephony.SMS_RECEIVED的action。為什么要給它添加這個值呢?因為當手機收到短信的時候系統會發出一條值為android.provider.Telephony.SMS_RECEIVED的廣播,這正是要監聽的廣播。接着就創建了一個SMSBroadcastReceiver實例。然后調用registerReceiver()方法注冊廣播,這里講SMSBroadcastReceiver實例和IntentFilter實例都傳進去,這樣SMSBroadcastReceiver就會收到系統收到短信時發送的廣播了。
注意,這里面讀取短信,所以需要添加讀取短信權限的。只要在AndroidManifest.xml中添加一些權限:
1 <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
既然是動態注冊廣播接收器,一定要取消注冊。取消注冊需要調用unregisterReceiver()來實現。這里面是在onDestroy()方法中取消注冊的。
1 protected void onDestroy() { 2 super.onDestroy(); 3 //取消注冊廣播 4 unregisterReceiver(smsBroadcastReceiver); 5 }
本文用到了Handler來修改頁面中TextView的text的屬性值得。message.what來判斷是否要修改text的值,message.obj中是修改的值。
1 private Handler handler=new Handler(){ 2 3 public void handleMessage(android.os.Message msg) { 4 if(msg.what==RECEIVERED_MSG) 5 { 6 tv_msg.setText("收到的信息:\n"+msg.obj);//\n表示換行 7 } 8 }; 9 };
