如何在2022年为Android设备安排本地通知?

6
首先,这里大部分的答案都是两年前的。由于API更改很多,它们似乎都不再起作用了。
当我说“有效”时,我的意思是在以下情况下应该有效:
- App已关闭(即被杀死) - 手机已重新启动并且App尚未重新启动。
我正在构建一个日历样式的应用程序,用于发送本地通知和确切的时间作为提醒。
我尝试使用AlarmManager,但在我关闭App时它无法工作。如果通知安排在稍后的10分钟内出现,它会以某种方式工作。但如果超过了这个时间(如安排到第二天),它就停止工作了。然而,一旦我打开了App,所有过去已安排的通知都出现了!
Android需要认真解决他们的通知问题!
通知是制作移动应用程序的主要原因之一。否则,网站/ Web应用程序也可以正常工作。
我找到的2019年建议之一是使用前台服务。什么?这是一种过度设计,仅用于发送每周一次的通知(或我的应用程序情况)。

1
你可以使用WorkManager -> https://developer.android.com/topic/libraries/architecture/workmanager/basics#groovy。但是,为了确切的提醒,你应该使用Alarm Manager和全屏意图,并告诉用户禁用应用的电池节省功能。全屏意图通知 -> https://medium.com/android-news/full-screen-intent-notifications-android-85ea2f5b5dc1 - Ragesh Ramesh
1
谢谢@RageshRamesh。但是你的信息已经过时了。它在2019年可以使用,但是当应用程序关闭时,WorkManager将不再触发。我尝试禁用电池节省功能,但它仍然无法工作。我对全屏意图通知不感兴趣。我只想要一个简单的标准通知。 - user1034912
2个回答

0

我写了一些关于Ragesh Ramesh提到的WorkManager的代码片段。

它适用于Pixel 6中的您的使用情况。

  1. 应用程序已关闭(如已杀死)
  2. 手机已重启,但尚未重新启动应用程序。

根据文档,WorkManager应该满足您的要求

计划的工作存储在内部管理的SQLite数据库中,WorkManager负责确保此工作持久存在,并在设备重新启动时重新安排

其他注意事项,WorkManager的限制

因此,即使对WorkRequest设置的所有约束都得到满足,您的工作仍可能会有一些额外的延迟。

如果您仍然有问题,请查找Google实验室(WorkManager),我的意见可能与OEM问题相关。

class OneTimeScheduleWorker(
    val context: Context,
    workerParams: WorkerParameters
) : Worker(context, workerParams) {

    override fun doWork(): Result {
        val builder = NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.android_cupcake)
            .setContentTitle("Scheduled notification")
            .setContentText("Hello from one-time worker!")
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)

        with(NotificationManagerCompat.from(context)) {
            notify(Random.nextInt(), builder.build())
        }
        
        return Result.retry()
    }

}

fun schedulePeriodicNotifications() {

    val periodicWork = PeriodicWorkRequestBuilder<OneTimeScheduleWorker>(
        15, TimeUnit.MINUTES
    ).addTag("WORK_TAG").build()

    WorkManager.getInstance(this)
        .enqueueUniquePeriodicWork(
            "WORK_NAME",
            ExistingPeriodicWorkPolicy.KEEP,
            periodicWork
        )
}

如果需要,可以将以下代码添加为build-notification

   // You must create the notification channel before posting any notifications on Android 8.0 and higher,
    // you should execute this code as soon as your app starts
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val name = getString(R.string.appwidget_text)
        val descriptionText = getString(R.string.looper_event)
        val importance = NotificationManager.IMPORTANCE_DEFAULT
        val channel = NotificationChannel(CHANNEL_ID, name, importance).apply {
            description = descriptionText
        }
        // Register the channel with the system
        val notificationManager: NotificationManager =
            getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.createNotificationChannel(channel)
    }

0

WorkManager不足以准确地安排提醒。

AndroidManifest.xml中注册Manifest.permission.SCHEDULE_EXACT_ALARM

<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>   
<uses-permission android:name="android.permission.USE_EXACT_ALARM"
    android:minSdkVersion="33"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接