Android 中的内容观察者ContentObserver

    ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于

   数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。

使用ContentObserver 的时候2个重要方法。

(1)注册:    public final void  registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)。

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

(2)卸载:  public final void  unregisterContentObserver(ContentObserver observer)(2)卸载:

          功能:取消对给定Uri的观察

下面是一个监听发信箱的Demo

首先是一个监听类:

       

package com.bsn.test;

import java.net.URI;
import java.net.URL;

import android.app.Activity;
import android.content.ContentProvider;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;

public class SMSContentObserver extends ContentObserver {
private Context mContext;
private Handler mhandler;
	public SMSContentObserver(Context context,Handler handler) {
		super(handler);
      mContext=context;
	  mhandler=handler;
	}
   @Override
	public void onChange(boolean selfChange) {
		super.onChange(selfChange);
		Uri outMMS=Uri.parse("content://sms/sent");
		Cursor c=mContext.getContentResolver().query(outMMS, null,null, null, "date desc");
	 if (c!=null) {
		 System.out.println("the number is----"+c.getCount());
		StringBuilder sb=new StringBuilder();
		while (c.moveToNext()) {
        sb.append("发件人手机号"+c.getInt(c.getColumnIndex("address")));
        sb.append("信息内容"+c.getString(c.getColumnIndex("body")));
		}
		c.close();
		mhandler.obtainMessage(2,sb.toString()).sendToTarget();
	}
	}
}
 (2)注册监听类的acitivity

      

package com.bsn.test;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;

public class ObserverActivity extends Activity{
	private SMSContentObserver observer;
	private TextView numView;
	private TextView contentView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
	setContentView(R.layout.dotsaygan);
	observer=new SMSContentObserver(this, mHandler);
	numView=(TextView) findViewById(R.id.tv);
	contentView=(TextView) findViewById(R.id.tv1);
	registerContentObservers();
	}
	private void registerContentObservers() {
     Uri uri=Uri.parse("content://sms");
     getContentResolver().registerContentObserver(uri, true, observer);
	}
private Handler mHandler=new Handler(){
	public void handleMessage(android.os.Message msg) {
		switch (msg.what) {
		case 2:
			String outbox=(String)msg.obj;
			contentView.setText(outbox);
			break;

		default:
			break;
		}
	}
};
}
最后别忘记了加入 读取消息的权限

   <uses-permission android:name="android.permission.READ_SMS"/>

好的,关于android studio内容观察者读取数据库信息,我可以为您提供一些基本的知识点和示例代码。 首先,内容观察者是一种机制,用于在URI数据发生变化时通知应用程序。其执行的核心原理是,内容提供程序对外公开所管理的URI数据,当通过这个URI对数据进行了更改时,内容观察者会被触发,从而执行相应的回调函数。 在Android开发,我们可以借助内容提供程序来管理应用程序的数据,其包括了 SQLite 数据库。常用的内容观察者有 CursorLoader 和 ContentObserver 两种类型。 以下是一个简单的示例代码,演示了如何通过 CursorLoader 加载数据库的信息: ``` public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> { private static final int LOADER_ID = 1; private ListView listView; private SimpleCursorAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = findViewById(R.id.listView); String[] fromColumns = {"name", "age"}; int[] toViews = {R.id.name, R.id.age}; adapter = new SimpleCursorAdapter(this, R.layout.item_layout, null, fromColumns, toViews, 0); listView.setAdapter(adapter); getSupportLoaderManager().initLoader(LOADER_ID, null, this); } @NonNull @Override public Loader<Cursor> onCreateLoader(int id, @Nullable Bundle args) { Uri uri = MyContentProvider.CONTENT_URI; String[] projection = {"id", "name", "age"}; String selection = null; String[] selectionArgs = null; String sortOrder = null; return new CursorLoader(this, uri, projection, selection, selectionArgs, sortOrder); } @Override public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor data) { adapter.swapCursor(data); } @Override public void onLoaderReset(@NonNull Loader<Cursor> loader) { adapter.swapCursor(null); } } ``` 在这个示例代码,我们首先通过 SimpleCursorAdapter 将数据绑定到 ListView 上,然后使用 LoaderManager 来创建并初始化一个 CursorLoader 来加载数据库的数据,当数据库的信息发生变化时,内容观察者会被触发并调用相应的回调函数从而更新 UI。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值