ContentObserver не вызывает

Метод OnChange ContactObserver не вызывается, если я не запускаю приложение во второй раз. Первый запуск, который делает установку, кажется, не делает регистратор наблюдателем, даже если onCreate вызывается из Сервиса.

На втором прогоне работает без нареканий. Вы можете увидеть код ниже.

public final class ContactSync extends Service {

private ContactObserver mObserver;

public ContactSync() {
    mObserver = new ContactObserver();
}


@Override
public void onCreate() {
    super.onCreate();

    getContentResolver().registerContentObserver(ContactsContract.ProfileSyncState.CONTENT_URI, true, mObserver);

    Logger.i("Sync service is ready");
}


@Override
public void onDestroy() {
    super.onDestroy();

    getContentResolver().unregisterContentObserver(mObserver);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return Service.START_NOT_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
    throw new UnsupportedOperationException("Not yet implemented");
}

private void lookup() {
    RealmResults<Contact> all = Realm
            .getDefaultInstance()
            .where(Contact.class)
            .findAll();

    for (Contact proxy : all) {
        Contact concrete = Realm
                .getDefaultInstance()
                .copyFromRealm(proxy);

        Contact raw = ContactResolver
                .from(getApplicationContext())
                .setUri(concrete.data())
                .setPosition(concrete.mPosition)
                .query();

        if (raw == null) {
            delete(proxy);
        } else {
            update(raw);
        }
    }

    publish();
}

private void publish() {
    LocalBroadcastManager
            .getInstance(getApplicationContext())
            .sendBroadcastSync(new Intent(ContactEdge.PublishEvent.EVENT_PUBLISH));

    Logger.i("Published contacts");
}

private void update(@NonNull final Contact contact) {
    Realm
            .getDefaultInstance()
            .executeTransaction(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    realm.copyToRealmOrUpdate(contact);

                    Logger.json(contact);
                }
            });

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N_MR1) {
        ShortcutInfo shortcut = new ShortcutInfo.Builder(
                getApplicationContext(), contact.getId())
                .setShortLabel(contact.getShortLabel())
                .setLongLabel(contact.getLongLabel())
                .setIcon(contact.getIcon(getApplicationContext()))
                .setIntent(contact.getIntent())
                .build();

        ShortcutManager manager = getSystemService(ShortcutManager.class);
        manager.addDynamicShortcuts(Collections.singletonList(shortcut));
    }

    Logger.i("Updated contact");
}

private void delete(@NonNull final Contact contact) {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N_MR1) {
        ShortcutManager manager = getSystemService(ShortcutManager.class);
        manager.removeDynamicShortcuts(Collections.singletonList(contact.getId()));
    }

    Realm
            .getDefaultInstance()
            .executeTransaction(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    contact.deleteFromRealm();
                }
            });

    Logger.i("Deleted contact");
}

final class ContactObserver extends ContentObserver {

    ContactObserver() {
        super(new Handler(Looper.getMainLooper()));
    }

    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);

        lookup();
    }
}

Мой класс приложения:

public final class MyApplication extends Application {

@Override
public void onCreate() {
    super.onCreate();

    Fresco.initialize(this);
    Realm.init(this);

    startContactSync();
}

private void startContactSync() {
    Intent service = new Intent(this, ContactSync.class);
    startService(service);
}

И элемент xml в элементе приложения файла Manifest.

        <service
        android:name=".ui.edge.contact.ContactSync"
        android:enabled="true"
        android:exported="false"/>

1 ответ

Решение

Кажется, все хорошо, возможно, вам не хватает разрешения?

Другие вопросы по тегам