【问题标题】:How can I run background work like alarm on latest android phones如何在最新的安卓手机上运行后台工作,如闹钟
【发布时间】:2019-02-21 04:45:45
【问题描述】:

我有一些任务,比如药物提醒。日常提醒计划存储在 SQLite 数据库中。提醒每天都不同。

例如

21.02.19 - 08:00、12:00、19:00

22.02.19 - 08:30、12:30、19:30

...

最低安卓 4.4 (Api 19) 目标安卓 9.0 (Api 28)

我了解了 WorkManager、JobScheduler、JobIntentService、FirebaseJobDispathcer、Alarm manager。有很多 API 可以做到这一点。

首先,我尝试使用警报管理器每分钟检查一次时间间隔。但它在最新的 android 中无法正常工作。有后台限制,打盹模式和待机。然后我尝试了 JobScheduler,但它不适用于 21 API 下的设备。而 FirebaseJobDispatcher 需要 google play 服务,这不是一个好主意。最后,我找到了 WorkManager。但是在 workmanager 和 jobscheduler 中的最小间隔为 15 分钟。

如何让后台服务每天在特定的准确时间提醒用户?我没有使用互联网、GPS、位置。仅从 SQLite 获取时间并及时提醒。

【问题讨论】:

    标签: java android


    【解决方案1】:

    几个月前,我也开发了药物提醒应用程序。

    我使用“使用android-job 在凌晨 0:00 运行日常工作”方法来实现这一点。

    在 DailyJob 中,我们有这个流程。

    1. 在 DB 中获取一些时间信息
    2. 将(所需时间 - 现在时间)转换为毫秒。如果现在时间是 00:15AM,而期望时间是 07:00AM,那么它将是 24300000 毫秒。
    3. 在步骤 2 中使用转换后的毫秒数运行精确作业。

    在精确作业中,我们向用户显示通知。

    因为隐私,我不能附上代码,但你可以实现同样的事情。

    【讨论】:

    • '如果你开始一个新项目,你应该使用 WorkManager 而不是这个库。您还应该开始将您的代码从这个库迁移到 WorkManager。在未来的某个时候,这个库将被弃用。 ' 我是从 android-job 库中读到的?如何在 WorkManager 中实现你的流程?
    • 虽然文档说“你应该使用 WorkManager”,但是 WorkManager api 不稳定并且不提供确切的工作功能。所以,我使用 android-job 实现了这个过程。
    • 好主意!最新的安卓版本怎么样?
    • 就像我现在一样,DailyJob 和 ExactJob 在库内部使用 AlarmManager。所以有背景限制,比如打瞌睡。最后,当用户进入应用程序时,我添加了 Doze 白名单。没有适当的解决方案来降低警报的准确性。
    • 嗯.. 现在想到两件事。一种是使用startForeground() 方法的后台服务。其他解决方案是,如果有背景的情况,请断开与套接字服务器的连接。当有人通过套接字服务器发送消息时,通过 FCM 传递该消息。但我认为还有其他好的方法可以做到这一点,所以最好再问一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2018-11-27
    • 2012-11-11
    • 1970-01-01
    相关资源
    最近更新 更多