android103 内容观察者

#内容观察者
* 通过内容提供者可以访问到数据库,当数据库数据改变时,内容提供者会发出通知,在内容提供者的uri上注册一个内容观察者,就可以收到数据改变的通知,类似于广播接受者,但是他不是广播。

        cr.registerContentObserver(Uri.parse("content://sms"), true, new MyObserver(new Handler()));
        
        class MyObserver extends ContentObserver{

            public MyObserver(Handler handler) {
                super(handler);
                // TODO Auto-generated constructor stub
            }
    
            //内容观察者收到数据库发生改变的通知时,会调用此方法
            @Override
            public void onChange(boolean selfChange) {

            }
        
        }
* 在内容提供者中发通知的代码

        ContentResolver cr = getContext().getContentResolver();
        //发出通知,所有注册在这个uri上的内容观察者都可以收到通知
        cr.notifyChange(uri, null);
package com.itheima.contentobserver;

import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.view.Menu;

public class MainActivity extends Activity {
    /*
    01项目当数据库改变时:发送数据改变的通知,uri:通知发送到哪一个uri上,所有注册在这个uri上的内容观察者都可以收到这个通知
    getContext().getContentResolver().notifyChange(uri, null);
    */
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //注册一个内容观察者,监听短信数据库内容的改变
        ContentResolver cr = getContentResolver();
        //uri:监听哪个uri上的内容提供者的通知
        //notifyForDescendents:如果是true,那么只要以content://sms开头的uri的数据库数据改变,都能收到通知,比如content://sms/inbox,如果是false则只能收到content://sms的地址的数据改变,
        cr.registerContentObserver(Uri.parse("content://sms"), true, new MyObserver(new Handler()));
    }
    
    class MyObserver extends ContentObserver{
        public MyObserver(Handler handler) {
            super(handler);
        }
        
        //收到数据改变的通知,此方法调用
        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            System.out.println("短信数据库改变");
        }
    }
}
package com.itheima.listener;

import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.database.ContentObserver;
import android.view.Menu;
//08项目
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //注册内容观察者
        getContentResolver().registerContentObserver(Uri.parse("content://com.itheima.people"), true, 
                new ContentObserver(new Handler()) {
                        @Override
                        public void onChange(boolean selfChange) {
                            // TODO Auto-generated method stub
                            super.onChange(selfChange);
                            System.out.println("01项目的数据库改变了");
                        }
                });
    }


    
}
原文地址:https://www.cnblogs.com/yaowen/p/4973162.html