1.ContentObserver简单介绍:
ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。
2.编程步骤:
①创建我们特定的ContentObserver派生类,必须重载父类构造方法,必须重载onChange()方法(当观察到的Uri发生变化时,回调该方法去处理),在这个方法中去做自己需要的功能
②利用context.getContentResolover()获得ContentResolove对象,接着调用registerContentObserver()方法去注册内容观察者
③由于ContentObserver的生命周期不同步于Activity和Service等,因此,在不需要时,需要手动的调用unregisterContentObserver()去取消注册。
3.下边的是自己写的一个得到未接来电的栗子:
public class MainActivity extends AppCompatActivity {
public static int PHONE_NUM;
private final ContentObserver mContactsObserver = new ContactsContentObserver();
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI, true, mContactsObserver);
}
@Override
protected void onDestroy() {
getContentResolver().unregisterContentObserver(mContactsObserver);
super.onDestroy();
}
private class ContactsContentObserver extends ContentObserver {
public ContactsContentObserver() {
super(new Handler());
}
@Override
public void onChange(boolean selfChange) { //当观察到的Uri发生变化时,回调该方法去处理
Log.e("111","进入检测函数");
mHandler.post(new Runnable() {
@Override
public void run() {
UpdateUnAnsweredCalls(getApplicationContext());
mHandler.sendEmptyMessage(0);
}
});
super.onChange(selfChange);
}
}
private void UpdateUnAnsweredCalls(Context context) {
Cursor cursor = null;
Log.e("111","进入处理函数");
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG) == PackageManager.PERMISSION_GRANTED) {
try {
cursor = context.getContentResolver().query(CallLog.Calls.CONTENT_URI, null,
"type = 3 and new = 1", null, null);
if (null != cursor) {
PHONE_NUM = cursor.getCount();
String s = Integer.toString(PHONE_NUM);
Log.e("111","未接来电数目:"+s);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
return;
}
}
}
打印结果如下,用户点掉手机未接来电后立马更新来电数量到零:
4.详细了解ContentObserver的文章:点击打开链接
5.短信和来电的做法类似,可以直接看我自己写的demo,最后附上自己的源码,下载地址:点击打开链接