在后台运行应用程序时将事件存储到数据库中

时间:2018-09-05 15:10:21

标签: android realm android-service foreground-service android-application-class

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

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

Application.onCreate()想启动服务但引发异常时,我意识到了这个问题:

  

原因:java.lang.IllegalStateException:不允许启动   服务意图{   cmp = my.package.name.debug / my.package.name.service.MyService}:应用为   在后台uid UidRecord {94b2e4a u0a204 SVC空闲   change:idle | unachach procs:1 seq(0,0,0)}

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

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

我有两个问题:

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

2 个答案:

答案 0 :(得分:0)

对于特定情况,您可以使用workmanager

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

签出this (link to example code for WorkManager)以获得有关WorkManager Api的更多信息。

答案 1 :(得分:0)

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

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

编辑:

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