Android手機使用廣播監聽手機收到的短信


我們使用的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     };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM