`
v5browser
  • 浏览: 1140255 次
社区版块
存档分类
最新评论

监听ContentProvider数据的改变

 
阅读更多

前面介绍的是当ContentProvider将数据共享出来之后,ContentResolver会根据业务需要去主动查询ContentProvider所共享的数据;但有时候程序需要实时监听ContentProvider所共享的数据,并提供相应的响应,这就需要利用ContentObserver了。

其实在ContentProvider中,不管实现的哪个方法,只要该方法导致数据发生了变化。程序就调用了如下代码:

getContext().getContentResolver().notifyChange(uri, null);

用于通知所有注册在该Uri上的监听者:该ContentProvider所共享的数据发生了改变。

监听ContentProvider数据改变的监听器需要继承ContentObserver类,并重写onChange方法,当ContentProvider数据发生改变时,该方法会被触发。

为了监听指定ContentProvider的数据变化,需要通过ContentResolver向指定的Uri注册监听器。ContentResolver提供了如下方法来组成监听器:

该方法中三个参数说明如下:

下面用监听用户发送短信的实例来演示,通过Activity启动一个Service服务,去监听ContentProvider数据的变化。代码如下:

Activity:

package com.lovo.testcontentobserver;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {
	private Button startBtn, stopBtn;
	private Intent intent;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		startBtn = (Button) findViewById(R.id.main_btn_start);
		stopBtn = (Button) findViewById(R.id.main_btn_stop);
		startBtn.setOnClickListener(this);
		stopBtn.setOnClickListener(this);
		intent = new Intent();
		// 为intent设置Action属性
		intent.setAction("com.lovo.myservice");
	}

	@Override
	public void onClick(View v) {
		if (v == startBtn) {
			// 启动指定Service
			startService(intent);
		}
		if (v == stopBtn) {
			// 停止指定Service
			stopService(intent);
		}
	}
}

布局XML只有2个按钮就省略不写了。

Service:

package com.lovo.service;

import android.app.Service;
import android.content.Intent;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {

	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		// 为content://sms的数据改变注册监听器
		getContentResolver().registerContentObserver(
				Uri.parse("content://sms"), true,
				new SmsObserver(new Handler()));
	}

	// 提供自定义的ContentProvider监听器类
	private final class SmsObserver extends ContentObserver {

		public SmsObserver(Handler handler) {
			super(handler);
		}

		@Override
		public void onChange(boolean selfChange) {
			// 查询发送箱中的短信(处于正在发送状态的短信放在发送箱中)
			Cursor cursor = getContentResolver().query(
					Uri.parse("content://sms/outbox"), null, null, null, null);
			while (cursor.moveToNext()) {
				StringBuffer sb = new StringBuffer();
				// 获取短信的发送地址
				sb.append("address=").append(
						cursor.getString(cursor.getColumnIndex("address")));
				// 获取短信的标题
				sb.append(";subject=").append(
						cursor.getString(cursor.getColumnIndex("subject")));
				// 获取短信的内容
				sb.append(";body=").append(
						cursor.getString(cursor.getColumnIndex("body")));
				// 获取短信的发生时间
				sb.append(";time=").append(
						cursor.getLong(cursor.getColumnIndex("date")));
				Log.i("发送的短信:", sb.toString());
			}
		}
	}
}

加上权限:

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





分享到:
评论

相关推荐

    实例解析Android系统中的ContentProvider组件用法

    主要介绍了Android系统中的ContentProvider组件用法,举例讲解了ContentProvider传递数据及监听ContentProvider数据改变的方法,十分详细,需要的朋友可以参考下

    ContentObserver内容观察者

    当ContentProvider将数据共享出来之后,ContentResolver会根据...在有些时候,应用程序需要实时监听ContentProvider所共享数据的改变,并随着ContentProvider的数据的改变而提供响应,这就需要利用contentObserver。

    contentprovider+contentobserver

    先运行contentproviderdemo,然后在运行contentobserver工程,在contentobserver中可以对共享数据库中的数据增删改查,还可以监听数据库变化,实时改变布局变化

    Android实例代码

    9.4、监听ContentProvider的数据:ContentObserver; 第10章、Service与BroadcastReceiver 10.1、Service:Service的创建、配置、启动、停止、绑定和通信; Service的生命周期; 10.2、跨进程调用Service(AIDL服务)...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    9.4、监听ContentProvider的数据:ContentObserver; 第10章、Service与BroadcastReceiver 10.1、Service:Service的创建、配置、启动、停止、绑定和通信; Service的生命周期; 10.2、跨进程调用Service(AIDL服务)...

    疯狂Android讲义源码

     9.4 监听ContentProvider的数据  改变 370  9.4.1 ContentObserver简介 370  9.5 本章小结 372  第10章 Service与Broadcast  第10章 Receiver 373  10.1 Service简介 374  10.1.1 创建、配置Service 374  ...

    疯狂Android讲义.part1

    9.4 监听ContentProvider的数据 改变 370 9.4.1 ContentObserver简介 370 9.5 本章小结 372 第10章 Service与Broadcast 第10章 Receiver 373 10.1 Service简介 374 10.1.1 创建、配置Service 374 10.1.2 启动和停止...

    Android开发应用实战详解源代码

    2.8.2 使用broadcast receiver监听广播 2.8.3 android本地广播 2.9 小结 第3章 设备界面演练 3.1 文字标签处理 3.2 改变屏幕窗口元素的背景颜色 3.3 改变textview的文字颜色 3.4 实现textview文字的替换 3.5 获取...

    Android 开发技巧

    9.72、定义CONTENTOBSERVER,监听某个数据表 302 9.73、打开照相机 303 9.74、从GALLERY选取图片 303 9.75、打开录音机 303 9.76、语音朗读 303 9.77、手机获取视频流显示在电脑上 305 9.78、蓝牙的使用 313 9.79、...

    Android开发资料合集-World版!

    9.72、定义CONTENTOBSERVER,监听某个数据表 302 9.73、打开照相机 303 9.74、从GALLERY选取图片 303 9.75、打开录音机 303 9.76、语音朗读 303 9.77、手机获取视频流显示在电脑上 305 9.78、蓝牙的使用 313 9.79、...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    3.2.3 改变布局参数 133 3.2.4 各种滑动方式的对比 133 3.3 弹性滑动 135 3.3.1 使用Scroller 136 3.3.2 通过动画 138 3.3.3 使用延时策略 139 3.4 View的事件分发机制 140 3.4.1 点击事件的传递规则 140 ...

    Android开发艺术探索

     3.2.3 改变布局参数 / 133  3.2.4 各种滑动方式的对比 / 133  3.3 弹性滑动 / 135  3.3.1 使用Scroller / 136  3.3.2 通过动画 / 138  3.3.3 使用延时策略 / 139  3.4 View的事件分发机制 / 140  3.4.1 ...

Global site tag (gtag.js) - Google Analytics