2017-05-02 1 views
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"/> 

답변

1

모든 것이 잘 보이지만 권한이없는 것 같습니다.

+1

감사합니다. 그게 처음으로 작동하지 않는 이유를 설명합니다. 허가가 아직 부여되지 않았기 때문입니다. –

관련 문제