3

Android サービスとコンテンツ オブザーバーを理解しようとしています。

そこで、アクティビティがサービスを開始し、サービス内で CONTACTS URI に登録して、連絡先データベースが変更されたときに通知を受けるプログラムを試しました。

プログラムを調べてみると、このサービスがアプリケーション -> 実行中のサービスの下にあることがわかります。連絡先を追加しようとすると、オブザーバーに通知が届きます。連絡先をもう一度編集すると、通知されません。連絡先を編集する場合、プログラムを実行した後初めて、コンテンツオブザーバーに通知されます。以下のコードの詳細を参照してください

サービスを開始するメインアクティビティ:

public class ContactChangeOberverServiceActivity extends Activity {
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.i("Start","Service");
        startService(new Intent(this, MyService.class));
    }
}

サービス :

public class MyService extends Service {

    private static final String TAG = "MyService";

    @Override
    public void onCreate() {
        Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStart");
        ContactObserverActivity observer = new ContactObserverActivity(new Handler());
        observer.register(getApplicationContext());
        return  super.onStartCommand(intent, flags, startId);
    }

    public boolean deliverSelfNotifications() {
        return true;
    }
}

オブザーバーは次のとおりです。

@Override
public void onChange(boolean selfChange) {
    // TODO Auto-generated method stub
    // super.onChange(selfChange);
    Log.e(TAG, "Onchange Called");
    //MainActivity.takeContactBackup();
    Intent intent = new Intent (ctx,ContactsExtractorActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    ctx.startActivity(intent);
}

/ TODO Auto-generated constructor stub
}

public void register(Context ctx) {
    Log.e(TAG, "Registering");
    this.ctx = ctx;
    curval = ctx.getContentResolver().query(
            ContactsContract.Contacts.CONTENT_URI, projection, null, null,
            null);
    curval.registerContentObserver(new ContactObserverActivity(
            new Handler()));
    Log.e(TAG, "Registered");
}

この動作とその修正方法を理解するのを手伝ってください。ありがとうございます。

4

1 に答える 1

0

この URI を使用:

ContactsContract.CommonDataKinds.Phone.CONTENT_URI

私のために働いた!

于 2013-11-07T13:27:33.050 に答える