0

即使应用程序在后台,我希望我的应用程序将事件(由 SDK 触发)存储到数据库(使用领域)。我的概念是使用一个服务来进行一些 SDK 初始化和监听事件。通过在我的自定义应用程序类的方法中启动此服务onCreate(),我想确保该服务在应用程序处于后台时保持活动状态,这样我就不会错过任何要存储到数据库中的事件。

但现在由于 Android 8 后台服务不再被允许。但我不想使用前台服务,因为我需要显示通知。而且我不希望用户知道事件存储在后台数据库中。我认为这些信息对于普通用户来说是技术性的。

Application.onCreate()当我想启动服务但抛出异常时,我意识到了问题:

原因:java.lang.IllegalStateException:不允许启动服务 Intent { cmp=my.package.name.debug/my.package.name.service.MyService }:应用处于后台 uid UidRecord{94b2e4a u0a204 SVC 空闲更改:空闲|未缓存的过程:1 seq(0,0,0)}

值得注意的是,如果我终止我的应用程序的任务,则会引发异常。Application.onCreate()如果我杀死应用程序,就会调用它。

最后,我不确定服务是否适合用于我的用例。

我有两个问题:

  1. 如果我的应用程序在后台,如果我想将事件存储在数据库中,使用哪种组件?
  2. 为什么杀死应用程序会触发应用程序onCreate()
4

2 回答 2

0

我找到了与我的第二个问题相关的答案:

我使用Service.START_STICKY. 如果应用程序被杀死,服务也会被杀死。如果粘性服务被杀死,它会重新创建自己。因为在我的例子中,Application 类启动了 Service,所以 Application 也被重新创建了。但是应用程序仍然在后台,然后我遇到应用程序onCreate()并且应用程序崩溃,因为奥利奥不允许在应用程序处于后台时启动任何服务。

编辑:

回答我的第一个问题:在阅读更多 Android 官方文档后,我得出以下结论:前台服务似乎在这里是错误的选择,因为用户不需要知道存储到数据库中的事件。JobScheduler(或更新的 Workmanager)更多地用于一次性或定期作业。因此,混合启动/绑定服务似乎是这里的正确选择。

于 2018-09-05T16:06:20.670 回答
0

您可以将workmanager其用于您的特定情况。

它可以满足您的所有要求,即使应用程序在后台设备重新启动,它也能保证执行。

检查此(链接到 WorkManager 的示例代码)以获取有关 WorkManager Api 的更多信息。

于 2018-09-05T15:40:30.903 回答