返回

Android 14 前台服务:计时器服务的类型难题该如何解决?

Android

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 设备上可靠地显示计时器。

常见问题解答

  1. 为什么计时器服务需要服务类型?
    Android 14 要求前台服务明确指定服务类型,以提高安全性和透明度。

  2. 有什么服务类型适合计时器?
    没有专门针对计时器的服务类型,但可以考虑替代解决方案,例如 AlarmManagerWorkManager

  3. 如何更新计时器而不使用前台服务?
    可以使用 AlarmManagerWorkManager 在设备空闲时更新计时器。

  4. 如何获得 FOREGROUND_SERVICE_TYPE_??? 的值?
    FOREGROUND_SERVICE_TYPE_??? 的值为整数常量,例如 FOREGROUND_SERVICE_TYPE_LOCATIONFOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK

  5. 我可以忽略服务类型要求吗?
    忽略服务类型要求会导致在 Android 14 设备上出现异常。