web-dev-qa-db-ja.com

START_STICKYとSTART_NOT_STICKY

アンドロイドでサービスを実装している間 START_STICKYSTART_NOT_STICKY の違いは何ですか?誰かが標準的な例をいくつか指摘できますか。

242
prago

どちらのコードも、電話がメモリ不足になり、実行が終了する前にサービスを終了した場合にのみ関係します。 START_STICKYは、十分なメモリが確保された後にサービスを再作成し、nullの意図で再度onStartCommand()を呼び出すようにOSに指示します。 START_NOT_STICKYは、サービスを再度作成しなくても済むようにOSに指示します。 OSにサービスを再作成し、同じ意図をonStartCommand()に再配信するように指示する3番目のコードSTART_REDELIVER_INTENTもあります。

Dianne Hackbornによるこの記事は、この背景を公式文書よりもはるかに優れていると説明しています。

ソース: http://Android-developers.blogspot.com.au/2010/02/service-api-changes-starting-with.html

ここで重要なのは、関数によって返される新しい結果コードです。実行中にプロセスが強制終了された場合、サービスに対してサービスが何をすべきかをシステムに伝えます。

START_STICKYは基本的に以前の動作と同じです。サービスは「開始」されたままで、後でシステムによって再起動されます。プラットフォームの以前のバージョンとの唯一の違いは、プロセスが強制終了されたために再起動された場合、onStartCommand()は、まったく呼び出されるのではなく、nullのIntentを使用してサービスの次のインスタンスで呼び出されることです。このモードを使用するサービスは、常にこのケースをチェックして適切に対処する必要があります。

START_NOT_STICKYは、onStartCreated()から戻った後、残りの開始コマンドなしでプロセスが強制終了された場合、サービスは再起動されずに停止されることを示しています。これは、送信されたコマンドの実行中にのみ実行されることを目的としているサービスにとっては、はるかに意味があります。たとえば、あるネットワーク状態をポーリングするために、アラームから15分ごとにサービスが開始される場合があります。その仕事をしている間にそれが殺されるならば、それがただ止まって、次に警報が発火する時に始められるようにするのが最善です。

START_REDELIVER_INTENTはSTART_NOT_STICKYに似ていますが、サービスのプロセスが特定のインテントに対してstopSelf()を呼び出す前に強制終了された場合を除き、そのインテントは完了するまで再配信されます。その時点でシステムはあきらめます)。これは、やるべき仕事の命令を受け取っていて、それらが最終的に送られたそれぞれの命令のための仕事を完成させるのを確実にしたいというサービスのために役に立ちます。

339
Frank Leigh

KISS 答え

差:

START_STICKY

それが殺された後、システムはあなたのサービスを再作成しようとします

START_NOT_STICKY

それが殺された後、システムはしないあなたのサービスを再作成しようとします


標準的な例:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}
92
Oded Breiner

START_STICKYSTART_NOT_STICKYのドキュメントはとても簡単です。

START_STICKY:

このサービスのプロセスが(onStartCommand(Intent, int, int))から戻った後)開始されている間に強制終了された場合は、開始状態のままにしてください。ただし、この配信された意図は保持しないでください。 state、新しいサービスインスタンスを作成した後にonStartCommand(Intent, int, int)を呼び出すことを保証します;サービスに配信される保留中のstartコマンドがない場合は、nullのintentオブジェクトで呼び出されるので、これを確認する必要があります。

このモードは、BGM再生を実行するサービスなど、任意の期間実行を明示的に開始および停止することに意味があります。

例: ローカルサービスのサンプル

START_NOT_STICKY:

onStartCommand(Intent, int, int))から戻った後でこのサービスのプロセスが強制終了され、それに新しい開始意図がない場合は、サービスを開始状態から外し、Context.startService(Intent)を明示的に呼び出すまで再作成しないでください。保留中のインテントがない場合、サービスは再開されないため、サービスはnullインテントを含むonStartCommand(Intent, int, int)呼び出しを受け取りません。

このモードは、起動した結果として何らかの作業を行いたい場合には意味がありますが、メモリ不足の場合は停止できます。後で作業を行うために明示的に再開することができます。このようなサービスの例としては、サーバーからのデータをポーリングするサービスがあります。アラームがサービスを開始するようにすることで、アラームがN分ごとにポーリングされるようにスケジュールすることができます。そのonStartCommand(Intent, int, int)がアラームから呼び出されると、N分後に新しいアラームをスケジュールし、ネットワーキングを行うためのスレッドを生成します。そのチェックを行っている間にそのプロセスが強制終了された場合、サービスはアラームが発生するまで再開されません。

例: ServiceStartArguments.Java

23
Marvin Pinto