android之ContentObserver内容观察者的使用

在跟着一个教程做手机卫士的时候,里面用到了ContentObserver,以前没接触过,根据网上的资料整理了一下,还算明白。

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

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

(1)注册:

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

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

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

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

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

首先是一个监听类:

package jason.observer;

import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;

public class SMSContentObserver extends ContentObserver {

	Context context;
	Handler handler;

	public SMSContentObserver(Context c, Handler handler) {
		super(handler);
		// TODO Auto-generated constructor stub
		this.context = c;
		this.handler = handler;
	}

	@Override
	public void onChange(boolean selfChange) {
		// TODO Auto-generated method stub
		super.onChange(selfChange);
		Uri outMMS = Uri.parse("content://sms/inbox");
		//desc 降序	 asc 升序
		Cursor cursor = context.getContentResolver().query(outMMS, null, null, null, "date ASC");
		if(cursor != null){
			System.out.println("the number is " + cursor.getCount());
			StringBuilder  builder = new StringBuilder();
			while(cursor.moveToNext()){
				builder.append("发件人信息:" + cursor.getString(cursor.getColumnIndex("address")));
				builder.append("信息内容:"+cursor.getString(cursor.getColumnIndex("body"))+"\n");
			}
			cursor.close();
			String builder2 = builder.toString();
			handler.obtainMessage(1, builder2).sendToTarget();
		}
	}

}

(2)注册监听类的acitivity

package jason.observer;

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 {
	SMSContentObserver contentObserver;
	TextView tv_number;
	TextView tv_content;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_observer);
		tv_content = (TextView) findViewById(R.id.tv_content);
		tv_number = (TextView) findViewById(R.id.tv_number);
		contentObserver = new SMSContentObserver(this, handler);
		Uri uri = Uri.parse("content://sms");
		getContentResolver().registerContentObserver(uri, true, contentObserver);
	}

	Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case 1:
				String sb = (String) msg.obj;
				tv_content.setText(sb);
				break;

			default:
				break;
			}
		};	
	};

}

最后别忘记了加入 读取消息的权限

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


 

 

作者:jason0539

微博:http://weibo.com/2553717707

博客:http://blog.csdn.net/jason0539(转载请说明出处)


 

好的,关于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。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值