寫一個短信監聽程序,大傢很容易想到的就是註冊一個廣播接收器,來接收系統收到短信時候的廣播。可是這個廣播是有序廣播,就是當別的程序先獲取到瞭這個廣播再傳遞給你,當然它也可以幹掉這個廣播,讓你接收不到,這樣你的程序肯定是接收不到這個廣播的瞭。網上有很多這樣的例子,什麼提高廣播接收器的優先級又是1000又是10000的。。
大傢可以看看這個廣播的基本介紹:http://wenku.baidu.com/view/226f9dd5b14e852458fb57ba.html
這裡提到瞭把intent-filter中的android:priority的值設置為1000,但是在實時中你設置1000一樣是接受不到廣播的,除非你把手機中的其他接受瞭這個廣播的短信卸載,比如360 GO短信,飛信神馬的。他們的優先級總是要比你的高。你可以繼續BAIDU,有的人會設置它為10000 9999等等,你會發現設置為10000的時候偶爾可以接收到,僅僅是偶爾。那腫麼辦呢。
我下面用的方法不是去接收系統廣播,而是去監聽短信數據庫的變化,當收到短信數據庫變化瞭的時候,去取得最新的那條短信即可。或者你想別的什麼操作也可以。
監聽類SmsReceiver.java
[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;
}
@Override
public 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);
}
}
怎麼註冊這個監聽呢,隻需:
[java]
ContentObserver co = new SmsReceiver(new Handler(),
AndroidUtilActivity.this);
this.getContentResolver().registerContentObserver(
Uri.parse("content://sms/"), true, co);
SmsContent.java內容請參考上篇/kf/201203/123797.html博客。AllFinalInfo.SMS_URI_INBOX也請參考上篇博客。
摘自 裴裴的Android學習和分享