0
을 호출하지 않습니다. 응용 프로그램을 두 번 실행하지 않으면 ContactObserver의 OnChange 메서드가 호출되지 않습니다. 첫 번째 실행은 설치를 만드는 것처럼 보이지만 onCreate가 Service에서 호출 되어도 등록 관찰자를 만들지 않습니다.ContentObserver가
두 번째 실행에서는 완벽하게 작동합니다. 아래 코드를 볼 수 있습니다.
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 요소입니다.
<service
android:name=".ui.edge.contact.ContactSync"
android:enabled="true"
android:exported="false"/>
감사합니다. 그게 처음으로 작동하지 않는 이유를 설명합니다. 허가가 아직 부여되지 않았기 때문입니다. –