一、知識介紹
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進行通信