Android - JobIntentService使用方法

By JS | Last updated: December 29, 2019

JobIntentServiceはIntentServiceと非常に似ています。 インテントを渡してサービスでどのJobを実行するようにすることができます。

違いは、JobIntentServiceはJobSchedulerで動作になります。 JobServiceはstartService()で実行していた一方で、JobIntentServiceはenqueueWork()で実行することができます。

Jobは、一般的にすぐに実行されますDoze状態などの理由で遅延することができます。 IntentServiceはアプリが終了すると、Serviceも停止しますが、JobIntentServiceの場合、予約されたタスクは、アプリが終了されるように実行されます。

JobIntentService実装および実行する方法について説明します。

この記事の例では、kotlinで作成されました。

実装

まず、 JobIntentServiceを継承するサービスを作成します。

class MyJobIntentService : JobIntentService() {

    companion object {
        const val TAG = "MyJobIntentService"
        const val JOB_ID = 1001

    }

    // 1
    fun enqueueWork(context: Context, work: Intent) {
        enqueueWork(context, MyJobIntentService::class.java, JOB_ID, work)
    }

    // 2
    override fun onCreate() {
        super.onCreate()
        Log.d(TAG, "Job execution started")
    }

    // 3
    override fun onHandleWork(intent: Intent) {
        Log.d(TAG, "MSG: ${intent?.getStringExtra("MSG")}")
        for (i in 1..10) {
            Thread.sleep(1000)
            Log.d(TAG, "onHandleWork() : $i")
        }
    }

    // 4
    override fun onDestroy() {
        super.onDestroy()
        Log.d(TAG, "Job execution finished")
    }
}
  1. JobIntentServiceを実行するときに使用するmethodです。 enqueueWork()は、Jobを追加するAPIです。
  2. JobIntentServiceが生成されるときに呼び出されます。
  3. Jobが追加されると(enqueueWork)、onHandleWork()がcallbackされます。
  4. サービスが終了すると呼び出されます。

そして AndroidManifest.xmlに次のように登録する必要があります。

<uses-permission android:name="android.permission.WAKE_LOCK" />

<service android:name=".MyJobIntentService"
         android:permission="android.permission.BIND_JOB_SERVICE"/>

android.permission.WAKE_LOCK permissionを登録する理由は、Jobが実行されるとき、Wake Lockをキャッチすることができるからです。

サービスに android.permission.BIND_JOB_SERVICEパーミッションを登録する理由は、JobServiceのみがサービスにアクセスできるように作るためです。

実行

サービスは、次のようなコードで実行することができます。 enqueueWork()はJobを登録しschedulingできるようにします。

val intent = Intent(this, MyJobIntentService::class.java)
intent.putExtra("MSG", "Do something")
startService(intent)
MyJobIntentService().enqueueWork(this,intent)

上記のコードの実行結果は、次のとおりです。

12-29 21:36:31.675  9995 10021 D MyJobIntentService: MSG: Do something
12-29 21:36:32.686  9995 10021 D MyJobIntentService: onHandleWork() : 1
12-29 21:36:33.698  9995 10021 D MyJobIntentService: onHandleWork() : 2
12-29 21:36:34.709  9995 10021 D MyJobIntentService: onHandleWork() : 3
12-29 21:36:35.737  9995 10021 D MyJobIntentService: onHandleWork() : 4
12-29 21:36:36.751  9995 10021 D MyJobIntentService: onHandleWork() : 5
12-29 21:36:37.761  9995 10021 D MyJobIntentService: onHandleWork() : 6
12-29 21:36:38.774  9995 10021 D MyJobIntentService: onHandleWork() : 7
12-29 21:36:39.785  9995 10021 D MyJobIntentService: onHandleWork() : 8
12-29 21:36:40.798  9995 10021 D MyJobIntentService: onHandleWork() : 9
12-29 21:36:41.810  9995 10021 D MyJobIntentService: onHandleWork() : 10
12-29 21:36:41.815  9995  9995 D MyJobIntentService: Job execution finished

この記事で使用した例では、GitHubで確認することができます。

参考

Related Posts

codechachaCopyright ©2019 codechacha