如果在Android中创建了新的或更改过的联系人,有没有办法引起注意?我想在应用程序启动时收到通知,如果有任何更改。在我看来,使用ContentObserver,应用程序必须在活动中运行它。或者我是否必须每次从我的数据库加载所有联系人,我只能识别我的应用程序运行时已更改的联系人并且已实施ContentObserver?
答案 0 :(得分:0)
我只能识别我的应用运行时已更改的联系人并且已实施ContentObserver?
正确,至少通过Android 6.0。
N开发者预览版具有增强版JobScheduler
,可为您实现ContentObserver
,并在检测到更改时调用JobService
。除非出现问题,否则我们可以预期在下一版Android中发布增强版JobScheduler
,您可以选择在较新的Android设备上使用它。
答案 1 :(得分:-1)
好的,我现在做的是:使用后台服务并在onCreate()函数中构建ContentObservice。最后在清单中宣布它。如果应用程序完全关闭但是如果它在后台,它当然不起作用。对我而言足够了。它检测联系人的更改。使用这种方法有什么缺点吗?
这是服务:
public static ResourceBundle getBundle(String basePath, String baseName) throws MalformedURLException {
File file = new File(basePath);
URL[] urls = {file.toURI().toURL()};
ClassLoader loader = new URLClassLoader(urls);
ResourceBundle rb = ResourceBundle.getBundle(baseName, Locale.getDefault(), loader);
return rb;
}
}
这是观察者:
public class ContactsChangeService extends IntentService {
/**
* An IntentService must always have a constructor that calls the super constructor. The
* string supplied to the super constructor is used to give a name to the IntentService's
* background thread.
*/
public ContactsChangeService() {
super("ContactsChangeReceiver");
}
@Override
public void onCreate() {
super.onCreate();
//if created make an Observer
ContactsChangeObserver contentObserver = new ContactsChangeObserver();
getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contentObserver);
Log.d(Constants.TAG, "[" + Constants.CONTACTS_OBSERVER_SERVICE + "] " + "started");
}
@Override
protected void onHandleIntent(Intent workIntent) {
// Gets data from the incoming Intent
String dataString = workIntent.getDataString();
//...
// Do work here, based on the contents of dataString
//...
}
}
这是明显的条目:
public class ContactsChangeObserver extends ContentObserver{
public ContactsChangeObserver() {
super(null);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.d(Constants.TAG, "[" + Constants.CONTACTS_OBSERVER_SERVICE + "] " + "Change in Contacts detected");
}