android监听联系人数据库变化,Android监听通讯录修改,然后上传修改部分

该博客介绍了如何在Android应用中监听联系人数据库的变化,只上传修改过的联系人。首先,首次登录时获取并保存全部通讯录,然后通过ContentObserver监听变化。当通讯录改变时,通过对比新旧版本的version字段来确定哪些联系人被修改或新增,并上传这些联系人的详细信息。整个过程有效减少了不必要的服务器压力。
摘要由CSDN通过智能技术生成

需求

由于项目需要所以在app登录之后都有获取一份本地的通讯录然后上传到服务器。但是最近后台的小伙伴一直反馈说如果每次前端都把整个的通讯录上传过去,然后后台再做比较、去重、再插入数据库的话这样给服务器的压力会比较大。仔细一想其实也是,如果用户的通讯录没有改变那么上诉的所有操作都是白费的。

于是我们前端要做到除了用户第一次全部上传外,以后只有在通讯录发生改变的时候才上传修改的部分通讯录。

为了实现以上的需求我们需要实现下面几个功能:

首次登录上传全部通讯录,然后保存通讯录到本地数据库中

监听联系人是否改变

如果联系人发生改变,获取到改变后的联系人和之前保存在本地的做比较得到改变后的,然后上传服务器

首次全部上传,并且保存到本地数据库中

第一次上传的时候获取全部联系人数据,上传完成后保存到greenDao中,这里主要记录连个字段,RawContacts._ID和RawContacts.VERSION。

RawContacts._ID:用于判断这个联系人之前是否存在

RawContacts.VERSION:当新创建一个联系人的时候version的默认值为2,以后每修改一次就增加1,所以它是判断联系人是否修改的关键

ContentResolver _contentResolver = getContentResolver();

Cursor cursor = _contentResolver.query(

ContactsContract.RawContacts.CONTENT_URI, null, null, null,

null);

//清空本地数据库

oldContactLists.clear();

DBHelper.getInstance().getContact2Dao().deleteAll();

while (cursor.moveToNext()) {

Long contactID = cursor.getLong(cursor

.getColumnIndex(ContactsContract.RawContacts._ID));

long contactVersion = cursor.getLong(cursor

.getColumnIndex(ContactsContract.RawContacts.VERSION));

String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

Contact2 contact2 = new Contact2();

contact2.vesion = contactVersion;

contact2.name = name;

contact2.phone = getPhoneNumber(contactID);

contact2.contactID = contactID;

contact2.cid = MyApplication.userAllInfo.cid;

oldContactLists.add(contact2);

}

cursor.close();

upLoad(oldContactLists);

下面是模拟上传代码成功后保存通讯录到greenDao中:

Log.e("+++","上传成功");

Contact2Dao contact2Dao = DBHelper.getInstance().getContact2Dao();

for (int i = 0; i < removeDuplicateContactLists1.size(); i++) {

Log.e("+++","上传了:"+removeDuplicateContactLists1.get(i).name+" "+removeDuplicateContactLists1.get(i).phone);

contact2Dao.insert(removeDuplicateContactLists1.get(i));

}

接下来开始就是要开启一个service去监听联系人的变化

在service启动的时候:

getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contactObserver);

/**

* 监听通讯录变化

*/

private ContentObserver contactObserver = new ContentObserver(new Handler()) {

@Override

public boolean deliverSelfNotifications() {

return super.deliverSelfNotifications();

}

@Override

public void onChange(boolean selfChange) {

super.onChange(selfChange);

boolean needUpdate = isContactChanged();

if (needUpdate) {

upLoad(newContactLists);

getContentResolver().unregisterContentObserver(contactObserver);

needUpdate = false;

}

}

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android应用程序中,可以通过实现LocaleChangedReceiver类来监听系统语言变化。下面是一个示例代码: ``` public class LocaleChangedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_LOCALE_CHANGED.equals(intent.getAction())) { // 处理语言变化的操作 // 如重新设置应用程序的语言 // 重启应用程序等 } } } ``` 在AndroidManifest.xml文件中注册广播接收器: ``` <receiver android:name=".LocaleChangedReceiver"> <intent-filter> <action android:name="android.intent.action.LOCALE_CHANGED" /> </intent-filter> </receiver> ``` 接下来,可以在应用程序的代码中实现动态语言修改的功能。例如: ``` public void updateLanguage(Locale locale) { Resources resources = getResources(); Configuration configuration = resources.getConfiguration(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { configuration.setLocale(locale); } else { configuration.locale = locale; } resources.updateConfiguration(configuration, resources.getDisplayMetrics()); // 保存语言设置到本地 SharedPreferences sharedPreferences = getSharedPreferences("language", MODE_PRIVATE); sharedPreferences.edit().putString("locale", locale.getLanguage()).apply(); // 重启应用程序 Intent intent = getBaseContext().getPackageManager() .getLaunchIntentForPackage(getBaseContext().getPackageName()); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); // 结束当前Activity finish(); } ``` 此方法会更新应用程序的语言,并将语言设置保存到本地。最后重新启动应用程序,以便应用程序加载新的语言设置。需要注意的是,这种方法可能会丢失应用程序的状态,因此需要谨慎使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值