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.