Sri*_*m R 5 android android-workmanager
所以我有一个 Worker,它必须从预定的第二天开始运行。所以如果工作在今天晚上 8 点被激活,那么我需要在第二天上午 9 点执行工作。所以我用OneTimeWorkRequest用setInitialDelay()。
这是代码
val currentTime = System.currentTimeMillis()
// calculate the timestamp for next dat 9AM
val calendar = Calendar.getInstance()
calendar.set(Calendar.HOUR_OF_DAY, 9)
calendar.set(Calendar.MINUTE, 0)
calendar.set(Calendar.SECOND, 0)
// next day
calendar.add(Calendar.DAY_OF_MONTH, 1)
val tomorrowTime = calendar.timeInMillis
val timeDiffBetweenNowAndTomorrow = tomorrowTime - currentTime
Timber.i("Tomorrow date is ${calendar.timeInMillis}")
Timber.i("Difference between now and tomorrow ${timeDiffBetweenNowAndTomorrow}")
val randomWorkRequest = OneTimeWorkRequestBuilder<RandomWallpaperWorker>()
.setInitialDelay(timeDiffBetweenNowAndTomorrow, TimeUnit.MILLISECONDS)
.build()
WorkManager.getInstance().enqueue(randomWorkRequest)
Run Code Online (Sandbox Code Playgroud)
但是我查了一下,第二天醒来的时候工作没有执行。为什么不安排呢?我计算第二天的时间戳的方式有问题吗?
正如我们在 Google 的问题跟踪器中看到的:
不幸的是,某些设备会从最近使用的菜单中终止该应用程序作为强制停止。普通 Android 不会这样做。当应用程序被强制停止时,它无法执行作业、接收警报或广播等。因此不幸的是,我们无法解决它 - 问题在于操作系统,并且没有解决方法。
因此,您需要一个Service来维持您的应用程序的运行。此外,当Service终止时(无论原因是什么),它应该再次启动并初始化您的工作程序,以确保其执行并保持工作程序任务处于活动状态。这是使用STICKY IntentService.
壁纸服务.kt
import android.app.IntentService
import android.app.Service
import android.content.Context
import android.content.Intent
import android.util.Log
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import java.util.*
import java.util.concurrent.TimeUnit
class WallpaperService : IntentService("WallpaperService") {
override fun onHandleIntent(intent: Intent?) {
intent?.apply {
when (intent.action) {
ACTION_SETUP_WORKER -> {
setupWorker()
}
}
}
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
super.onStartCommand(intent, flags, startId)
// Define service as sticky so that it stays in background
return Service.START_STICKY
}
private fun setupWorker() {
val calendar = Calendar.getInstance()
val currentTime = calendar.timeInMillis
// for removing from recent apps test
// calendar.add(Calendar.SECOND, 10)
calendar.set(Calendar.HOUR_OF_DAY, 9)
calendar.set(Calendar.MINUTE, 0)
calendar.set(Calendar.SECOND, 0)
calendar.set(Calendar.MILLISECOND, 0)
calendar.add(Calendar.DAY_OF_MONTH, 1)
val tomorrowTime = calendar.timeInMillis
val timeDiffBetweenNowAndTomorrow = tomorrowTime - currentTime
Log.i("WallpaperService", "************ Tomorrow date is ${calendar.timeInMillis}")
Log.i("WallpaperService", "************ Difference between now and tomorrow $timeDiffBetweenNowAndTomorrow")
val randomWorkRequest = OneTimeWorkRequestBuilder<RandomWallpaperWorker>()
.setInitialDelay(timeDiffBetweenNowAndTomorrow, TimeUnit.MILLISECONDS)
.build()
WorkManager.getInstance().enqueue(randomWorkRequest)
}
companion object {
const val ACTION_SETUP_WORKER = "ACTION_SETUP_WORKER"
fun setupWorker(context: Context) {
val intent = Intent(context, WallpaperService::class.java)
intent.action = ACTION_SETUP_WORKER
context.startService(intent)
}
}
}
Run Code Online (Sandbox Code Playgroud)
RandomWallpaperWorker.kt
import android.content.Context
import android.util.Log
import androidx.work.Worker
import androidx.work.WorkerParameters
class RandomWallpaperWorker(val context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
// Do what you want here...
Log.e("RandomWallpaperWorker", "***************** DONE!" )
WallpaperService.setupWorker(context)
return Result.SUCCESS
}
}
Run Code Online (Sandbox Code Playgroud)
MainActivity.kt
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
WallpaperService.setupWorker(applicationContext)
}
}
Run Code Online (Sandbox Code Playgroud)
清单.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.aminography.workerapplication">
<application ... >
...
<service android:name=".WallpaperService" android:enabled="true"/>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)