重新启用关机前未在Android启动时通知的警报(不重复)

问题描述 投票:0回答:1

我是Android通知的新手,我有一个关于设备重启后如何仅重新启用关机前未通知的警报的问题。例如:

  • 仅3个警报,所有不重复。第1天,第2天和第3天分别安排了一个警报。
  • 这些警报的信息存储在会议室数据库中。
  • [电话在第1天处于打开状态,并且警报1正常触发(用户在第1天未打开应用,因此仅将通知作为弹出窗口显示)。请注意,此警报是“事件”的一部分,并且该事件不会被删除。
  • 在第2天,电话完全关闭。
  • [电话在第3天开始时打开。预期是第2天警报将在重新启动后立即触发,然后第3天警报将在计划的时间触发。

我从阅读有关设置BootReceiver / BroadcastReceiver的理解中知道,一旦设备重新启动,所有通知都将被取消,我将需要在BootReceiver中重新启用它们。如何确保仅重新启用第2天和第3天警报?

从概念上讲,我正在考虑两种可能性:选项1:每当出现警报通知时,无需打开应用程序,请修改数据库中的标志以指示警报已触发。然后在BootReceiver内部,根据该标志过滤数据库中的活动警报以重新启用。这可能吗?警报通知弹出时,需要对数据库进行操作,甚至不启动应用程序。

选项2:在BootReceiver内部,从数据库中筛选“警报时间>上次关闭时间”。似乎有一种方法可以使用Intent.ACTION_SHUTDOWN在SharedPreferences中存储上次关闭时间,但是我不确定这是否可靠,例如如果设备意外关闭,保存成功吗?

我不确定在这个用例中我是否走对了。任何建议或代码示例将不胜感激。

android kotlin broadcastreceiver android-notifications alarmmanager
1个回答
0
投票

我有选项1可以工作。使用Google Codelab example,将存储库传递给sendNotification函数,并在末尾添加代码以修改数据库。

fun NotificationManager.sendNotification(messageBody: String, applicationContext: Context, repository: MyRepository) {
    ...
    notify(NOTIFICATION_ID, builder.build())
    val viewModelJob = Job()
    val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)

    uiScope.launch {
        withContext(Dispatchers.IO) {
            repository.updateNotificationStatus(id, true)
        }
        Timber.i("At the time when notification appears, database's status flag will change to true")
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.