对于我只想知道短信变化了没有,谁发来的,这点信息来说感觉有些麻烦了。
不过今天我接触到了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输出。使用方法就是打开软件,让他在后台运行,然后发短信就可以了。