Android中ContentObserver的使用

来源:互联网 发布:pop3服务器端口 编辑:程序博客网 时间:2024/05/31 00:39

如果我们希望监测一个数据源的变化情况,如果单独使用一个线程去不断的进行查询,那么效率就太低了,我们可以使用ContentObserver,顾名思义,它是一个内容观察者,但指定数据源数据发生变化的时候,它会主动进行通知,这样就可以对一个数据源实时的进行监测了。

1、自定义ContentObserver

public class MyContentObsever extends ContentObserver {    private static final String TAG = "MyContentObsever";    public MyContentObsever(Handler handler) {        super(handler);    }    @Override    public void onChange(boolean selfChange) {        // 客户端可以得到数据源发生改变的通知        Log.d(TAG, "数据源发生了变化!");        super.onChange(selfChange);    }    @Override    public void onChange(boolean selfChange, Uri uri) {        super.onChange(selfChange, uri);    }}

2、写一个客户端,注册监听,监听指定的URI

public class MainActivity extends Activity {    private MyContentObsever myContentObsever;    private Handler mHander = new Handler();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        myContentObsever = new MyContentObsever(mHander);        getContentResolver().registerContentObserver(MyService.URI, false, myContentObsever);        startService(new Intent(this, MyService.class));    }}

3、在服务端中进行数据修改,并且通知客户端

public class MyService extends Service {    public static final String AUTHORITY = "mirhunana";    public static final Uri URI = Uri.parse("content://" + AUTHORITY + "/cache");    public MyService() {    }    @Override    public IBinder onBind(Intent intent) {        // TODO: Return the communication channel to the service.        throw new UnsupportedOperationException("Not yet implemented");    }    @Override    public void onCreate() {        super.onCreate();        // 假设我们的数据源在这个服务中发生了改变,我们来通知客户端        ContentResolver resolver = getContentResolver();        resolver.notifyChange(URI, null);    }}

最终,客户端就会回调MyContentObsever中的onChange方法,这样我们在客户端就可以知道数据源发生了变化。

上面就是基本用法,就是对指定URI的数据源进行监听,当数据源发生改变之后,就主动进行通知,这样我们的监听者就可以得到数据源发生变化的通知。

(1)ontentObserver类.
构造方法

public void ContentObserver(Handler handler)

说明:所有 ContentObserver的派生类都需要调用该构造方法
参数: handler  Handler对象。可以是主线程Handler(这时候可以更新UI 了),也可以是任何Handler对象。

常用方法

void onChange(boolean selfChange)

功能:当观察到的Uri发生变化时,回调该方法去处理。所有ContentObserver的派生类都需要重载该方法去处理逻辑。
参数:selfChange 回调后,其值一般为false,

观察特定Uri的步骤如下:

1、创建我们特定的ContentObserver派生类,必须重载父类构造方法,必须重载onChange()方法去处理回调后的功能实现
2、利用context.getContentResolover()获得ContentResolove对象,接着调用registerContentObserver()方法去注册内容观察者
3、由于ContentObserver的生命周期不同步于Activity和Service等,因此,在不需要时,需要手动的调用
unregisterContentObserver()去取消注册。

(2)获取ContentResolver
Context.getContentResolver();

(3)抽象类ContentResolver类中的方法

public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)

功能:为指定的Uri注册一个ContentObserver派生类实例,当给定的Uri发生改变时,回调该实例对象去处理。
参数:

  • uri
    需要观察的Uri(需要在UriMatcher里注册,否则该Uri也没有意义了)

  • notifyForDescendents

为false 表示精确匹配,即只匹配该Uri为true 表示可以同时匹配其派生的Uri,举例如下:假设UriMatcher 里注册的Uri共有一下类型:1 、content://com.qin.cb/student (学生)2 、content://com.qin.cb/student/# 3、 content://com.qin.cb/student/schoolchild(小学生,派生的Uri)    假设我们当前需要观察的Uri为content://com.qin.cb/student,如果发生数据变化的 Uri 为   content://com.qin.cb/student/schoolchild ,当notifyForDescendents为 false,那么该ContentObserver会监听不到,  但是当notifyForDescendents 为ture,能捕捉该Uri的数据库变化。
  • observer
    ContentObserver的派生类实例

public final void unregisterContentObserver(ContentObserver observer)

功能:取消对给定Uri的观察
参数: observer ContentObserver的派生类实例

参考文章:Android中内容观察者的使用—- ContentObserver类详解

0 0
原创粉丝点击