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")
}
}
- JobIntentServiceを実行するときに使用するmethodです。 enqueueWork()は、Jobを追加するAPIです。
- JobIntentServiceが生成されるときに呼び出されます。
- Jobが追加されると(enqueueWork)、onHandleWork()がcallbackされます。
- サービスが終了すると呼び出されます。
そして 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
- エラー解決:android gradle plugin requires java 11 to run. you are currently using java 1.8.
- Android - コルーチンとRetrofitによる非同期通信の例
- Android - コルーチンでURL画像を読み込む
- Android - 振動、Vibrator、VibrationEffectの例
- Some problems were found with the configuration of task
- Query method parameters should either be a type that can be converted into a database column or a List
- UbuntuでAndroid 12オープンソースをダウンロードしてビルド
- Android - ViewModelを生成する方法
- Android - Transformations.map(), switchMap() の違い
- Android-Transformations.distinctUntilChanged()소개
- Android - TabLayoutの実装方法(+ ViewPager2)
- Android - 携帯電話の電話番号を取得する方法
- Android 12 - Splash Screens
- Android 12 - インクリメンタルインストール
- Android - adbコマンドでbugreportログファイルの抽出
- Android - adbコマンドでAppデータを削除する
- Android - adbコマンドでアプリ無効化、有効化
- Android - adbコマンドで特定のパッケージのPIDを検索
- Android - adbコマンドでパーミッションGrantまたはRevoke
- Android - adbコマンドで特定のパッケージのプロセスの終了
- Android - adbコマンドでapkのインストール、削除、
- Android - adb push、pullでファイルのコピー、ダウンロード
- Android - adbコマンドでscreen capture保存
- Android - adbコマンドでSystemアプリの削除、インストール
- Android - adbコマンドでsettings value確認、変更、
- Android 12 - IntentFilterのexported明示的な宣言
- Android - adbコマンドで工場出荷時の(Factory reset)
- Android - adb logcatコマンドでログ出力
- Android - adbコマンドでメモリダンプ(dump-heap)
- Android - adbコマンドでApp強制終了(force-stop)
- Android - adbコマンドでServiceの実行、終了
- Android - adbコマンドでActivity実行
- Android - adbコマンドでBroadcast配信
- Android - PackageManagerにPackage情報を取得する
- Android - ACTION_BOOT_COMPLETEDイベント受信