拦截短信,比如当发短信的时候,就把短信读取出来,当系统的短信发生变化的时候,大叫一声,把数据发送到公共的消息邮箱里面,我们的应用通过内容观察者观察公共的消息邮箱
获取ContentResolver对象,调用函数getContentResolver(),
调用ContentResolver对象的registerContentObserver(uri,notifyForDescendents,observer)方法,参数:Uri对象,是否精确uri(true不精确,false精确),observer对象 ContentObserver对象
因为ContentObserver是a抽象类,因此我们写一个内部类来继承这个抽象类,必须实现构造函数,构造函数的Handler对象消息处理器稍后会讲
定义一个内部类MyObserver,实现父类的onChange()回调方法,观察到消息邮箱发生变化的时候会回调这个方法。
在这个回调函数里面,使用获取到短信内容,取最后一条,调用Cursor对象的movetoFirst()指针指向最后一条
这个应用也要加权限
系统应用是如何发出这个叫声的呢,获取ContentResolver对象,通过getContentResolver()方法,调用ContentResolver对象的notifyChange(uri,observer)方法,参数:uri随便定义,observer指定谁处理默认null
系统的很多应用进行通知通信都是通过这个公共消息邮箱机制来实现的
package com.tsh.myobserver;import androID.app.Activity; androID.content.ContentResolver; androID.database.ContentObserver; androID.database.Cursor; androID.net.Uri; androID.os.Bundle; androID.os.Handler; androID.Widget.Toast;public class MainActivity extends Activity { protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); //观察消息邮箱 ContentResolver resolver=getContentResolver(); Uri uri=Uri.parse("content://sms/"); resolver.registerContentObserver(uri,true,new MyObserver(new Handler())); } 内部类实现内容观察者 private class MyObserver ContentObserver{ public MyObserver(Handler handler) { (handler); Todo auto-generated constructor stub } @OverrIDe voID onChange(boolean selfChange) { Todo auto-generated method stub .onChange(selfChange); Uri uri=Uri.parse("content://sms/"); ContentResolver resolver=getContentResolver(); String[] projection=new String[]{"address","date","type","body"}; Cursor cursor=resolver.query(uri,projection,1)">null,1)">null); cursor.movetoFirst(); String body=cursor.getString(cursor.getColumnIndex("body")); Toast.makeText(MainActivity.this,body,1).show(); } }}
总结
以上是内存溢出为你收集整理的[android] 内容观察者全部内容,希望文章能够帮你解决[android] 内容观察者所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)