一、知識介紹 1、ContentProvider是內容提供者 ContentResolver是內容解決者(對內容提供的數據進行操作) ContentObserver是內容觀察者(觀察內容提供者提供的數據變化) 2、ContentObserver需要ContentResolver進行註冊。 resol ...
一、知識介紹
1、ContentProvider是內容提供者
ContentResolver是內容解決者(對內容提供的數據進行操作)
ContentObserver是內容觀察者(觀察內容提供者提供的數據變化)
2、ContentObserver需要ContentResolver進行註冊。
resolver.registerContentObserver(uri,true,observer);
①URI(第一個參數):該監聽所監聽ContentProvider的Uri
②notifyForDescendents(第二個參數):設置為true。(如果請求的uri為content://abc則uri為content://abc/xyz數據改變都將會檢測到。
③observer:監聽器實例。
3、利用Observer中的onchange方法,當數據發生變化是,自動執行回調方法。
二、項目實踐
【步驟】
①定義Observer監聽器
②獲取到聯繫人ContentResolver
③註冊Observer。
④重要的一點:添加訪問許可權(動態也要)
⑤註銷Observer
【項目結構】
【MainActivity】
【提示】:這裡將Observer寫成內部類的形式。代碼只有這一部分,其他的無需添加。
1 import android.Manifest;
2 import android.content.ContentResolver;
3 import android.content.pm.PackageManager;
4 import android.database.ContentObserver;
5 import android.net.Uri;
6 import android.os.Handler;
7 import android.provider.ContactsContract;
8 import android.support.v4.app.ActivityCompat;
9 import android.support.v7.app.AppCompatActivity;
10 import android.os.Bundle;
11 import android.util.Log;
12 import android.widget.Toast;
13
14 public class MainActivity extends AppCompatActivity {
15
16 ContentResolver resolver = null;
17 Observer observer = null;
18 @Override
19 protected void onCreate(Bundle savedInstanceState) {
20 super.onCreate(savedInstanceState);
21 setContentView(R.layout.activity_main);
22
23 //動態許可權申請(同時也要在AndroidManifest文件問進行申請許可權)
24 if (ActivityCompat.checkSelfPermission(this,
25 Manifest.permission.READ_CONTACTS)!=
26 PackageManager.PERMISSION_GRANTED);
27 ActivityCompat.requestPermissions(
28 MainActivity.this,
29 new String[]{ Manifest.permission.READ_CONTACTS
30 },0);
31
32 //實例化Observer
33 observer = new Observer(new Handler());
34 //獲取resolver
35 resolver = getContentResolver();
36 Uri uri = ContactsContract.Contacts.CONTENT_URI;
37 //註冊Observer
38 resolver.registerContentObserver(uri,true,observer);
39
40 }
41
42 class Observer extends ContentObserver{
43
44 public Observer(Handler handler) {
45 super(handler);
46 }
47
48 @Override
49 public void onChange(boolean selfChange) {
50 super.onChange(selfChange);
51 Toast.makeText(MainActivity.this,
52 "聯繫人列表發生變化",Toast.LENGTH_SHORT).show();
53 //onchange 方法中添加Toast便於觀察
54 }
55 }
56
57 @Override
58 public void onDetachedFromWindow() {
59 super.onDetachedFromWindow();
60 //在Activity中註銷observer
61 resolver.unregisterContentObserver(observer);
62 }
63 }
【效果】剛剛刪除了一條聯繫人信息
【小結】
①ContentObserver能夠及時的檢測到ContentProvider提供的數據變化。
②ContentObserver不僅能夠針對系統提供的,也可以自己創建的程式之間通過ContentObserver,ContentResolver進行通信