运行Workmanager请求时,Android Widget onReceive()被多次调用

发布于 2025-01-28 23:30:47 字数 2096 浏览 5 评论 0原文

我有一个应用程序,该应用程序通过glanceappwidget()具有主屏幕窗口小部件。

我想在content() glanceappwidget()的功能中运行一个工人。我已经使用inqueue(Work)Workmanager API成功地执行了我的工作。

问题在于OnReceive被称为多个(无限)次数。如何在没有onReceive多次的情况下运行工人一次?

class MyWidget : GlanceAppWidget() {

    @Composable
    override fun Content() {

        val work = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
        WorkManager.getInstance().enqueue(work)

        //some composable/ui code that consumes worker output
    }
}
class MyWorker(
    private val context: Context,
    private val workerParameters: WorkerParameters
    ) : CoroutineWorker(context, workerParameters) {


    override suspend fun doWork(): Result {
        return try {
            startForegroundService()
            //some task here
            Result.Success.success(
                workDataOf(
                    "MyKey" to "worker completed successfully"
                )
            )
        } catch (throwable: Throwable) {
            Result.failure()
        }
    }


    private suspend fun startForegroundService() {
        setForeground(
            ForegroundInfo(
                Random.nextInt(),
                NotificationCompat.Builder(context, "download_channel")
                    .setSmallIcon(R.drawable.ic_launcher_background)
                    .setContentText("Downloading...")
                    .setContentTitle("Download in progress")
                    .build()
            )
        )
    }
}
class GlanceReceiver : GlanceAppWidgetReceiver() {

    override val glanceAppWidget: GlanceAppWidget
        get() = MyWidget()

    override fun onReceive(context: Context, intent: Intent) {
        super.onReceive(context, intent)
    }

    override fun onUpdate(
        context: Context,
        appWidgetManager: AppWidgetManager,
        appWidgetIds: IntArray
    ) {
        super.onUpdate(context, appWidgetManager, appWidgetIds)
    }
}

I have an app which has a home screen widget via GlanceAppWidget().

I would like to run a worker inside the Content() function of GlanceAppWidget(). I have used enqueue(work) from WorkManager api to successfully execute my worker.

The problem is that onReceive is getting called multiple (infinite) number of times. How can I run the worker once without having onReceive called multiple times?

class MyWidget : GlanceAppWidget() {

    @Composable
    override fun Content() {

        val work = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
        WorkManager.getInstance().enqueue(work)

        //some composable/ui code that consumes worker output
    }
}
class MyWorker(
    private val context: Context,
    private val workerParameters: WorkerParameters
    ) : CoroutineWorker(context, workerParameters) {


    override suspend fun doWork(): Result {
        return try {
            startForegroundService()
            //some task here
            Result.Success.success(
                workDataOf(
                    "MyKey" to "worker completed successfully"
                )
            )
        } catch (throwable: Throwable) {
            Result.failure()
        }
    }


    private suspend fun startForegroundService() {
        setForeground(
            ForegroundInfo(
                Random.nextInt(),
                NotificationCompat.Builder(context, "download_channel")
                    .setSmallIcon(R.drawable.ic_launcher_background)
                    .setContentText("Downloading...")
                    .setContentTitle("Download in progress")
                    .build()
            )
        )
    }
}
class GlanceReceiver : GlanceAppWidgetReceiver() {

    override val glanceAppWidget: GlanceAppWidget
        get() = MyWidget()

    override fun onReceive(context: Context, intent: Intent) {
        super.onReceive(context, intent)
    }

    override fun onUpdate(
        context: Context,
        appWidgetManager: AppWidgetManager,
        appWidgetIds: IntArray
    ) {
        super.onUpdate(context, appWidgetManager, appWidgetIds)
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文