2017-01-29 12 views
0

연락처 데이터에 변경 사항이 발생할 때이를 감지 할 수 있어야합니다 (주소록의 연락처에 대한 변경 유형).응용 프로그램이 종료되면 서비스에 등록 된 ContentObserver가 종료됩니다.

나는이 ContentObserver을 사용하고 있습니다 :

public class ContactsContentObserver extends ContentObserver { 
private Context context; 
private Handler toastMessageHandler; 

public ContactsContentObserver(Handler handler, Context ctx) { 
    super(handler); 
    context = ctx; 
} 

@Override 
public void onChange(boolean selfChange) { 
    this.onChange(selfChange,null); 
} 

@Override 
public void onChange(boolean selfChange, Uri uri) { 
    // Change Detected! Do something. 
} 

} 

나는이 같은 서비스에이 관찰자를 등록 :

@Override 
public int onStartCommand (Intent intent, int flags, int startId){ 
    super.onStartCommand(intent, flags, startId); 
    registerContactsContentObserver(); 
    return START_STICKY; 
} 

private void registerContactsContentObserver(){ 
    ContactsContentObserver myObserver = new ContactsContentObserver(new Handler(), this); 
    getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, myObserver); 
} 

내 주요 활동에서이 서비스를 시작합니다.

액티비티가 열려있는 경우 (백그라운드에서 작동하는 경우) 정상적으로 작동하며 연락처 데이터를 변경할 때마다 onChange() 메서드가 호출됩니다.

하지만 수동으로 안드로이드

내가 뭔가 잘못하고 있는가에 recent apps에서 선택을 취소하여 응용 프로그램을 닫으면 전혀 작동하지 않는 이유는 무엇입니까? 앱이 종료 된 경우에도 서비스가 실행되지 않습니까?

+0

전경에서 서비스 시작 – pskink

+0

@ pskink 감사합니다. 전경에서 서비스를 시작하면 문제가 해결되었습니다. 나는 대답을 게시했다. 나는 그것이 왜 그런 식으로 작동하는지 이해하지 못했지만. –

답변

1

이 같은 forground에서 서비스를 시작 pskink

의 도움으로 문제를 해결 할 수있었습니다 :

private void runAsForeground(){ 
    Intent notificationIntent = new Intent(this, LauncherActivity.class); 
    PendingIntent pendingIntent=PendingIntent.getActivity(this, 0, 
      notificationIntent, PendingIntent.FLAG_ONE_SHOT); 

    Notification notification=new NotificationCompat.Builder(this) 
      .setSmallIcon(R.mipmap.ic_launcher) 
      .setContentText("test") 
      .setContentIntent(pendingIntent).build(); 

    startForeground(1, notification); 

} 

@Override 
public int onStartCommand (Intent intent, int flags, int startId){ 
    super.onStartCommand(intent, flags, startId); 
    runAsForeground();    
    registerContactsContentObserver(); 
    return START_STICKY; 
} 

이 문제를 해결했다.

비록 내가 처음부터 문제가 발생했는지 이해할 수는 없지만 서비스가 끈적 거리고 앱이 닫히더라도 실행해야하기 때문에. 안드로이드가 메모리를 절약하기 위해 서비스를 중단했다하더라도, 그것을 다시 시작해야합니다.

전경에서 서비스를 시작하는 것이 백그라운드에서 정기적으로 끈적 끈적한 서비스와 다른 이유는 누군가 나에게 설명 할 수 있습니까?

+0

https://developer.android.com/guide/topics/processes/process-lifecycle.html – pskink

+0

@pskink를 참조하십시오. 제가 이해할 때, 백그라운드에서 서비스를 실행할 때마다 시스템이 서비스를 죽이자 마자 전경 활동을 마감했습니다. 그러나 알림을 사용하여 포 그라운드에서 서비스를 실행하면 시스템에서이를 더 중요하게 처리하고 닫지 않습니다. –

+0

백그라운드 서비스는 활동을 마치면 (정상적으로 버튼을 누르거나 '완료()'하고 명시 적으로 호출) 정상적으로 작동하지만 최근 앱에서 삭제되지 않습니다 – pskink