在Android中有时候会用到对系统自带的数据的数据变化进行监听,例如接收短信,拨打电话等,我记得我以前是通过注册广播来进行短信的监听的,可以通过设置广播action=“android.provider.Telephony.SMS_RECEIVED”,然后把广播的优先级设置成最高的,这样可以在接收到广播后根据意向决定是否需要拦截短信。只是这个过程对于我只想知道短信变化了没有,谁发来的,这点信息来说感觉有些麻烦了。
不过今天我接触到了ContentObserve这个类,他是系统提供的一个内容监听者,他可以很方便的帮我们监听例如短信的变化信息等,当然了,他并不能实现拦截短信的功能。
接下来我们来看一下这个类:
public abstract class ContentObserver
这是类的声明,很显然他是一个抽象类,我们想要使用它务必需要自己写个类来继承他
接下来我们看一下这个类中可以重写的方法:
public boolean deliverSelfNotifications() {
return false;
}
public void onChange(boolean selfChange) {
// Do nothing. Subclass should override.
}
public void onChange(boolean selfChange, Uri uri) {
onChange(selfChange);
}
说实话我只用到了第二个方法,对于一个方法API的解释里也只是说了返回值的true or false表示他是否对接收到的
self-change notifications
感兴趣,第三个方法API给出的解释是可以配合第二个方法使用,先调用第二个方法,然后在第二个方法中调用第三个方法,在第三个方法中来处理变化,如果感兴趣可以去看看源码,虽然我觉得没必要。
接下来直接上demo:
package com.example.contentobserve; import android.app.Activity; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.util.Log; public class MainActivity extends Activity { private MyContentObserver observer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("ContentObserver","onCreate"); init(); } private void init() { Log.d("ContentObserver","init"); Uri uri = Uri.parse("content://sms/"); observer = new MyContentObserver(new Handler()); Log.d("ContentObserver","注册了短信的内容监听者"); //uri是你需要监听的内容提供者的uri,第二个参数代表是否接收你写的uri的派生uri的变化信息,第三个参数就是内容监听者了 getContentResolver().registerContentObserver(uri,true,observer); } class MyContentObserver extends ContentObserver { /** * Creates a content observer. * * @param handler The handler to run {@link #onChange} on, or null if none. */ public MyContentObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { Log.d("ContentObserver","短信改变了"); Uri uri = Uri.parse("content://sms/outbox"); Cursor cursor = getContentResolver().query(uri,new String[]{"_id","body","address"}, null,null,"_id desc");//查询发件箱中的短信,只要最新的 if(cursor != null && cursor.moveToFirst()) { String body = cursor.getString(cursor.getColumnIndex("body")); String address = cursor.getString(2); Log.d("ContentObserver","body = "+body+";address = "+address);//打印获取到的短信内容 } cursor.close();//游标使用后关闭 } } @Override protected void onDestroy() { super.onDestroy(); Log.d("ContentObserver","解绑了短信的内容监听者"); getContentResolver().unregisterContentObserver(observer); } }可以直接复制代码,运行,看看logcat输出。使用方法就是打开软件,让他在后台运行,然后发短信就可以了。