返回
Android 14 前台服务:计时器服务的类型难题该如何解决?
Android
2024-03-24 13:04:55
Android 14 前台服务:计时器的服务类型难题
随着 Android 14 的发布,前台服务的使用变得更加严格,需要明确指定服务的类型。对于需要在后台运行的计时器来说,找到合适的服务类型至关重要。
问题陈述
设想一款健身应用,使用前台服务在用户锻炼时保持精确的计时器,包括倒计时和无限时计数计时器。在 Android 14 之前,这些服务可以正常运行,但现在需要指定服务类型。
服务类型选择
考察了各种服务类型,但没有一个完全适合此用例:
health
: 不适用于传感器数据。systemExempted
: 不适用于无限时计数计时器。specialUse
: 限制严格,不太可能被接受。
代码示例
启动服务的代码示例:
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle(exerciseNameStr + " Timer Running")
.setSmallIcon(exerciseIcons.getResourceId(iconId, 0))
.setContentIntent(pendingIntent)
.setChronometerCountDown(!countUpwards)
.setUsesChronometer(true)
.setTimeoutAfter(counterMsec + 1000)
.setWhen(time)
.build();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
{
startForeground(100, notification, FOREGROUND_SERVICE_TYPE_???);
}
else
{
startForeground(100, notification); // <-- 这段代码在 Android 14 上会引发异常
}
替代解决方案
找不到合适服务类型时的替代解决方案:
AlarmManager
: 系统服务,可安排指定时间执行任务。WorkManager
: 库,可安排设备空闲时执行任务。
结论
为计时器选择合适的前台服务类型至关重要。考虑各种服务类型和替代解决方案,以在 Android 14 设备上可靠地显示计时器。
常见问题解答
-
为什么计时器服务需要服务类型?
Android 14 要求前台服务明确指定服务类型,以提高安全性和透明度。 -
有什么服务类型适合计时器?
没有专门针对计时器的服务类型,但可以考虑替代解决方案,例如AlarmManager
或WorkManager
。 -
如何更新计时器而不使用前台服务?
可以使用AlarmManager
或WorkManager
在设备空闲时更新计时器。 -
如何获得
FOREGROUND_SERVICE_TYPE_???
的值?
FOREGROUND_SERVICE_TYPE_???
的值为整数常量,例如FOREGROUND_SERVICE_TYPE_LOCATION
或FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
。 -
我可以忽略服务类型要求吗?
忽略服务类型要求会导致在 Android 14 设备上出现异常。