2017-01-29 18 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

関連する問題