`
bk_lin
  • 浏览: 321395 次
社区版块
存档分类
最新评论

Android入门:监听ContentProvider数据改变

阅读更多

一、监听ContentProvider主要步骤


1.在ContentProvider类的insert\update\delete方法加入this.getContext().getContentResolver().notifyChange(URI,null);
其中URI表示监听的URI
null表示发送消息给任何人;
2.在访问者的类中调用如下方法:
context.getContentResolver().registerContentObserver(uri,true,ContentObserver observer);
即可;

二、实例





我们在Test1和Test2应用都对ContentProvider的数据改变进行注册,如果ContentProvider发出通知,则Test1和Test2都会收到通知;
注意:此处有一个很重要的问题,如果Test1和Test2应用的MainActivity为同一个包,则如果先运行Test2,再运行Test1,则Test2会停止运行,因为Test1应用会覆盖Test2的应用,即接收不到通知;
因此我们要把Test1应用和Test2应用的包名设为不同,此处为org.xiazdong和org.xzdong;


ContentProvider.java

Java代码 
  1. package org.xiazdong.db;  
  2.   
  3. import android.content.ContentProvider;  
  4. import android.content.ContentUris;  
  5. import android.content.ContentValues;  
  6. import android.content.UriMatcher;  
  7. import android.database.Cursor;  
  8. import android.database.sqlite.SQLiteDatabase;  
  9. import android.net.Uri;  
  10.   
  11. public class PersonProvider extends ContentProvider{  
  12.     private DatabaseHelper helper;  
  13.     private SQLiteDatabase db;  
  14.     private UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);  
  15.     @Override  
  16.     public boolean onCreate() {  
  17.         helper = new DatabaseHelper(this.getContext());  
  18.         matcher.addURI("org.xiazdong.provides.personprovider""person"1);  
  19.         return true;  
  20.     }  
  21.   
  22.     @Override  
  23.     public Cursor query(Uri uri, String[] projection, String selection,  
  24.             String[] selectionArgs, String sortOrder) {  
  25.         return null;  
  26.     }  
  27.     /* 
  28.      * 如果操作集合,则必须以vnd.android.cursor.dir开头 
  29.      * 如果操作非集合,则必须以vnd.android.cursor.item开头 
  30.      * */  
  31.     @Override  
  32.     public String getType(Uri uri) {  
  33.         return "";  
  34.     }  
  35.     @Override  
  36.     public Uri insert(Uri uri, ContentValues values) {  
  37.         db = helper.getWritableDatabase();  
  38.         switch(matcher.match(uri)){  
  39.         case 1:  
  40.             long rowid = db.insert("person"null, values);  
  41.             this.getContext().getContentResolver().notifyChange(uri, null);//如果改变数据,则通知所有人  
  42.             return ContentUris.withAppendedId(uri, rowid);  //返回插入的记录所代表的URI  
  43.         default:  
  44.             throw new IllegalArgumentException("wrong uri");  
  45.         }  
  46.     }  
  47.     @Override  
  48.     public int delete(Uri uri, String selection, String[] selectionArgs) {  
  49.         return 0;  
  50.     }  
  51.     @Override  
  52.     public int update(Uri uri, ContentValues values, String selection,  
  53.             String[] selectionArgs) {  
  54.         return 0;  
  55.     }  
  56. }  


Test1应用

Java代码 
  1. package org.xiazdong;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.ContentResolver;  
  5. import android.content.ContentValues;  
  6. import android.database.ContentObserver;  
  7. import android.net.Uri;  
  8. import android.os.Bundle;  
  9. import android.os.Handler;  
  10. import android.util.Log;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.Button;  
  14.   
  15. public class MainActivity extends Activity {  
  16.     private Button button;  
  17.     private OnClickListener listener = new OnClickListener(){  
  18.   
  19.         @Override  
  20.         public void onClick(View v) {  
  21.             ContentResolver resolver = MainActivity.this.getContentResolver();  
  22.             Uri uri = Uri.parse("content://org.xiazdong.provider2/person");  
  23.             resolver.registerContentObserver(uri, truenew PersonObserver(new Handler()));  
  24.             ContentValues values = new ContentValues();  
  25.             values.put("name""zzz");  
  26.             values.put("age"1);  
  27.             resolver.insert(uri, values);   //向ContentProvider插入数据  
  28.         }  
  29.     };  
  30.     @Override  
  31.     public void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.main);  
  34.         button = (Button)this.findViewById(R.id.button);  
  35.         button.setOnClickListener(listener);  
  36.     }  
  37.     private class PersonObserver extends ContentObserver{//监听  
  38.         public PersonObserver(Handler handler) {  
  39.             super(handler);  
  40.         }  
  41.         //当ContentProvier数据发生改变,则触发该函数  
  42.         @Override  
  43.         public void onChange(boolean selfChange) {  
  44.             super.onChange(selfChange);  
  45.             Log.i("Test1""数据改变");  
  46.         }  
  47.     }  
  48. }  

Test2应用

Java代码 
  1. package org.xzdong;  
  2.   
  3. import android.app.Activity;  
  4. import android.database.ContentObserver;  
  5. import android.net.Uri;  
  6. import android.os.Bundle;  
  7. import android.os.Handler;  
  8. import android.util.Log;  
  9.   
  10. public class MainActivity extends Activity {  
  11.     /** Called when the activity is first created. */  
  12.     @Override  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.main);  
  16.         Uri uri = Uri.parse("content://org.xiazdong.provider2/person");  
  17.         this.getContentResolver().registerContentObserver(uri, truenew PersonObserver(new Handler()));  
  18.     }  
  19.     private class PersonObserver extends ContentObserver{  
  20.   
  21.         public PersonObserver(Handler handler) {  
  22.             super(handler);  
  23.         }  
  24.         //当ContentProvier数据发生改变,则触发该函数  
  25.         @Override  
  26.         public void onChange(boolean selfChange) {  
  27.             super.onChange(selfChange);  
  28.             Log.v("Test2""数据改变");  
  29.         }  
  30.     }  
  31. }  

效果:


5
3
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics