寫一個簡訊監聽程式,大家很容易想到的就是註冊一個廣播接收器,來接收系統收到簡訊時候的廣播。可是這個廣播是有序廣播,就是當別的程式先擷取到了這個廣播再傳遞給你,當然它也可以幹掉這個廣播,讓你接收不到,這樣你的程式肯定是接收不到這個廣播的了。網上有很多這樣的例子,什麼提高廣播接收器的優先順序又是1000又是10000的。。
大家可以看看這個廣播的基本介紹:http://wenku.baidu.com/view/226f9dd5b14e852458fb57ba.html
這裡提到了把intent-filter中的android:priority的值設定為1000,但是在即時中你設定1000一樣是接受不到廣播的,除非你把手機中的其他接受了這個廣播的簡訊卸載,比如360 GO簡訊,飛信神馬的。他們的優先順序總是要比你的高。你可以繼續BAIDU,有的人會設定它為10000 9999等等,你會發現設定為10000的時候偶爾可以接收到,僅僅是偶爾。那腫麼辦呢。
我下面用的方法不是去接收系統廣播,而是去監聽簡訊資料庫的變化,當收到簡訊資料庫變化了的時候,去取得最新的那條簡訊即可。或者你想別的什麼操作也可以。
監聽類SmsReceiver.java
package com.pei.broadcastReceiver;import java.util.List;import com.pei.fixed.AllFinalInfo;import com.pei.info.SmsInfo;import com.pei.util.SmsContent;import android.app.Activity;import android.database.ContentObserver;import android.net.Uri;import android.os.Handler;/** * class name:SmsReceiver<BR> * class description:資料庫改變監聽類<BR> * PS:當資料改變的時候,執行裡面才change方法<BR> * Date:2012-3-16<BR> * * @version 1.00 * @author CODYY)peijiangping */public class SmsReceiver extends ContentObserver {/** * Activity對象 */private Activity activity;private List<SmsInfo> infos;public SmsReceiver(Handler handler, Activity activity) {super(handler);this.activity = activity;}@Overridepublic void onChange(boolean selfChange) {Uri uri = Uri.parse(AllFinalInfo.SMS_URI_INBOX);// 設定一個uri來查看各種類別簡訊內容SmsContent smscontent = new SmsContent(activity, uri);infos = smscontent.getSmsInfo();System.out.println(infos.get(1).getSmsbody());super.onChange(selfChange);}}
怎麼註冊這個監聽呢,只需:
ContentObserver co = new SmsReceiver(new Handler(),AndroidUtilActivity.this);this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, co);
SmsContent.java內容請參考上篇部落格。AllFinalInfo.SMS_URI_INBOX也請參考上篇部落格。