Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从Worker中的活动访问对象?(定期更改通知)_Android_Androidx_Worker_Android Workmanager - Fatal编程技术网

Android 如何从Worker中的活动访问对象?(定期更改通知)

Android 如何从Worker中的活动访问对象?(定期更改通知),android,androidx,worker,android-workmanager,Android,Androidx,Worker,Android Workmanager,我想定期更改Worker中通知的文本。(androidx.work.WorkManager) 我的主要活动是这样的 public class MainActivity extends AppCompatActivity { ... private NotificationManagerCompat notificationManagerCompat; private NotificationCompat.Builder notificationBuilder;

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

我的主要活动是这样的

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();
    }
}
我的工人看起来像这样

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)
将简单数据传递给工作者,但我认为这没有帮助


有什么想法吗?提前感谢。

您可以创建一个具有相同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作为嵌套 类,因此我无法访问 NotificationManagerCompat和NotificationCompat.Builder实例 如上所述

为什么需要在
main活动中添加
NotificationWorker

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

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

更新


在我的Worker类中,我想访问
notificationManagerCompat
以及我在
MainActivity
中创建的
notificationBuilder
实例

您不必在
main活动中创建
notificationManagerCompat
notificationBuilder
实例,通常可以在
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, 0, 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获取
notificationTitle
notificationText
,使用R.drawable.XX从res/drawable获取
通知图标

有了它,您可以从您的工作人员那里使用
NotificationManagerCompat
NotificationCompat.Builder
,您所需要的只是一个上下文,无需执行任何活动


希望这能回答您的问题。

但是上下文如何帮助我访问
notificationManagerCompat
notificationBuilder
?我无法将其强制转换为MainActivity,因为它是应用程序上下文。@Colin您希望在MainActivity上访问哪种类型的对象?在我的工人类中,我希望访问我在MainActivity中创建的
notificationManagerCompat
notificationBuilder
实例。我现在正在使用androidbash的解决方案,除非你有更好的想法。嗨@Colin,你可以在你的自定义
Worker
中创建这些实例,而不是
MainActivity
;您通常可以在Worker类中调用
getApplicationContext()
,或者在其构造函数中使用
context
参数。。请检查更新的应答OK,它看起来像是在Worker中使用新的
NotificationCompat.Builder
NotificationManagerCompat
实例,但通知的ID相同。您为什么要使用
通知管理器
?我不需要它来更新我的通知。这种方式有什么缺点吗?我现在不仅替换了通知的文本,还替换了整个通知。您可以使用此NotificationManagerCompat而不是NotificationManager