1. 程式人生 > >使用 ContentObserver 監聽簡訊接收 onChange 方法呼叫兩次

使用 ContentObserver 監聽簡訊接收 onChange 方法呼叫兩次

原來我是用 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; } // 傳送資料到手環的程式碼 …… } }