我如何从Worker的Activity中访问对象? (以定期更改通知)

问题描述 投票:-1回答:2

我想定期在Worker中更改通知的文本。 (androidx.work.WorkManager)

我的MainActivity看起来像这样

public class MainActivity extends AppCompatActivity {

    ...

    private NotificationManagerCompat notificationManagerCompat;
    private NotificationCompat.Builder notificationBuilder;

    ...

    private void startNotification() {

        ...

        notificationBuilder =
                    new NotificationCompat.Builder(getApplicationContext(), warnotifier_notification_channel)
                            .setSmallIcon(R.drawable.notification_icon)
                            .setContentTitle(notificationTitle)
                            .setContentText(notificationText)
                            .setContentIntent(pendingIntent)
                            .setAutoCancel(true)
                            .setPriority(NotificationCompat.PRIORITY_LOW)
                            .setOngoing(true);

        notificationManagerCompat = NotificationManagerCompat.from(getApplicationContext());

        notificationManagerCompat.notify(1, notificationBuilder.build());

        PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(NotificationWorker.class, PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, TimeUnit.MILLISECONDS)
                    .addTag(workTag)
                    .build();

        WorkManager.getInstance(getApplicationContext()).enqueue(periodicWorkRequest);
    }

   ...

}

我的工人看起来像这样

public class NotificationWorker extends Worker {
    public NotificationWorker(@NonNull Context context, @NonNull WorkerParameters params) {
        super(context, params);
    }

    @NonNull
    @Override
    public Result doWork() {
        String notificationText = "Time: " + calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND);
        notificationBuilder.setContentText(notificationText);
        notificationManagerCompat.notify(1, notificationBuilder.build());
        return Result.success();
    }
}

不幸的是,Android不允许我将Worker作为嵌套类放置在MainActivity中,因此无法访问上述的NotificationManagerCompat和NotificationCompat.Builder实例。

我知道我可以将带有periodicWorkRequest.setInputData(inputData)的简单数据传递给工作人员,但我认为这没有帮助...

有什么想法吗?预先感谢。

android androidx worker android-workmanager
2个回答
0
投票

您可以创建具有相同ID的通知(因此为您的通知保留恒定ID)并进行通知。它会自动更新现有的]

NotificationManager notificationManager = (NotificationManager) getSystemService(
            Context.NOTIFICATION_SERVICE);
    if (notificationManager != null) {
        Create a notification object with same ID as previous one and use notify to update the existing one.
    }

0
投票

[不幸的是,Android不允许我将Worker嵌套类在我的MainActivity中,因此我无法访问NotificationManagerCompat和NotificationCompat.Builder实例如上。

为什么需要在MainActivity中添加NotificationWorker类?

正如您提到的,您只想从NotificationManagerCompat类访问NotificationCompat.BuilderWorker,对此没有任何限制,因此要构建通知,您已经将上下文传递给Worker类构造函数,并且您仍然可以从getApplicationContext()类中调用Worker。我已经测试了,没有任何问题。

希望有帮助。如有任何疑问,欢迎您。

© www.soinside.com 2019 - 2024. All rights reserved.