Android ContenObserver 監聽聯系人數據變化


一、知識介紹

   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進行通信

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM