簡単にインテントサービスを知りたい人向け。

 AndroidのIntentServiceはServiceよりも簡単で、マルチスレッドが必要なければこちらを利用することが推奨されている。なので一般的にはこちらを使ったほうが楽だと思われる。
 基本的にはAndroid StudioからNew→Service→Service(Intent Service)を選択すると自動的にマニフェストが書き換えられ、クラスのテンプレートも生成されるので、それに書き加えていくだけでいい。
 ただ、この作成されるテンプレートが複雑で難解なので理解するのに苦しむ。たぶんgoogleとしては、こうやって一つのクラスを共有してサービスを利用しろということだと思われる。
 生成されるクラスを説明するために簡易的に下記のように変更してみた。
 まずはコンパニオンオブジェクトのstartActionTESTから始まる。これはstaticのようなものなので、SimpleIntentServiceのインスタンスを生成しなくてもSimpleIntentService.startActionTESTメソッドを実行できる。
 サービスの実行はstartActionTESTの中で行われる。
 例によってデータのやりとりはputExtraを使ってintent経由で行われる。
 サービスが実行されるとonStartCommandが実行される。またIntentServiceは処理終了後に自動的に破棄されるので自動的にonDestroyが呼ばれる。
 サービスを実行する本体はonHandleIntentだが、テンプレートでは呼び出し元によって処理を振り分けるような処理をしている。なので、一つのアプリではサービスを一つだけ作って共用するのが礼儀らしい。
 これに新しいサービスを追加する場合には、コンパニオンオブジェクトに新しいメソッドを追加してintent.actionを独自のaction名で設定してonHandleIntentのwhen文でaction名によって処理を振り分ける。
 データを送りたい場合はメソッドに引数を追加してputExtraを増やして送ってあげればいい。
 面倒くさい実装だけど、サービスをあれこれついかしてファイルが増えてややこしくなるよりいいのだろう。

class SimpleIntentService : IntentService("SimpleIntentService") {
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        //サービススタート時に呼ばれる
        return super.onStartCommand(intent, flags, startId)
    }

    override fun onDestroy() {
        //サービスが終了したときに呼ばれる
        super.onDestroy()
    }

    override fun onHandleIntent(intent: Intent?) {
        //呼び出し元によって処理を振り分ける
        intent?.let {
            when (it.action) {
                ACTION_TEST -> {
                    handleActionTEST(intent.extras.getString(EXTRA_PARAM1))
                }
            }
        }
    }

    private fun handleActionTEST(text: String) {
        //実際の処理を記述する
    }

    companion object {
        private val ACTION_TEST = "jp.test.to.testapplication.action.TEST"
        private val EXTRA_PARAM1 = "jp.test.to.testapplication.extra.PARAM1"

        //ここがはじまり
        fun startActionTEST(context: Context) {
            val intent = Intent(context, SimpleIntentService::class.java)
            intent.action = ACTION_TEST
            //データのやりとりはintentを経由して行う
            intent.putExtra(EXTRA_PARAM1, "ぬるぽ")
            context.startService(intent)
        }

        //処理を追加する場合は、ここに新しいメソッドを追加する
        //引数を増やせばデータを渡せる
        //func startActionTest1(context: Context, data: Int)
    }
}

 サービスを始めるには以下のようにする。コンパニオンオブジェクトはstaticなのでインスタンスを生成しなくても作成できる。

SimpleIntentService.startActionTEST(this)