简体   繁体   English

在 Worker 中以意图启动活动在某些设备上不起作用

[英]Starting activity with an intent in a Worker does not work on some devices

I am trying to implement a Worker using WorkManager API to open an activity only once on a specific time/date when the app is in background, It does work in my emulator even on Android 12 but when I run it on my Redmi note 8 phone it does not open the activity although the workers are working normally on the same phone我正在尝试使用WorkManager API 实现一个Worker ,以便在应用程序处于后台时的特定时间/日期仅打开一次活动,即使在 Android 12 上它也可以在我的模拟器中运行,但是当我在我的 Redmi note 8 手机上运行它时尽管工作人员在同一部手机上正常工作,但它不会打开活动
OpenActivityWorker.kt OpenActivityWorker.kt

class OpenActivityWorker(val context: Context, private val workerParameters: WorkerParameters) : Worker(context, workerParameters) {
    @OptIn(DelicateCoroutinesApi::class)
    override fun doWork(): Result {
        Handler(Looper.getMainLooper()).post(Runnable {
            val intent = Intent(context, MainActivity::class.java)
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            val res = context.startActivity(intent)
            Log.d("OpenActivityWorker", "doWork: $res")
        })
        return Result.success()
    }
}

And I register the worker as follows:我将工人注册如下:

val oneTimeWorkRequestActivity = OneTimeWorkRequest.Builder(OpenActivityWorker::class.java)
            .setInitialDelay(SOME_MILLIS,
                TimeUnit.MILLISECONDS
            )
            .setInputData(
                Data.Builder()
                    .putLong("startAt", SOME_MILLIS)
                    .putLong("id", SOME_ID)
                    .build()
            )
            .build()

WorkManager.getInstance(requireContext()).enqueueUniqueWork(
            "$SOME_ID",
            ExistingWorkPolicy.REPLACE,
            oneTimeWorkRequestActivity
        )

How to solve this, and is there some kind of permission I need to ask for to be able to start the activities from WorkManager ?如何解决这个问题,是否需要获得某种许可才能从WorkManager启动活动?

In your first code block, when do you call this line?在您的第一个代码块中,您何时调用此行?

class OpenActivityWorker(val context: Context, private val workerParameters: WorkerParameters) : Worker(context, workerParameters) {
...
override fun doWork(): Result {
    Handler(Looper.getMainLooper()).post(Runnable {
        ... 
        val res = context.startActivity(intent)
        ...
    })
    return Result.success()
}

Call the expression outside a variable like;在变量外部调用表达式,例如;

context.startActivity(intent)

:) :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM