〈kotlin〉Android studio使い方メモ8:Service

金宏和實さんの「作ればわかる!Androidプログラミング kotlin対応」を参考に
Android studioでkotlinを使ってAndroidアプリ作成。


アクティビティがバックグラウンドになっても動作を続けるためにサービスを設定。

サービスとは

通常アクティビティは他のアプリの起動などによって
フォアグラウンドからバックグラウンドに引っ込むと処理が停止する。
サービスはバックグラウンドでも処理を実行する仕組みで、
Serviceクラスを使うことで画面状態に関係なく処理を継続することができる。

サービスの状態遷移

開始:他のアクティビティからstartService()メソッドで呼び出し

onCreate():初期化処理、既にサービスが起動している場合はスキップされる

onStartCommand():サービスが開始すると呼び出される

idle:いつでも実行可能な状態

終了指示:他のアクティビティからstopService()メソッドで呼び出されるか、
     stopSelf()を呼び出して自身で終了する

onDestroy():サービス終了時に呼び出される

終了

参考https://developer.android.com/guide/components/services?hl=ja

バインド

アクティビティからサービスの呼び出し時にbindService()メソッドを使うと、
アクティビティからサービスを利用できる(制御できる)ようになる。
(startService()メソッドだとサービスが起動し続ける処理をするだけで制御はできない)
サービスのバインドを許可するためには、サービス側にonBind()メソッドを実装する。
onBind()メソッドは、アクティビティとサービスの通信に使用するインターフェースとなるIBinderを返り値とする。
バインドを許可しない場合は、onBind()メソッドはnullを返すように設定しておく。

参考https://developer.android.com/guide/components/bound-services?hl=ja

実装

MyService.kt

class MyService : Service() {
    override fun onCreate() {
        super.onCreate()
        //処理
    }

 override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        //処理
        return super.onStartCommand(intent, flags, startId)
    }
 
 override fun onDestroy() {
        super.onDestroy()
        //処理
    }

  override fun onBind(intent: Intent): IBinder? {
        return null
    }
}

 

マニフェストファイルには、applicationの子要素としてserviceを追加する。
Android studioでは自動で入力される。

AndroidManifest.xml

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