首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ContentObserver没有调用

ContentObserver没有调用
EN

Stack Overflow用户
提问于 2017-05-02 06:19:03
回答 1查看 831关注 0票数 1

除非我第二次运行应用程序,否则OnChange方法ContactObserver不会调用。它的第一次运行使安装似乎没有使注册观察者,甚至onCreate从服务调用。

在第二轮比赛中,它是完美无缺的。您可以看到下面的代码。

代码语言:javascript
复制
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();
    }
}

我的申请课:

代码语言:javascript
复制
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);
}

以及Manifest文件的应用程序元素中的xml元素。

代码语言:javascript
复制
        <service
        android:name=".ui.edge.contact.ContactSync"
        android:enabled="true"
        android:exported="false"/>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-02 06:27:37

一切看起来都很好,也许你没有得到许可?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43731322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档