標籤:window bundle manifest 方法 change request detach 刪除 項目結構
一、知識介紹
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 @Override19 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_CONTACTS30 },0);31 32 //執行個體化Observer 33 observer = new Observer(new Handler());34 //擷取resolver35 resolver = getContentResolver();36 Uri uri = ContactsContract.Contacts.CONTENT_URI;37 //註冊Observer38 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 @Override49 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 @Override58 public void onDetachedFromWindow() {59 super.onDetachedFromWindow();60 //在Activity中登出observer61 resolver.unregisterContentObserver(observer);62 }63 }
【效果】剛剛刪除了一條連絡人資訊
【小結】
①ContentObserver能夠及時的檢測到ContentProvider提供的資料變化。
②ContentObserver不僅能夠針對系統提供的,也可以自己建立的程式之間通過ContentObserver,ContentResolver進行通訊
Android ContenObserver 監聽連絡人資料變化