根据特定日期安排定期本地通知

时间:2021-05-31 16:04:57

标签: java android android-jetpack android-workmanager

我想让一个定期工作人员根据客户收集日期的总数来安排通知。 我已经分开了,但我遇到了问题。

目标:
检查是否有明天的取货日期的客户,然后安排明天上午 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+ 设备中,它会在我打开应用后显示。

1 个答案:

答案 0 :(得分:1)

根据我对这种情况的判断,很可能是您的 WorkManager 被关闭了,一旦您重新打开应用程序,计划任务就会运行。

这是 WorkManager 的一个已知问题,它实际上不是 WorkManager 问题,而是操作系统问题。 WorkManager 的行为如下:

任务管理器关闭: 工作继续(稍后)

重启设备(工作运行): 重启完成后工作继续

应用信息“强制停止”: 工作停止,只有再次启动应用程序才会继续

重启设备(工作是“强制停止”): 在再次启动应用程序之前,工作不会继续

这个问题是一些设备实现了从最近菜单中杀死应用程序作为强制停止。默认情况下,大多数流行的应用程序都被列入操作系统的白名单。可能有一种解决方法可以让用户将您的应用列入白名单,尽管我认为这不合适。

您可以进一步讨论 herehere too 以获得进一步的想法。