2012-02-13 15 views
6

"クラッシュ"した後、サービスが自動的にActivityManagerによって再起動されないようにする方法はありますか?いくつかのシナリオでは、私は強制的にプログラムの終了時に私のサービスを殺すが、Androidがそれを再開し続けるのを望まない。Android:クラッシュ後にサービスが再起動されないようにするにはどうすればよいですか?

+1

サービスのスケルトン実装を表示します。 –

+0

通常のサービスかIntentServiceですか? –

答えて

1

サービスはSharedPreferencesに値を格納できます。たとえば、サービスの開始時に毎回次のような情報を保存できます。 store( "serviceStarted"、1);

サービスがregularyを終了すると(メッセージを送信する)、次の値を上書きします。 store( "serviceStarted"、0);

サービスが次回再起動したときに、serviceStartedの値が「1」であることが検出された場合、サービスが停止していないことを意味し、自身を再起動しました。これを検出すると、あなたのサービスは次の呼び出しを行うことができます:stopSelf();それ自体をキャンセルする。

詳細については: http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle

30

この動作は、お使いのService実装でonStartCommand()の戻り値によって定義されます。定数START_NOT_STICKYは、プロセスが「強制終了」している間に実行されている場合、サービスを再起動しないようにAndroidに指示します。言い換えれば:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // We don't want this service to continue running if it is explicitly 
    // stopped, so return not sticky. 
    return START_NOT_STICKY; 
} 

HTH

+3

解決策としてマークされていませんが、これは正解です – scooterman

+0

未解決のインテントがある場合は動作しません。私はその問題を抱えており、上記のアプローチはうまくいかない。以下のアプローチはより良い選択肢かもしれませんが、まだ実装していません。スタックオーバーフローで提案された他のアプローチを試しましたが、まだ成功していません。 –

+0

@BrianReinholdあなたの問題は、この質問に特定のひねりがあるように聞こえます。ユースケースとあなたが観察した問題について説明した記事を投稿しましたか?私はそれをもっと調べることに興味があるだろう。 – Devunwired

5

ここで私はそれが他の誰かを助けることができる場合に思い付いたソリューションです。私のアプリはまだSTART_NOT_STICKYであっても再開しました。だから代わりに私は、目的がnullであるかどうかをチェックする。これは、サービスがシステムによって再開されたことを意味する。

@Override 
public int onStartCommand(@Nullable Intent intent, int flags, int startId) { 
    // Ideally, this method would simply return START_NOT_STICKY and the service wouldn't be 
    // restarted automatically. Unfortunately, this seems to not be the case as the log is filled 
    // with messages from BluetoothCommunicator and MainService after a crash when this method 
    // returns START_NOT_STICKY. The following does seem to work. 
    Log.v(LOG_TAG, "onStartCommand()"); 
    if (intent == null) { 
     Log.w(LOG_TAG, "Service was stopped and automatically restarted by the system. Stopping self now."); 
     stopSelf(); 
    } 
    return START_STICKY; 
} 
+0

ありがとう!私は頻繁な位置更新を取得し、サービスからサーバに送信する必要がありました。アプリケーションが終了するたびに場所の更新を受信しなくなりました.2日間の苦労の後、私はあなたの答えに達し、あなたのコードを微調整しました。今のところ10秒の遅れです。そして、これは非常にうまくいっており、現在サービスからのロケーション更新を継続的に取得しています。どうもありがとう! – manoj

関連する問題