【发布时间】:2021-05-31 16:04:57
【问题描述】:
我想让一个定期工作人员根据客户收集日期的总数安排通知。 我已经分开了,但我面临一个问题。
目标:
检查是否有明天取货日期的客户,然后安排在明天上午 10 点显示通知以提醒用户,并每天重复同样的事情。
我所做的工作:
首先,我基于定期工作管理器研究了这个解决方案。
CollectionNotificationWorker.java:
public class CollectionNotificationWorker extends Worker {
public static final String WORKER_TAG = "COLLECTION_NOTIFICATION_WORKER_TAG";
private final Context context;
public CollectionNotificationWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
this.context = context;
}
@NonNull
@Override
public Result doWork() {
checkTomorrowsCollection(
//tomorrow's date
);
return Result.success();
}
private void checkTomorrowsCollection(String date) {
DbOperationCaller.read(AppDatabase.getAppDatabase().getCustomerDao()
.countCollectionByDate("%" + date + "%"),
new GenericOnceTimeReadingDbOperationObserver<Integer>() {
@Override
public void onSuccess(@NotNull Integer customersWithCollectionDate) {
if (customersWithCollectionDate > 0) {
setAlarm();
}
}
}
);
}
private void setAlarm() {
AlarmManager am = (AlarmManager) SharedLibrary.getApplicationContext()
.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(getApplicationContext(), AlarmBroadcast.class);
PendingIntent pendingIntent =
PendingIntent.getBroadcast(
context,
ALARM_REQUEST_CODE,
intent,
PendingIntent.FLAG_ONE_SHOT);
am.set(AlarmManager.RTC_WAKEUP,
//tomorrow's date , pendingIntent);
}
AlarmBroadcast.java:
public class AlarmBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
DbOperationCaller.read(AppDatabase.getAppDatabase().getCustomerDao()
.countCollectionByDate(
"%" + convertToString(getCurrentCalendar().getTime()) + "%"
),
new GenericOnceTimeReadingDbOperationObserver<Integer>() {
@Override
public void onSuccess(@NotNull Integer customersWithCollectionDate) {
if (customersWithCollectionDate > 0) {
setupNotification(context, customersWithCollectionDate);
}
}
}
);
}
private void setupNotification(Context context, int customersWithCollectionDate) {
// setup Notification here ...
}
}
MainActivity.java:
PeriodicWorkRequest collectionCheckerWorkRequest = new PeriodicWorkRequest
.Builder(CollectionNotificationWorker.class, 15, TimeUnit.MINUTES)
.build();
WorkManager.getInstance(this)
.enqueue(collectionCheckerWorkRequest);
问题:
通知在某些情况下不显示,并且在 android 11+ 设备中,它会在我打开应用程序后显示。
【问题讨论】:
标签: java android android-jetpack android-workmanager