日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

监听ContentProvider

發布時間:2023/12/31 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 监听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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。