Kotlin 在 onTaskRemoved 时启动 worker
Kotlin Start worker when onTaskRemoved
我有一项服务会在应用 removed/closed 时被调用。
该服务将启动 OneTimeWorkRequest。
当调用 onTaskRemoved 时,Workmanager 永远不会启动。
有没有办法确保当应用程序被终止时 Workmanager 开始工作?
这是我的代码:
AndroidManifest.xml
<service android:name=".OnClearFromRecentService"
android:enabled="true"
android:exported="true"
android:stopWithTask="false" />
OnClearFromRecentService.kt
class OnClearFromRecentService : Service() {
override fun onBind(p0: Intent?): IBinder? {
TODO("Not yet implemented")
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d("log", "Service Started")
return START_STICKY
}
override fun onDestroy() {
super.onDestroy()
Log.d("log", "Service Destroyed")
}
override fun onTaskRemoved(rootIntent: Intent?) {
Log.d("log", "END")
val request = OneTimeWorkRequestBuilder<BackgroundTask>()
.addTag("oneTime")
.build()
WorkManager.getInstance(this).enqueue(request)
stopSelf()
}
}
我和你有同样的问题,worker 没有被执行并开始试验。我找到了以下解决方法,代码后面只有 Thread.sleep()
。我怀疑 WorkManager
在服务被终止之前需要额外的时间来安排请求。据我了解,在安排工作请求后,保证独立于应用程序的状态执行
我测试了很多次,它总是有效。一个缺点是通常需要大约 30 秒才能执行 worker。因为是在新的进程中执行,所以好像需要一些时间。
@Override
public void onTaskRemoved(Intent rootIntent) {
Constraints constraint = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
WorkRequest workRequest = new OneTimeWorkRequest
.Builder(ServiceKilledJob.class)
.setConstraints(constraint)
.build();
workManager.enqueue(workRequest);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
P.S.: 代码在 Java 而不是 Kotlin 中,但我认为解决方法应该以任何一种方式工作。
附加说明:在 this answer 中,作者声明如果 android:stopWithTask
设置为 false
,则 onTaskRemoved
并不总是被调用。因此我建议设置 true
.
我有一项服务会在应用 removed/closed 时被调用。 该服务将启动 OneTimeWorkRequest。 当调用 onTaskRemoved 时,Workmanager 永远不会启动。
有没有办法确保当应用程序被终止时 Workmanager 开始工作?
这是我的代码: AndroidManifest.xml
<service android:name=".OnClearFromRecentService"
android:enabled="true"
android:exported="true"
android:stopWithTask="false" />
OnClearFromRecentService.kt
class OnClearFromRecentService : Service() {
override fun onBind(p0: Intent?): IBinder? {
TODO("Not yet implemented")
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d("log", "Service Started")
return START_STICKY
}
override fun onDestroy() {
super.onDestroy()
Log.d("log", "Service Destroyed")
}
override fun onTaskRemoved(rootIntent: Intent?) {
Log.d("log", "END")
val request = OneTimeWorkRequestBuilder<BackgroundTask>()
.addTag("oneTime")
.build()
WorkManager.getInstance(this).enqueue(request)
stopSelf()
}
}
我和你有同样的问题,worker 没有被执行并开始试验。我找到了以下解决方法,代码后面只有 Thread.sleep()
。我怀疑 WorkManager
在服务被终止之前需要额外的时间来安排请求。据我了解,在安排工作请求后,保证独立于应用程序的状态执行
我测试了很多次,它总是有效。一个缺点是通常需要大约 30 秒才能执行 worker。因为是在新的进程中执行,所以好像需要一些时间。
@Override
public void onTaskRemoved(Intent rootIntent) {
Constraints constraint = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
WorkRequest workRequest = new OneTimeWorkRequest
.Builder(ServiceKilledJob.class)
.setConstraints(constraint)
.build();
workManager.enqueue(workRequest);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
P.S.: 代码在 Java 而不是 Kotlin 中,但我认为解决方法应该以任何一种方式工作。
附加说明:在 this answer 中,作者声明如果 android:stopWithTask
设置为 false
,则 onTaskRemoved
并不总是被调用。因此我建议设置 true
.