自分用　Serviceについてまとめてみた

自分用　Serviceの基本についてまとめてみた。

## Serviceとは？
バックグラウンドで動作するコンポーネントであり、
アプリケーションのメインスレッドとは別のスレッドでタスクを実行できるようにします。

Serviceはバックグラウンドで動作するため、ユーザーインターフェースを持たず、他のアプリケーションコンポーネントとは独立して実行されます。

***Serviceを活用した機能***
①バックグラウンドでの音楽再生
②ファイルのダウンロード
③位置情報サービス


## Serviceのライフサイクル
AndroidのServiceには、Activityのようなライフサイクルがあり、以下のメソッドで構成されています。
Serviceには２つの種類があり、それぞれ異なったライフサイクルのメソッドを持っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577803/58764803-0571-f1d9-47a9-4599481a5032.png)

### onCreate()
***呼び出しタイミング：***サービスが最初に開始されたときに一度だけ呼び出されます。
***役割：*** サービスが最初に作成されたときに呼ばれ、初期化や一度だけ実行される初期設定のために使用されます。

どちらのライフサイクルでも最初に呼ばれるのが特徴です。

---
startService()の時のメソッド
### onStartCommand(intent: Intent?, flags: Int, startId: Int): Int
***呼び出しタイミング：***サービスが開始されるたびに呼び出されます。
***役割：***バックグラウンドで実行されるタスクを開始します。
　　　
startService() メソッドによって開始されたときに実行されるメソッドです。

---
bindService()の時のメソッド
### onBind(intent: Intent?): IBinder?
***呼び出しタイミング：*** `bindService()` メソッドが呼ばれたときに呼び出されます。
***役割：*** サービスがバウンドサービスとして開始されるときに、接続されるコンポーネントに
　　　IBinder（インターフェース）を提供します。

### onUnbind(intent: Intent?): Boolean
***呼び出しタイミング：***unbindService() メソッドが呼ばれたとき***に呼び出されます。
***役割：*** サービスが接続を解除するときに必要な処理を行います。
　　　返り値は true なら `onRebind` が呼ばれ、false なら呼ばれません。

---

### onRebind(intent: Intent?)
***呼び出しタイミング：`bindService()` メソッドが呼ばれ、前に `unbindService()` メソッドが
　　　　　　　　　　呼ばれていた場合に呼び出されます。
***役割：***サービスが再度接続されるときの処理を行います。

---

### onDestroy()
***呼び出しタイミング：***サービスが`stopSelf` メソッドや `stopService` メソッドによって
　　　　　　　　　　停止されるか、システムによって強制的に停止されると呼ばれます。
***役割：***リソースの解放や終了処理を行うために使用されます。

どちらのライフサイクルでも最後に呼ばれるのが特徴です。

## Serviceは２種類ある！
Serviceには、***startService()*** で開始されるものと ***BindService()*** の2種類があり
UIに携わるかどうかで使用するServiceが変わります。
## startService

startService() は、Androidアプリケーション内でServiceを開始するためのメソッドです。
これにより、サービスがバックグラウンドで実行されるようになります。
#### 特徴
アプリケーションコンポーネントから独立して実行されます。
#### serviceの開始
serviceを開始するには、Intentを利用して実行します。
```
//Serviceを開始する簡単な例
val serviceIntent = Intent(context, SampleService::class.java)
startService(serviceIntent)
```
#### serviceの停止
Serviceが必要なタスクを完了した場合、Service自体が stopSelf() メソッドを呼び出して停止したり、アクティビティから stopService() メソッドを呼び出して手動で停止することがあります。

## BindService
bindService() は、Androidアプリケーション内でバインドサービス（Bound Service）を
開始するためのメソッドです。
#### 特徴
アプリケーションコンポーネントと双方向の通信を行って実行します。
#### serviceの開始
bindService() を呼び出すことで、バインドサービスとアクティビティの間に双方向の通信が確立されます。
bindService() の引数は
第一引数：バインドされるサービスのクラス
第二引数：ServiceConnection オブジェクト
　　　　　→サービスとアクティビティの間で通信するためのインターフェースが提供する
第三引数：バインド時の挙動を指定するフラグ。
　　　　　→Context.BIND_AUTO_CREATE を指定すると、サービスがまだ存在しない場合に
     　　　　　新しいサービスの作成が自動的に行われます。
```
//サービスをバインドする例
val serviceIntent = Intent(context, SampleService::class.java)
bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE)
```
#### serviceの接続/切断時の処理
ServiceConnectionインターフェースを実装することで、サービスが接続されたときと
切断されたときの処理を指定できます。
onServiceConnected メソッドでは、サービスとの通信のために使用できる IBinder インターフェースが提供されます。
```
private val serviceConnection = object : ServiceConnection {
    override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
        // サービスに接続されたときの処理
        val binder = service as SampleService.MyBinder
        val boundService = binder.getService()
        boundService.doSomething()//バインドクラスのメソッドが使える
    }

    override fun onServiceDisconnected(name: ComponentName?) {
        // サービスが切断されたときの処理
    }
}
```
バインドサービスは主に、アクティビティがサービスに対してリクエストを送り、
サービスがそのリクエストに応答するような場面で活用されます。
例えば、音楽プレーヤーアプリのアクティビティが再生、停止などのコマンドを
音楽再生サービスに送る場面が考えられます。
※メディアの再生のやり方を近日公開します。

最後に
---
簡単にでしたがServiceについてまとめてみました。