android监听系统联系人修改

android系统使用ContentObserver去监听系统联系人时有个很恶心的地方,由于contact表中记录了联系人最近通话时间的字段,所以就是打个电话也会触发onchange()方法,为了解决这个问题,搜集的很多信息,发现联系人数据库中的raw_contacts表中有个version字段,记录了这个联系人数据被更改的次数,幸运的是,打电话时不会改变这个字段的值,所以我使用了hashMap去记录了这个字段的值,当onchange()方法被调用时,比较数据库中raw_contacts表对应的version值是否有变化,有变化的话就判断这个联系人被修改了,否则就说明只是打了电话,这个方法我试验的时候是没有问题的,暂时也没想到什么更好的办法,如果有什么问题,或者有更好的方法,欢迎留言,好了,不说废话,上代码

public class ContactIntentService extends IntentService { private HashMap hashMap; public ContactIntentService() { super("contactIntentService"); // TODO Auto-generated constructor stub } @Override protected void onHandleIntent(Intent intent) { Log.e("onHandleIntent", "被调用了"); } @Override public void onCreate() { super.onCreate(); Log.e("service", "被创建了"); hashMap = new HashMap<>(); initHashMap(); getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, new contactObserver(new Handler())); } public final class contactObserver extends ContentObserver { public contactObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Log.e("observer data", "被调用了"); boolean needUpdate = isContactChanged(); if (needUpdate) { Intent intent = new Intent(); onHandleIntent(intent); } } } public void initHashMap() { ContentResolver _contentResolver = getContentResolver(); Cursor cursor = _contentResolver.query( ContactsContract.RawContacts.CONTENT_URI, null, null, null, null); while (cursor.moveToNext()) { Long contactID = cursor.getLong(cursor .getColumnIndex(ContactsContract.RawContacts._ID)); long contactVersion = cursor.getLong(cursor .getColumnIndex(ContactsContract.RawContacts.VERSION)); hashMap.put(contactID, contactVersion); } cursor.close(); } public boolean isContactChanged(){ boolean theReturn = false; ContentResolver _contentResolver = getContentResolver(); Cursor cursor = _contentResolver.query( ContactsContract.RawContacts.CONTENT_URI, null, null, null, null); while (cursor.moveToNext()) { Long contactID = cursor.getLong(cursor .getColumnIndex(ContactsContract.RawContacts._ID)); long contactVersion = cursor.getLong(cursor .getColumnIndex(ContactsContract.RawContacts.VERSION)); if (hashMap.containsKey(contactID)) { long version = hashMap.get(contactID); if (version != contactVersion) { hashMap.put(contactID, contactVersion); theReturn = true; } }else { hashMap.put(contactID, contactVersion); theReturn = true; } } cursor.close(); return theReturn; } }

这里有个问题就是在start这个service时,就会调用一次onHandleIntent()方法,如果希望这这个方法下做一些事情的话需要注意一下,当然也直接用handler来代替

你可能感兴趣的:(android)