监听ContentProvider
監聽ContentProvider的數據改變
使用ContentProvider時,不管實現insert、delete、update方法中的哪一個,只要該方法導致ContentProvider數據的改變,程序就會調用如下代碼:
getContext().getContentResolver().notifyChange(uri, null);
這行代碼可用于通知所有注冊在該Uri上的監聽者:該ContentProvider所共享的數據發生了改變。
為了在該應用程序中監聽ContentProvider數據的改變,需要利用Android提供的ContentObserver基類。監聽ContentProvider數據改變的監聽器需要繼承ContentObserver類,并重寫該基類所定義的onChange(boolean selfChange)方法——當它所監聽的ContentProvider數據發生改變時,該onChange()方法將會被觸發。
為了監聽指定ContentProvider的數據變化,需要通過ContentResolver向指定Uri注冊ContentObserver監聽器。ContentResolver提供了如下方法來注冊監聽器。
registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)
該方法中的三個參數說明如下。
uri:該監聽器所監聽的ContentProvider的uri。
notifyForDescendents:如果該參數設為true,假如注冊監聽的Uri為content://abc,那么Uri為content://abc/xyz、content://abc/foo的數據改變時也會觸發 該監聽器;如果該參數設為false,假如注冊監聽的Uri為content://abc,那么只有content://abc的數據發生改變時才會觸發該監聽器。
observer:監聽器實例。
例如,如下代碼片段可用于為指定Uri注冊監聽器:
getContentResolver().registerContentObserver(Uri.parse(“content://sms”)), true, new SmsObserver(new Handler()));
上面的代碼中SmsObserver就是ContentObserver的子類。
實例:監聽用戶發出的短信
本實例通過監聽Uri為content://sms的數據改變即可監聽到用戶短信的數據改變,并在監聽器的onChange(boolean selfChange)方法里查詢Uri為content://sms/outbox的數據,這樣即可獲取用戶正在發送的短信(用戶正在發送的短信保存在發件箱內)。
該程序的代碼如下。
public class MainActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//為content://sms的數據改變注冊監聽器,可以監聽到用戶短信數據的改變getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, new SmsObserver(new Handler()));}//提供自定義的ContentObserver監聽器類private final class SmsObserver extends ContentObserver {public SmsObserver(Handler handler) {super(handler);}@Overridepublic void onChange(boolean selfChange) {//查詢發件箱中的短信(處于正在發送狀態的短信放在發件箱中),用于查詢content://sms/outbox的全部數據,也就是查詢發件箱(正在發送的短信保存在發件箱內)內的全部短信,這樣就可以獲取用戶正在發送的短信詳情Cursor cursor = getContentResolver().query(Uri.parse("content://sms/outbox"), null, null, null, null);//遍歷查詢得到的結果集,即可獲取用戶正在發送的短信while (cursor.moveToNext()) {StringBuilder stringBuilder = new StringBuilder();//獲取短信的發送地址stringBuilder.append("address=").append(cursor.getString(cursor.getColumnIndex("address")));//獲取短信的標題stringBuilder.append(";subject=").append(cursor.getString(cursor.getColumnIndex("subject")));//獲取短信的內容stringBuilder.append(";body=").append(cursor.getString(cursor.getColumnIndex("body")));//獲取短信的發送時間stringBuilder.append(";time=").append(cursor.getLong(cursor.getColumnIndex("date")));System.out.println("發送短信:" + stringBuilder.toString());}}} }運行該程序,在不關閉該程序的情況下打開Android系統內置的”Messaging”程序發送短信——直接向本機號碼發送即可。當用戶發送短信時,可以在LogCat面板看到如下:
發送短信:address=555-4;subject=null;body=this is test message;time=14217364484
本程序需要讀取系統短信的內容,因此還需要為該應用添加讀取短信的權限
后記:
這個監聽用戶發送短信的程序采用Activity來實現并不合適——因為用戶必須先主動打開該Activity,并保持該Activity不關閉的情況下,用戶所發送的短信才會被監聽到。這明顯不太符合實際需求場景,在實際情況下,可能更希望該程序以后臺進程的方式“不知不覺”的運行,這就需要利用Android的service組件了。
總結
以上是生活随笔為你收集整理的监听ContentProvider的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算不可约多项式的阶
- 下一篇: dede教程:默认网站地图sitemap