Android 如何从Worker中的活动访问对象?(定期更改通知)
我想定期更改Worker中通知的文本。(androidx.work.WorkManager) 我的主要活动是这样的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;
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