Android开发之内容观察者
内容观察者:
当关注应用的数据库数据改变时,内容提供者会发出通知,在内容提供者的uri上注册一个内容观察者,就可以收到数据改变的通知
实现步骤:
1.假如是自定义的ContentProvider,需要在数据发送改变的方法中实现以下代码:
1 ContentResolver cr = getContext().getContentResolver(); 2 //发出通知,所有注册在这个uri上的内容观察者都可以收到通知 3 cr.notifyChange(uri, null);
notifyChange(Uri uri, ContentObserver observer)
//参数uri:内容发送改变的uri
//参数observer:可以为null;假如指定为某个内容观察者,有点类似于广播的最终接收者;假如自己注册该内容观察者,为true
2.在想要接受该数据改变通知的地方,注册一个内容观察者
1 import android.app.Activity; 2 import android.content.ContentResolver; 3 import android.database.ContentObserver; 4 import android.net.Uri; 5 import android.os.Bundle; 6 import android.os.Handler; 7 8 public class MainActivity extends Activity { 9 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 setContentView(R.layout.activity_main); 14 initLinstener(); 15 } 16 17 private void initLinstener() { 18 ContentResolver cr=getContentResolver(); 19 cr.registerContentObserver(Uri.parse("content://sms"), true, new MyObserver(new Handler())); 20 } 21 22 class MyObserver extends ContentObserver{ 23 24 public MyObserver(Handler handler) { 25 super(handler); 26 } 27 //内容观察者收到数据库发生改变的通知时,会调用此方法 28 @Override 29 public void onChange(boolean selfChange) { 30 super.onChange(selfChange); 31 System.out.println("短信数据库发送的改变!"); 32 } 33 } 34 35 }
registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)
//参数uri:监听哪个uri上的内容提供者的通知
//参数notifyForDescendents:false时,需要精准匹配;true时,需要是以uri开头的uri的数据改变,都能收到通知
//参数observer:发送改变时回调的对象
需要实现一个MyObserver,实现ContentObserver。并实现该类中的onChange()方法。
直面挑战,躬身入局