サービスの概要

Serviceとは 実行可能なアプリケーション コンポーネント 長時間実行オペレーションを 自動的に実行しますユーザー インターフェースは提供されません。1 回 ユーザーが別のサービスに切り替えた後も、しばらくの間サービスの実行が継続する場合があります。 説明します。また、コンポーネントはサービスにバインドして、サービスとやり取りしたり、 プロセス間通信(IPC)です。たとえば、サービスはネットワーク トランザクションを処理し、 音楽の再生、ファイルの I/O の実行、コンテンツ プロバイダとのやり取りなど、すべてをバックグラウンドから操作できます。

注意: サービスは、そのホストのメインスレッドで実行されます。 サービスは独自のスレッドを作成せず 特に指定しない限り、別のプロセスで実行されます。VM でブロッキング オペレーションを サービス内に別のスレッドを作成して、 ANR(応答なし)エラー。

サービスの種類

サービスには次の 3 種類があります。

フォアグラウンド

フォアグラウンド サービスは、ユーザーが認識できるオペレーションを できます。たとえば、オーディオ アプリでは、フォアグラウンド サービスを使用して 生成します。フォアグラウンド サービスでは通知を表示する必要があります。 ユーザーが操作を行っていない場合でも、フォアグラウンド サービスの実行を継続する 説明します。

フォアグラウンド サービスを使用する場合は、 サービスが実行されていることをユーザーが積極的に認識していることを示します。この通知は 閉じることもできます。ただし、サービスが停止されるか、 使用します。

構成方法の詳細 フォアグラウンド サービスを 。

注: WorkManager API を使用すると、タスクを柔軟にスケジュールできます。 実行可能な フォアグラウンド サービスとして使用できます。多くの場合、 WorkManager は、フォアグラウンド サービスを直接使用することをおすすめします。

背景
バックグラウンド サービスは、ユーザーによって直接認識されないオペレーションを実行する できます。たとえば、アプリがサービスを使用してストレージを圧縮した場合、 バックグラウンドサービスになります

注: API レベル 26 以降をターゲットとしているアプリの場合、バックグラウンドの実行に制限が サービスにアタッチされます。ほとんどの 特定の状況において、たとえば、 Google Chat で バックグラウンドをご覧ください。代わりに スケジュール機能を使用して WorkManager をご覧ください。

バインド
アプリケーション コンポーネントが bindService() を呼び出してサービスにバインドすると、サービスはバインドされます。バインドされたサービスは、クライアント サーバーと インターフェースを使用して、コンポーネントがサービスとやり取りし、リクエストの送信、結果の受信、 プロセス間通信(IPC)によってプロセス間で 行うこともできますバインドされたサービスは 別のアプリケーション コンポーネントがバインドされている間はコンテナを接続できます。複数のコンポーネントを すべてのバインドが解除されるとサービスは破棄されます。

通常、このドキュメントでは開始されたサービスとバインドされたサービスを別個に説明しますが、 サービスは、開始することも(無期限に実行することもできます)、 あります。これは、コンポーネントが開始できるようにする onStartCommand() とバインディングを許可する onBind() の 2 つのコールバック メソッドを実装するかどうかに関係します。

サービスが開始、バインド、またはその両方であるかにかかわらず、 コンポーネントが使用できるのと同じ方法で、サービスを(別のアプリケーションからでも)使用できる Intent で起動することでアクティビティを作成できます。ただし、kubectl の マニフェスト ファイルでサービスを非公開に設定し、他のアプリからのアクセスをブロックします。 詳しくは、 使用します

サービスとスレッドのどちらを選択するか

サービスは、ユーザーがサービス アカウントを持っていなくても、バックグラウンドで実行できるコンポーネントです。 そのため、サービス アカウントを作成する権限がある場合にのみ、 できます。

処理をメインスレッドの外部で行う必要があるが、作業をユーザーが操作している間のみ行う場合 別のアプリケーションのコンテキストで新しいスレッドを作成し、 説明します。たとえば、アクティビティの実行中にのみ音楽を再生する場合、 onCreate() でスレッドを作成し、 onStart() で実行を開始します。 onStop() で停止できます。 java.util.concurrent パッケージのスレッドプールとエグゼキュータの使用も検討してください。 または Kotlin コルーチンを使用できます。 Thread クラス。詳しくは、 詳しくは、Android でのスレッド化のドキュメントをご覧ください。 実行をバックグラウンドスレッドに移動させます

サービスを使用する場合でも、アプリケーションのメインスレッドで デフォルトです。そのため、集中的に実行する場合や、 ブロック オペレーションを実行します。

基本情報

サービスを作成するには、Service のサブクラスを作成するか、サブクラスを使用する必要があります。 継承されます。実装では、API 呼び出しの一部としてコールバック メソッドを サービスのライフサイクルの重要な側面を処理し、コンポーネントが 必要に応じてサービスにバインドしますそれらのコールバック メソッドの中でも特に重要なのは、 overrides:

onStartCommand()
別のコンポーネント(アクティビティなど)がサービスの開始をリクエストした場合、システムは startService() を呼び出してこのメソッドを呼び出します。 このメソッドを実行するとサービスが開始され、 バックグラウンドに無期限に継続できますこれを実装した場合、サービス停止の発生時にサービスを停止することは、お客様の責任で行う必要があります。 stopSelf() または stopService() を呼び出して処理を完了します。バインディングを提供するだけの場合は、 このメソッドを実装する必要があります。
onBind()
別のコンポーネントが(RPC の実行などで)サービスとバインドする必要がある場合、システムは bindService() を呼び出してこのメソッドを呼び出します。 このメソッドの実装では、クライアントが API 呼び出しを実行できるように、 IBinder を返すことで、サービスとの通信に使用することができます。常に このメソッドを実装します。ただし、バインディングを許可しない場合は、 null です。
onCreate()
サービスが稼働中になると、システムがこのメソッドを呼び出して 1 回限りの設定手順を実行します。 (またはオブジェクトを呼び出す前に) onStartCommand() または onBind())。サービスがすでに実行中の場合、このメソッドは 呼び出すことができます。
onDestroy()
サービスが使用されなくなり、破棄されると、システムがこのメソッドを呼び出します。 サービスでこれを実装して、登録されたスレッドや 呼び出すことができますこれは、サービスが受け取る最後の呼び出しです。

コンポーネントが startService() を呼び出してサービスを開始すると(その結果 onStartCommand() が呼び出される)、サービスは stopSelf() または別のコマンドで停止するまで実行を継続 コンポーネントが stopService() を呼び出して停止させます。

コンポーネントが bindService() がサービスを作成し、onStartCommand() が呼び出されない場合、サービスは実行されます。 コンポーネントがバインドされている間 のみ可能ですサービスをすべてのクライアントからバインド解除すると、 破棄されます。

Android システムがサービスを停止するのはメモリが少なく、システムを復元する必要があるとき ユーザー フォーカスがあるアクティビティのリソースです。ユーザーが存在するアクティビティにサービスがバインドされている場合、 殺される可能性が低くなる。サービスがフォアグラウンドで実行されるように宣言されている場合、強制終了されることはありません。 開始されたサービスが長時間実行されている場合、システムはその位置を下げます。 時間の経過に伴ってバックグラウンド タスクのリストに登録されなくなると、サービスの信頼性が損なわれる 強制終了。サービスが開始した場合は、再起動を適切に処理するように設計する必要がある 自動的に検出されます。システムによってサービスが強制終了された場合、リソースが使用可能になるとすぐにサービスが再起動される ただし、onStartCommand() から返す値によっても異なります。詳細情報 システムがいつサービスを破棄するかについては、プロセスとスレッド化を参照してください。 ドキュメントをご覧ください

以降のセクションでは、Terraform を使用して startService()bindService() サービス メソッドと、その使用方法 他のアプリケーション コンポーネントから呼び出すことができます。

マニフェストでサービスを宣言する

デベロッパーは、アプリケーションの マニフェスト ファイルが作成されます。

サービスを宣言するには、<service> 要素を追加します。 <application> の子として 要素です。次に例を示します。

<manifest ... >
  ...
  <application ... >
      <service android:name=".ExampleService" />
      ...
  </application>
</manifest>

<service> 要素をご覧ください。 をご覧ください。

他にも、<service> 要素に属性を追加して、 サービスの開始に必要な権限やプロセスの開始に必要な権限などの 指定します。android:name 属性は唯一の必須属性であり、サービスのクラス名を指定します。変更後 アプリケーションを公開するときは、破損のリスクを避けるため、この名前を変更しないでください。 サービスの開始やバインドを明示的インテントに頼っていたためです(ブログ投稿「 その状況は変えられません)。

注意: アプリの安全性を確保するため、必ず 明示的インテントを、Service の開始時に指定し、対象のインテント フィルタを宣言しない 提供します。暗黙的インテントを使用してサービスを開始すると、 インテントに応答するサービスを特定でき、ユーザーはどのサービスが 開始されます。Android 5.0(API レベル 21)以降では、 暗黙的インテントを含む bindService()

以下の方法で、自分のアプリでのみサービスを利用できるようにします。 android:exported を含む false に設定します。これにより、他のアプリが 暗黙的インテントで処理できます。

: ユーザーは自分のデバイスで実行されているサービスを確認できます。確認された場合 使用を停止した場合は、そのサービスを停止できます。イン ユーザーが誤ってサービスを停止するのを防ぐには、 して android:description 属性を <service> 要素を追加します。説明欄で サービスの機能とメリットを簡潔に説明する 説明します。

開始されたサービスの作成

開始されたサービスは、別のコンポーネントが startService() を呼び出して開始し、その結果としてサービスの onStartCommand() メソッドを使用します。

サービスが開始されると、そのライフサイクルは 起動したことがわかります。状態にかかわらず、サービスはバックグラウンドで無期限に実行できます。 起動したコンポーネントが破棄されます。そのため、サービスが停止した場合は、 stopSelf() を呼び出して完了するか、別のコンポーネントが 停止するには stopService() を呼び出します。

アクティビティなどのアプリ コンポーネントは、startService() を呼び出して Intent を渡すことでサービスを開始できます。 サービスを指定し、サービスが使用するすべてのデータが含まれます。サービスは、 onStartCommand() メソッドのこの Intent

たとえば、アクティビティでデータをオンライン データベースに保存する必要があるとします。アクティビティ startService() にインテントを渡すことで、コンパニオン サービスを開始し、保存するデータをサービスに配信できます。サービスは、onStartCommand() でインテントを受け取り、インターネットに接続して、 データベーストランザクションの 処理を実行しますトランザクションが完了すると、サービスは自動的に停止し、 破棄します。

注意: サービスはアプリケーションと同じプロセスで実行されます。 デフォルトでそのアプリのメインスレッド内で宣言されます。サービスが ユーザーが同じアクティビティの操作をしている間に、集中的なオペレーションまたはブロッキング オペレーションを実行する アクティビティのパフォーマンスが低下します。アプリケーションへの影響を避けるため サービス内で新しいスレッドを開始します。

Service クラスがベース クラスです。このクラスを拡張する場合は、新しいスレッドを作成し、 サービスがすべての作業を完了できるアプリケーションがアプリケーションのメインスレッドを使用して デフォルト状態のままで、アプリケーションで実行されているアクティビティのパフォーマンスが低下する可能性があります。

Android フレームワークには、IntentService も用意されています。 サブクラスを使用する Service の すべての開始要求を 1 つずつ処理するワーカー スレッドです。このクラスの使用は 新しいアプリでは推奨を推奨します。これは、 バックグラウンド実行の制限を導入しました。 また、Android 11 以降、サポートは終了しています。 JobIntentService を 新しいバージョンの Android と互換性のある IntentService の後継です。

以降のセクションでは、独自のカスタム サービスを実装する方法について説明しますが、 ほとんどのユースケースで、WorkManager の使用を強くおすすめします。Android でのバックグラウンド処理に関するガイドを確認する 貴社のニーズに合ったソリューションがないかご確認ください

Service クラスを拡張する

Service クラスを拡張できます。 処理する必要があります基本的な実装は次のようになります。

Kotlin

class HelloService : Service() {

    private var serviceLooper: Looper? = null
    private var serviceHandler: ServiceHandler? = null

    // Handler that receives messages from the thread
    private inner class ServiceHandler(looper: Looper) : Handler(looper) {

        override fun handleMessage(msg: Message) {
            // Normally we would do some work here, like download a file.
            // For our sample, we just sleep for 5 seconds.
            try {
                Thread.sleep(5000)
            } catch (e: InterruptedException) {
                // Restore interrupt status.
                Thread.currentThread().interrupt()
            }

            // Stop the service using the startId, so that we don't stop
            // the service in the middle of handling another job
            stopSelf(msg.arg1)
        }
    }

    override fun onCreate() {
        // Start up the thread running the service.  Note that we create a
        // separate thread because the service normally runs in the process's
        // main thread, which we don't want to block.  We also make it
        // background priority so CPU-intensive work will not disrupt our UI.
        HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND).apply {
            start()

            // Get the HandlerThread's Looper and use it for our Handler
            serviceLooper = looper
            serviceHandler = ServiceHandler(looper)
        }
    }

    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show()

        // For each start request, send a message to start a job and deliver the
        // start ID so we know which request we're stopping when we finish the job
        serviceHandler?.obtainMessage()?.also { msg ->
            msg.arg1 = startId
            serviceHandler?.sendMessage(msg)
        }

        // If we get killed, after returning from here, restart
        return START_STICKY
    }

    override fun onBind(intent: Intent): IBinder? {
        // We don't provide binding, so return null
        return null
    }

    override fun onDestroy() {
        Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show()
    }
}

Java

public class HelloService extends Service {
  private Looper serviceLooper;
  private ServiceHandler serviceHandler;

  // Handler that receives messages from the thread
  private final class ServiceHandler extends Handler {
      public ServiceHandler(Looper looper) {
          super(looper);
      }
      @Override
      public void handleMessage(Message msg) {
          // Normally we would do some work here, like download a file.
          // For our sample, we just sleep for 5 seconds.
          try {
              Thread.sleep(5000);
          } catch (InterruptedException e) {
              // Restore interrupt status.
              Thread.currentThread().interrupt();
          }
          // Stop the service using the startId, so that we don't stop
          // the service in the middle of handling another job
          stopSelf(msg.arg1);
      }
  }

  @Override
  public void onCreate() {
    // Start up the thread running the service. Note that we create a
    // separate thread because the service normally runs in the process's
    // main thread, which we don't want to block. We also make it
    // background priority so CPU-intensive work doesn't disrupt our UI.
    HandlerThread thread = new HandlerThread("ServiceStartArguments",
            Process.THREAD_PRIORITY_BACKGROUND);
    thread.start();

    // Get the HandlerThread's Looper and use it for our Handler
    serviceLooper = thread.getLooper();
    serviceHandler = new ServiceHandler(serviceLooper);
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
      Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();

      // For each start request, send a message to start a job and deliver the
      // start ID so we know which request we're stopping when we finish the job
      Message msg = serviceHandler.obtainMessage();
      msg.arg1 = startId;
      serviceHandler.sendMessage(msg);

      // If we get killed, after returning from here, restart
      return START_STICKY;
  }

  @Override
  public IBinder onBind(Intent intent) {
      // We don't provide binding, so return null
      return null;
  }

  @Override
  public void onDestroy() {
    Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
  }
}

このサンプルコードでは、onStartCommand() ですべての着信を処理します。 バックグラウンド スレッドで実行されている Handler に処理を POST で送信します。これは IntentService と同様に機能し、すべてのリクエストを順番に処理します。 スレッドプールで処理を実行するようにコードを変更できます。たとえば、複数のリクエストを同時に実行したい場合などです。

onStartCommand() メソッドは 整数。この整数は、システムがサービスをどのように継続して 強制終了されます。戻り値 onStartCommand() には、次のいずれかを指定してください 定数:

START_NOT_STICKY
onStartCommand() が戻った後にシステムがサービスを強制終了した場合は、保留中の場合を除いて、サービスを再作成しないでください。 提供するインテントです。これが、不要な場合にサービスの実行を回避する最も安全なオプションです。 完了していないジョブをアプリケーションで再開できます。
START_STICKY
onStartCommand() が戻った後にシステムがサービスを強制終了した場合は、サービスを再作成して onStartCommand() を呼び出しますが、最後のインテントは再配信しないでください。 代わりに、システムは onStartCommand() を null インテントを使用します。その場合、 渡されます。これは、メディア プレーヤー(または同様のサービス)で 無期限に実行され、ジョブを待機しています。
START_REDELIVER_INTENT
onStartCommand() が戻った後にシステムがサービスを強制終了した場合は、サービスを再作成し、サービスに配信された最後のインテントを使用して onStartCommand() を呼び出します。 あります。ペンディング インテントは順番に配信されます。この方法は、 ファイルのダウンロードなど、アクティブに実行していてすぐに再開する必要があるジョブ。

これらの戻り値の詳細については、リンク先のリファレンスをご覧ください。 ドキュメントをご覧ください。

サービスの開始

アクティビティやその他のアプリケーション コンポーネントからサービスを開始するには、 Intent を渡す startService() または startForegroundService() にマッピング。「 Android システムがサービスの onStartCommand() メソッドを呼び出して Intent を渡します。 開始するサービスを指定します

: API レベル 26 以降をターゲットとしているアプリの場合、 アプリが使用している場合を除き、バックグラウンド サービスの使用または作成に制限を課す フォアグラウンドにあることを確認します。アプリでフォアグラウンド サービスを作成する必要がある場合は、 アプリは startForegroundService() を呼び出す必要があります。このメソッドはバックグラウンド サービスを作成しますが、 メソッドは、サービスが自身をプロモートすることをシステムに通知します。 使用します。サービスが作成されたら、サービスはそのサービスを呼び出して、 startForeground() メソッド 5 秒としています

たとえば、前のセクション(HelloService)で説明したサンプル サービスを開始するには、次に示すように、startService() を指定した明示的インテントを使用します。

Kotlin

startService(Intent(this, HelloService::class.java))

Java

startService(new Intent(this, HelloService.class));

startService() メソッドがすぐに返され、 Android システムがサービスの onStartCommand() メソッドを呼び出します。サービスがまだ実行されていない場合、システムはまず onCreate() を呼び出してから、 onStartCommand()

サービスがバインディングも提供していない場合は、startService() で配信されるインテントが、サービス間で通信する唯一のモードになります。 コンポーネントとサービスの間の接続です。ただし、サービスから結果を返すようにする場合は、 サービスを開始するクライアントがブロードキャストの PendingIntent を作成できる。 (getBroadcast() を使用)してサービスに配信する (サービスを開始する Intent 内)。これにより、サービスは 結果を出力できます

サービスを開始するリクエストが複数あると、対応する複数の呼び出しがサービスの onStartCommand()。ただし、停止リクエストが 1 つだけ サービスを停止するために(stopSelf() または stopService() を含む)必要がある。

サービスの停止

開始されたサービスは、自身のライフサイクルを管理する必要があります。つまり、システムが停止または システムメモリやサービスを復元する必要がない限り、サービスを破棄する onStartCommand() が返された後も引き続き実行されます。「 サービスは、stopSelf() または別の コンポーネントは stopService() を呼び出すことで停止できます。

stopSelf() または stopService() で停止をリクエストすると、システムは直ちにサービスを破棄します。 考えています

サービスが onStartCommand() への複数のリクエストを同時に処理する場合は、 開始リクエストの処理が完了すると、新しい API 呼び出しを start リクエストを使用します(最初のリクエストの最後で停止すると、2 番目のリクエストも終了します)。避けるべきこと この問題については、stopSelf(int) を使用して、 サービスの停止は、常に最新の開始リクエストに基づきます。つまり、stopSelf(int) を呼び出すときに、開始リクエストの ID(startId (停止リクエストの宛先の onStartCommand() に配信されます) 確認します。この場合、stopSelf(int) を呼び出す前にサービスが新しい開始リクエストを受け取ると、ID が一致せず、サービスは停止しません。

注意: システム リソースの浪費や 動作が完了したらアプリケーションがサービスを停止するようにします。 必要に応じて、他のコンポーネントが stopService() を呼び出してサービスを停止できます。サービスのバインディングを有効にしても サービスが onStartCommand() への呼び出しを受け取った場合は、必ず自身でサービスを停止する必要があります。

サービスのライフサイクルについて詳しくは、後述のサービスのライフサイクルを管理するをご覧ください。

バインドされたサービスを作成する

バインドされたサービスとは、bindService() を呼び出して長期的な接続を作成することで、アプリケーション コンポーネントをバインドできるサービスです。 通常は、コンポーネントが startService() を呼び出して起動することはできません。

アクティビティからサービスとやり取りする場合は、バインドされたサービスを作成する アプリの機能の一部を プロセス間通信(IPC)を介して 他のアプリと通信できます

バインドされたサービスを作成するには、onBind()コールバック メソッドを実装してIBinder サービスと通信するためのインターフェースを定義します。他のアプリケーション コンポーネントは bindService(): インターフェースを取得し、 サービスのメソッドの呼び出しを開始します。このサービスは、サービスを実行するアプリケーション コンポーネントに バインドされているコンポーネントがない場合、システムによって破棄されます。 バインドされたサービスは、サービスが停止しているときと同じ方法で停止する必要はありませんonStartCommand() から開始します。

バインドされたサービスを作成するには、クライアントが IP アドレスを 通信に使用されます。サービス間のこのインターフェースは、 クライアントは IBinder の実装である必要があり、サービスがこれに該当します。 onBind() コールバック メソッドから返されます。クライアントが IBinder を受け取ったら、開始できます。 やり取りできます

複数のクライアントを同時にサービスにバインドできます。顧客とのやり取りが完了したら unbindService() を呼び出してバインドを解除します。 サービスにバインドされているクライアントがない場合、サービスはシステムによって破棄されます。

バインドされたサービスを実装する方法は複数あり、実装は 複雑だからですこのような理由から、バインドされたサービスのディスカッションは、 バインドされたサービスに関する別のドキュメント。

ユーザーへの通知の送信

サービスの実行時に、スナックバー通知ステータスバー通知を使用して、ユーザーにイベントを通知できます。

スナックバー通知は、現在のウィンドウのサーフェスに 消える一瞬です。ステータスバーの通知では、ステータスバーのアイコンと、 ユーザーがこれを選択してアクション(アクティビティの開始など)を実行できる。

通常、ステータスバーによる通知は、 ファイルのダウンロードが完了し、ユーザーが操作できるようになりました。ユーザーが 展開されたビューで通知を選択すると、通知によってアクティビティが開始されます。 (ダウンロードしたファイルを表示するなど)。

サービスのライフサイクルを管理する

サービスのライフサイクルは、アクティビティのライフサイクルよりもはるかにシンプルです。さらに、 サービスの作成と破棄の方法に細心の注意を払うことが重要です。 ユーザーが気付かないうちにバックグラウンドで 実行できます

作成から破棄までのサービス ライフサイクルは、 次の 2 つのパスのいずれかになります。

  • 開始されたサービス

    別のコンポーネントが startService() を呼び出すと、サービスが作成されます。サービスは無期限に実行され、 停止するには stopSelf() を呼び出します。また、別のコンポーネントがアプリケーションの stopService() を呼び出してサービスを更新します。サービスが停止すると、サービスは破棄します。

  • バインドされたサービス

    別のコンポーネント(クライアント)が bindService() を呼び出すと、サービスが作成されます。その後、クライアントはサービスと通信するために IBinder インターフェース経由。クライアントは、次を呼び出して接続を終了できます。 unbindService()。複数のクライアントを すべてがアンバインドされると、サービスはサービスが破棄されます。サービス 自ら停止する必要はありません

これら 2 つの経路は完全に分離しているわけではありません。サービスがすでにバインドされているサービスには、 startService() で始まる。たとえば 再生する音楽を識別する Intent を指定して startService() を呼び出し、バックグラウンド ミュージック サービスを開始します。その後、 ユーザーがプレーヤーを制御したり、プレーヤーに関する情報を取得したりする場合が考えられます。 現在の曲では、bindService() を呼び出すことで、アクティビティをサービスにバインドできます。このような場合、すべてのクライアントがアンバインドされるまで、stopService() または stopSelf() は実際にはサービスを停止しません。

ライフサイクル コールバックの実装

アクティビティと同様に、サービスには、モニタリングのために実装できるライフサイクル コールバック メソッドがあります。 サービスの状態の変化を把握し、適切なタイミングで作業を実行します。次のスケルトンは サービスは、各ライフサイクル メソッドを示しています。

Kotlin

class ExampleService : Service() {
    private var startMode: Int = 0             // indicates how to behave if the service is killed
    private var binder: IBinder? = null        // interface for clients that bind
    private var allowRebind: Boolean = false   // indicates whether onRebind should be used

    override fun onCreate() {
        // The service is being created
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        // The service is starting, due to a call to startService()
        return startMode
    }

    override fun onBind(intent: Intent): IBinder? {
        // A client is binding to the service with bindService()
        return binder
    }

    override fun onUnbind(intent: Intent): Boolean {
        // All clients have unbound with unbindService()
        return allowRebind
    }

    override fun onRebind(intent: Intent) {
        // A client is binding to the service with bindService(),
        // after onUnbind() has already been called
    }

    override fun onDestroy() {
        // The service is no longer used and is being destroyed
    }
}

Java

public class ExampleService extends Service {
    int startMode;       // indicates how to behave if the service is killed
    IBinder binder;      // interface for clients that bind
    boolean allowRebind; // indicates whether onRebind should be used

    @Override
    public void onCreate() {
        // The service is being created
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // The service is starting, due to a call to startService()
        return startMode;
    }
    @Override
    public IBinder onBind(Intent intent) {
        // A client is binding to the service with bindService()
        return binder;
    }
    @Override
    public boolean onUnbind(Intent intent) {
        // All clients have unbound with unbindService()
        return allowRebind;
    }
    @Override
    public void onRebind(Intent intent) {
        // A client is binding to the service with bindService(),
        // after onUnbind() has already been called
    }
    @Override
    public void onDestroy() {
        // The service is no longer used and is being destroyed
    }
}

注: アクティビティのライフサイクル コールバック メソッドとは異なり、 これらのコールバック メソッドのスーパークラス実装を呼び出す必要はありません

図 2. サービスのライフサイクル。左の図は 右の図は、startService() でサービスが作成されたときのライフサイクルを示し、右側の図はサービスが作成されたときのライフサイクルを示しています。 bindService() に置き換えます。

図 2 は、サービスの典型的なコールバック メソッドを示しています。図は Google Cloud の それらのサービスから startService() によって作成される 作成者: bindService()、変更しない 起動方法に関係なく、どのサービスでも、クライアントをサービスにバインドできる可能性があるので注意してください。 最初に(クライアントが startService() を呼び出すことによって)onStartCommand() で開始されたサービス onBind() への呼び出しは引き続き受信できる(クライアントが呼び出した bindService() など)。

これらのメソッドを実装することで、サービスのこの 2 つのネストされたループをモニタリングできます。 ライフサイクル:

  • サービスの全期間は、onCreate() が呼び出されてから onDestroy() が返されるまでの間に発生します。アクティビティと同様に、サービスは onCreate() を実行し、onDestroy() の残りのリソースをすべて解放します。たとえば、 音楽再生サービスは、onCreate() で音楽を再生するスレッドを作成し、onDestroy() でそのスレッドを停止できます。

    : onCreate() および onDestroy() メソッドは、すべての Service に対して startService() または bindService() によって作成される。

  • サービスのアクティブなライフタイムは、onStartCommand() または onBind() の呼び出しから始まります。 各メソッドには、startService() または bindService() に渡された Intent が渡されます。

    サービスが開始されると、その有効期間全体と同時に有効な有効期間も終了します。 onStartCommand() が終了した後もサービスは有効なままである。サービスがバインドされている場合、onUnbind() が返されるとアクティブなライフタイムが終了します。

注: 開始されたサービスは次の呼び出しによって停止しますが、 stopSelf()stopService() のいずれであっても、その値に対応するコールバックは (onStop() コールバックはありません)。サービスがクライアントにバインドされていない限り、 サービスが停止すると、システムはこれを破棄します。onDestroy() が受信する唯一のコールバックです。

バインディングを提供するサービスの作成の詳細については、バインドされたサービスのドキュメントをご覧ください。 onRebind() に関する詳細情報 ライフサイクルの管理に関するセクションの バインドされたサービス