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

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

我的Mainactivity看起来像这样

public class VariableDeclaration
{
   public static void main(String[] args)
   {
     int speed,time,distance;

     speed = 20;
     time = 10;
     distance = speed * time;

     System.out.println(distance);
   }
}

我的工人看起来像这样

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);
    }

   ...

}

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

我知道我可以将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(); } } 的简单数据传递给Worker,但我认为这没有帮助...

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

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

您可以创建具有相同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.
    }
,

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

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

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

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

更新

在我的工人班上,我想访问notificationManagerCompat 和在notificationBuilder中创建的MainActivity实例。

您不必在notificationManagerCompat中创建notificationBuilderMainActivity实例,通常可以在NotificationWorker中创建它们

这是您代码中的演示

public class NotificationWorker extends Worker {
    private final NotificationManagerCompat notificationManagerCompat;
    private final NotificationCompat.Builder notificationBuilder;

    public NotificationWorker(@NonNull Context context,@NonNull WorkerParameters params) {
        super(context,params);

        PendingIntent pendingIntent = PendingIntent.getActivity
                (context,new Intent(context,MainActivity.class),PendingIntent.FLAG_UPDATE_CURRENT);

                        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());

    }

    @NonNull
    @Override
    public Result doWork() {
        Calendar calendar = new GregorianCalendar();
        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();
    }
}

您可以使用R.string.XX从res / string中获取notificationTitlenotificationText,并使用R.drawable.XX从res / drawable中获取notification_icon

通过此操作,您可以使用来自Worker的NotificationManagerCompatNotificationCompat.Builder,您只需要一个上下文,而无需活动。

希望这能回答您的问题。

本文链接:https://www.f2er.com/2761362.html

大家都在问