android之ContentObserver内容观察者的使用

ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于   数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。(1)注册:    public final void  registerContentObserver(Uri uri, boolean noti

大家好,又见面了,我是全栈君。

在跟着一个教程做手机卫士的时候,里面用到了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(转载请说明出处)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121358.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • kafka零拷贝原理_kafka常用命令

    kafka零拷贝原理_kafka常用命令Kafka除了具备消息队列MQ的特性和使用场景外,它还有一个重要用途,就是做存储层。用kafka做存储层,为什么呢?一大堆可以做数据存储的MySQL、MongoDB、HDFS……因为kafka数据是持久化磁盘的,还速度快;还可靠、支持分布式……啥!用了磁盘,还速度快!!!没错,kafka就是速度无敌,本文将探究kafka无敌性能背后的秘密。首先要有个概念,kafka高性能的背后,是多方面协同后、最终的结果,kafka从宏观架构、分布式partition存储、ISR数据同步、以及“无孔不

    2022年9月21日
    0
  • debian10 中文乱码_ue中文乱码解决方案

    debian10 中文乱码_ue中文乱码解决方案系统版本:Debian6.0.2Squeeze产生乱码原因:系统没有中文字体解决方案:1、从win下拷贝后缀为ttf的字体库到/usr/share/fonts/truetype/,我这里拷贝MSYH.ttf(微软雅黑)。2、终端输入一下代码:   #su

    2022年10月18日
    0
  • 求两个对角向上、列索引是偶数的元件和。

    求两个对角向上、列索引是偶数的元件和。

    2022年1月10日
    48
  • pycharm怎么配置虚拟环境_pycharm选择运行环境

    pycharm怎么配置虚拟环境_pycharm选择运行环境pycharm配置虚拟环境的前提是已经创建好了虚拟环境

    2022年8月28日
    0
  • 关于HashMap扩容机制

    关于HashMap扩容机制HashMap的底层有数组+链表(红黑树)组成,数组的大小可以在构造方法时设置,默认大小为16,数组中每一个元素就是一个链表,jdk7之前链表中的元素采用头插法插入元素,jdk8之后采用尾插法插入元素,由于插入的元素越来越多,查找效率就变低了,所以满足某种条件时,链表会转换成红黑树。随着元素的增加,HashMap的数组会频繁扩容,如果构造时不赋予加载因子默认值,那么负载因子默认值为0.75,数组扩容的情况如下:1:当添加某个元素后,数组的总的添加元素数大于了数组长度*0.75(默认,也可自己设

    2022年6月25日
    29
  • ubuntu 更新源详细操作步骤「建议收藏」

    ubuntu 更新源详细操作步骤「建议收藏」由于linux系统自带的镜像源都在国外,国内用户下载或更新软件会比较慢,有时是非常慢,所以国内某些机构,如大学,研究院所,就在国内建了linux的镜像源服务器共国内linux用户使用,而我们要使用这些源,就要更改自己linux系统的更新源配置文件,接下来详述更新源操作步骤。1.首先我们要找到国内的镜像源路径我选择了清华的镜像源,链接如下:https://mirrors.tuna.t

    2022年5月14日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号