Android Jetpackシリーズ---WorkManager

14956 ワード

WorkManagerを使用すると、アプリケーションの終了またはデバイスの再起動時に実行すべき遅延可能な非同期タスクを簡単にスケジュールできます.遅延可能な実行(すなわち、すぐに実行する必要はありません)に使用し、アプリケーションの終了またはデバイスの再起動時に信頼性の高い実行が必要なタスクをスケジュールできます.
非同期タスクとサービスとの違いは何ですか?では、その特性についてお話ししましょう.(1)環境制約:WorkManagerでは、ネットワークが接続されている場合や、電力が十分な場合など、タスクが実行される環境を指定できます.(2)強い生命力を持っています.タスクを開始すると、タスクは必ず実行されることが保証されます.アプリケーションを終了しても、携帯電話を再起動しても止められません.アプリケーションが実行中の場合、現在のプロセスでサブスレッド実行が有効になります.アプリケーションが実行されていない場合は、バックグラウンドで適切な方法を選択して実行します.具体的には、Androidのバージョンと依存環境に関する(3)タイミングタスク:OneTimeWorkRequestとは、タスクが1回しか実行されないことを意味し、PeriodicWorkRequestは、指定された時間が経過するとすぐに実行されるのではなく、この時間が経過した後、制約条件を満たすなどの状況になるまで、複数回実行されるタイミングタスクを開始することができます.それはやっと(4)タスクチェーンを実行します:WorkManagerは私达に一定の顺番にタスクを実行することを许してここを见て、あなたは保活を実现することができると思って、あなたに教えて、不可能で、もし上に详しく见るならば、あなたはすでにこのいくつかの点を発见したはずです:1.タイミングタスクには最小間隔時間の制限があり、15分である.タスクは、プログラムの実行時のみ実行される.Activityを引き上げられません
次の依存関係を追加します.
    def work_version = "2.4.0"
    // (Java only)
    implementation "androidx.work:work-runtime:$work_version"
    // Kotlin + coroutines
    implementation "androidx.work:work-runtime-ktx:$work_version"
    // optional - RxJava2 support
    implementation "androidx.work:work-rxjava2:$work_version"
    // optional - GCMNetworkManager support
    implementation "androidx.work:work-gcm:$work_version"
    // optional - Test helpers
    androidTestImplementation "androidx.work:work-testing:$work_version"

ワークマネージャにタスクを再試行する必要がある場合は、ワークベンチからResultに戻るバックグラウンドタスクを作成します.retry()
class MyWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
     

    override fun doWork(): Result {
     
        for (i in 1..3) {
     
            Thread.sleep(300)
            Log.i("jay", "data: ${inputData.getString("data")}")
        }
        return Result.success()
    }
}

作業に制約を追加して、作業がいつ実行できるかを指定できます.
        val constraints = Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .setRequiresBatteryNotLow(false)
            .setRequiresCharging(false)
            .setRequiresDeviceIdle(false)
            .setRequiresStorageNotLow(false)
            .build()
        val request = OneTimeWorkRequestBuilder<MyWorker>()
            .setConstraints(constraints)
            .build()
        WorkManager.getInstance(this).enqueue(request)

作業に制約がない場合、または作業がキューに追加されたときにすべての制約が満たされている場合は、すぐにタスクを実行することを選択します.タスクをすぐに実行しない場合は、最短の初期遅延時間が経過した後に開始するように作業を指定できます.
        val request = OneTimeWorkRequestBuilder<MyWorker>()
            .setInitialDelay(1, TimeUnit.MINUTES) //    1     
            .build()
        WorkManager.getInstance(this).enqueue(request)

データを入力パラメータとして入力したり、結果として返したりする必要がある場合があります.
        val data= workDataOf("data" to "walking pig's hoof")
        val request = OneTimeWorkRequestBuilder<MyWorker>()
            .setInputData(data)
            .build()
        WorkManager.getInstance(this).enqueue(request)
class MyWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
     

    override fun doWork(): Result {
     
        for (i in 1..3) {
     
            Thread.sleep(300)
            Log.i("jay", "     : ${inputData.getString("data")}")
        }
        val outputData = workDataOf("workerData" to "     ")
        return Result.success(outputData)
    }
}

Unique Workは、1回限りの作業と定期的な作業に適用できます.これらの方法を呼び出すことで、重複作業を計画しているか、または1回限りの作業を計画しているかによって、一意の作業シーケンスを作成します.EnqueueUniqueWork()ワンタイムワークWorkManager.EnqueueUniquePeriodicWork()定期的な作業の2つの方法では、3つのパラメータが使用されます.uniqueWorkName:作業要求を一意に識別する文字列existingWorkPolicy:競合解決ポリシーにより、WorkManagerに、REPLACE、KEEP、APPENDワークを含む一意の名前を持つ未完了のワークチェーンがすでに存在する場合、どのようにするかを示します.
        val sendLogsWorkRequest =
            PeriodicWorkRequestBuilder<MyWorker>(24, TimeUnit.HOURS)
                .setConstraints(
                    Constraints.Builder()
                        .setRequiresCharging(true)
                        .build()
                )
                .build()
        WorkManager.getInstance(this).enqueueUniquePeriodicWork(
            "sendLogs",
            ExistingPeriodicWorkPolicy.KEEP,
            sendLogsWorkRequest
        )