使用 ContentObserver 監聽簡訊接收 onChange 方法呼叫兩次
阿新 • • 發佈:2019-02-05
原來我是用 BroadcastReceiver 來監聽簡訊的接收,後來瞭解到用 ContentObserver 也能實現這種功能,而且還更方便。於是就嘗試使用這種方法。
ContentObserver的原理是觀察(捕捉)特定 Uri 引起的資料庫的變化,繼而可以做一些相應的處理。
在使用 ContentObserver 監聽簡訊的過程中,發現了一個問題,問題描述如下:當手機接收到簡訊的時候, onChange 方法呼叫了一次,當開啟簡訊App後,onChange方法又呼叫了一次。這樣一來就呼叫了兩次 onChange。
我們一般都不希望它呼叫兩次,比如目前市場上的手環類App一般都具有簡訊提醒功能,只要手機接收到簡訊,手環App就會發送某些指令到手環上,手環收到指令進行振動提醒。實現的思路一般是在 onChange方法中傳送資料到手環。假如出現了上述的問題,出現的結果是,手機接到簡訊後,手環振動一下,開啟簡訊App,手環又振動一下。
經過一番查詢。找到了解決的方法。
使用方法:
// 獲取 ContentResolver
mContentResolver = getContentResolver();
// 註冊ContentObserver ,第一個引數是 Uri,第二個引數如果為 true,則該Uri的派 生 Uri(比如 “content://sms/ inbox”)也可以監聽,第三個引數是一個ContentObserver。
mContentResover.registerContentObserver(Uri.parse("content://sms"), true,
new SmsContentObserverr(new Handler()));
// SmsContentObserver 繼承 ContentObserver:
class SmsContentObserver extends ContentObserver{
private Uri mUri;
public SmssReciever(Handler handler) {
super(handler);
}
// 只要 “content://sms” 裡面的資料發生了變化就會呼叫該方法
public void onChange(boolean selfChange,Uri uri){
super .onChange(selfChange,uri);
Log.e("onChange","selfChange = "+selfChange+", Uri = "+uri.toString());
// 接收簡訊後,然後再開啟簡訊 App 後,兩次的 Log 資訊:
// selfChange = false, Uri = content://sms/2750 收到簡訊後呼叫的
// selfChange = false, Uri = content://sms/inbox 打開了簡訊 App 後呼叫的
// 第一遍 先執行 content://sms/raw
// 第二遍則是 content://sms/inbox
if (uri.toString().equals("content://sms/inbox")) {
// return 後就不會執行傳送資料到手環的程式碼了
return;
}
// 傳送資料到手環的程式碼
……
}
}