Приложению нужны уведомления о всех вставках, удалениях контактов
(извлечение рабочего кода добавлено ниже)
Мое приложение должно быть уведомлено обо всех вставках и удалениях (и, возможно, обновлениях, но менее важных) контактов. Это означает, что при запуске приложения ему потребуется список изменений. Пока он работает, он должен быть немедленно уведомлен (возможно ли даже внести изменения в контакты вне приложения во время его работы?).
Должен ли я использовать ContentObserver? Нужна ли мне услуга? Есть ли способ при запуске приложения, чтобы получить список изменений, которые произошли с момента последнего запуска приложения?
Благодарю.
ContentObserver действительно работает. Тем не менее, для контактов, это гораздо меньше, чем я надеялся. Вы получаете только уведомление о том, что что-то изменилось (на самом деле, вы можете получить несколько уведомлений). Вы не будете знать, что изменилось. Полагаю, лучше, чем никаких уведомлений.
Когда вы получите уведомление, вам нужно будет выполнить запросы, чтобы узнать, изменился ли какой-либо из интересующих вас контактов. Если вам нужно проверить все из них, я думаю, вам лучше использовать SyncAdapter.
Вот код, который я использовал в конечном итоге. Сначала подкласс ContentObserver; он получает уведомления от любого провайдера, с которым вы регистрируетесь (см. следующий блок кода):
class MainContentObserver extends ContentObserver
{
public MainContentObserver (Handler handler)
{
super (handler);
}
@Override
public void onChange (boolean selfChange)
{
Message msg = handler.obtainMessage();
msg.what = CONTACTS_CHANGED; // const int declared elsewhere
msg.obj = null;
handler.sendMessage (msg);
}
}
Вот блок sceond - это onCreate от вашей активности (или он может быть в onResume). Есть две важные части. Во-первых, я реализую и создаю экземпляр обработчика. Он будет получать "сообщения" от наблюдателя, который работает в отдельном потоке, и передавать их в мою деятельность. Второй кусок - это создание наблюдателя, которое происходит через регистрационный вызов.
@Override
public void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// receive notices from our background threads.
handler = new Handler()
{
@Override
public void handleMessage (Message msg)
{
if (msg.what == CONTACTS_CHANGED) // const int declared elsewhere
System.out.println ("handler: contacts changed");
else
throw new IllegalArgumentException ("unrecognized handler message source: " + msg.what);
}
};
// register content observer for contact changes
contactsObserver = new MainContentObserver (handler);
getContentResolver().registerContentObserver (ContactsContract.AUTHORITY_URI, true,
contactsObserver);
... other initialization ...
}
Наконец, еще один блок кода - вам нужно отменить регистрацию наблюдателя, или (я читал) у вас будет утечка памяти. (Если вы регистрируетесь в onResume, обязательно отмените регистрацию в onPause.)
@Override
public void onDestroy ()
{
super.onDestroy();
getContentResolver().unregisterContentObserver (contactsObserver);
}
3 ответа
Я знаю, что нет трансляции того, что вы хотите сделать. ContentObserver - это то, что вам нужно. Также проверьте: уведомление об изменении родного контакта
Я думаю, что ContentObserver является лучшим вариантом, вы можете сослаться на ContentOberver
общение с контактами.
Я думаю, что вам придется искать в Broadcast Receiver для вашего вопроса..