(作業コードの抜粋を以下に追加)
私のアプリは、連絡先のすべての挿入と削除 (および場合によっては更新ですが、それほど重要ではありません) を通知する必要があります。これは、アプリの開始時に変更のリストが必要になることを意味します。実行中はすぐに通知する必要があります (実行中にアプリの外部で連絡先を変更することはできますか?)。
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);
}
}
2 番目のブロックは次のとおりです。これは、アクティビティからの onCreate です (または、onResume にある可能性があります)。2 つの重要な部分があります。1 つ目は、ハンドラーを実装してインスタンス化することです。これは、別のスレッドで実行されるオブザーバーから「メッセージ」を受け取り、それらをアクティビティに中継します。2 番目の部分は、register 呼び出しによって発生するオブザーバーの作成です。
@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 ...
}
最後に、もう 1 つのコード ブロックです。オブザーバーの登録を解除する必要があります。そうしないと、メモリ リークが発生します。(onResumeで登録した場合は、必ずonPauseで登録解除してください。)
@Override
public void onDestroy ()
{
super.onDestroy();
getContentResolver().unregisterContentObserver (contactsObserver);
}