返回

如何解决 PeriodicWorker 中通知无法显示的问题?

Android

在 PeriodicWorker 中显示通知的全面指南

在使用 PeriodicWorker 进行应用程序数据每日备份时遇到通知未显示的问题吗?本文将一步步指导你解决此问题,确保应用程序即使在后台运行也能可靠地显示通知。

问题分析

当应用程序在后台运行时,使用 setForegroundAsync(foregroundInfo) 可能会出现以下错误:

Unable to stop foreground service
android.app.BackgroundServiceStartNotAllowedException: Not allowed to start service Intent { act=ACTION_STOP_FOREGROUND cmp=com.mydomain/androidx.work.impl.foreground.SystemForegroundService }: app is in background uid UidRecord{dff373e u0a386 TRNB bg:+3m49s885ms idle change:procadj procs:0 seq(7594403,7591739)} caps=------

解决方案

要解决此问题并成功显示通知,请执行以下步骤:

1. 修改 Manifest 文件:

<service
    android:name="androidx.work.impl.foreground.SystemForegroundService"
    android:foregroundServiceType="notification"
    tools:node="merge" />

2. 更新 Worker 类:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    foregroundInfo = new ForegroundInfo(PROGRESS_NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_NOTIFICATION);
} else {
    foregroundInfo = new ForegroundInfo(PROGRESS_NOTIFICATION_ID, notification);
}

3. 修改通知:

notification = new NotificationCompat.Builder(MyApp.getAppContext(), MyNotificationManager.CHANNEL_ID)
...
.setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_BEHAVIOR_SHOW)
...
.build();

其他提示

  • 确保已正确配置通知渠道。
  • 检查应用程序是否有任何权限限制,例如电池优化。
  • 对于某些设备,可能需要启用“后台数据限制”设置。

测试

完成上述更改后,重新启动应用程序。应用程序即使在后台运行也应该能够显示通知。

结论

通过修改 Manifest 文件、更新 Worker 类并修改通知,我们成功解决了 PeriodicWorker 中未显示通知的问题。现在,应用程序即使在后台运行也能可靠地显示通知,从而为用户提供有关备份状态的持续反馈。

常见问题解答

Q1:为什么即使在应用程序处于后台运行时也需要显示通知?
A1:显示通知对于向用户提供有关应用程序状态的持续反馈至关重要,即使应用程序在后台运行时也是如此。

Q2:除了修改 Manifest 文件和 Worker 类之外,还有哪些其他方法可以解决此问题?
A2:还可以使用 startForegroundService() 方法来启动前台服务。但是,此方法需要在应用程序的入口点中调用,并且需要在应用程序的整个生命周期中维护前台服务。

Q3:如何处理有关应用程序在前台运行时通知过多或侵入性的问题?
A3:通过使用通知分组和优先级设置,可以管理通知的显示方式。还可以通过设置特定通知的可见性时间限制来减少通知的侵入性。

Q4:PeriodicWorker 是否适用于所有类型的应用程序?
A4:PeriodicWorker 适用于需要定期执行后台任务的应用程序。例如,它可以用于备份数据、更新内容或发送提醒。

Q5:有哪些其他库或工具可用于在 Android 应用程序中显示通知?
A5:除了 Android 内置的 NotificationManager 之外,还有许多第三方库可以简化通知的创建和管理,例如 Firebase JobDispatcher 和 WorkManager。