(下面添加的工作代码提取)
我的应用程序需要通知所有插入和删除(可能是更新,但不太重要)的联系人。这意味着当应用程序启动时,它将需要一个更改列表。在运行时,应立即通知(甚至可以在应用程序运行时对其外部的联系人进行更改吗?)。
我应该使用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);
}
答案 0 :(得分:1)
我知道你想做什么没有广播。 ContentObserver是您必须使用的。还检查: Native contact change notification
答案 1 :(得分:1)
我认为ContentObserver是更好的选择,您可以参考ContentOberver
处理联系人。
答案 2 :(得分:0)
我认为您必须查看广播接收器的问题..