我希望我的应用程序将事件(由SDK激发)存储到数据库(使用领域),即使应用程序在后台也是如此。我的概念是使用一个服务来进行一些SDK初始化和监听事件。通过在我的自定义应用程序类的onCreate()
方法中启动此服务,我想确保在应用程序处于后台时服务保持活动状态,这样我就不会错过任何要存储到数据库中的事件。
但现在因为不再允许Android 8后台服务。但我不想使用Foreground Service,因为我需要显示通知。我不希望用户知道事件存储在后台的数据库中。我认为这些信息对普通用户来说是技术性的。
当Application.onCreate()
想要启动服务但是抛出异常时我意识到了这个问题:
引起:java.lang.IllegalStateException:不允许启动服务Intent {cmp = my.package.name.debug / my.package.name.service.MyService}:app在后台uid UidRecord {94b2e4a u0a204 SVC空闲更改: idle | uncached procs:1 seq(0,0,0)}
值得注意的是,如果我终止了我的应用程序的任务,则抛出异常。因此,如果我杀了应用程序,就会调用Application.onCreate()
。
最后,我不确定服务是否适用于我的用例。
我有两个问题:
onCreate()
?您可以根据具体情况使用workmanager
。
它可以满足您的所有要求,即使应用程序在后台或设备重新启动,它也能保证执行。
有关WorkManager Api的更多信息,请查看this (link to example code for WorkManager)。
我找到了与我的第二个问题相关的答案:
我使用Service.START_STICKY
开始我的服务。如果该应用程序被杀死,该服务也将被杀死。粘性服务如果被杀死则会重新创建。并且因为Application类在我的情况下启动了Service,所以也重新创建了Application。但仍然应用程序处于后台,然后我遇到应用程序的onCreate()
和应用程序崩溃,因为奥利奥不允许在应用程序处于后台时启动任何服务。
编辑:
回答我的第一个问题:在Android的官方文档中阅读更多内容后,我得出以下结论:这里的前台服务似乎是错误的选择,因为用户不需要知道存储在DB中的事件。 JobScheduler(或更新的Workmanager)更适用于一次性或定期作业。因此,混合启动/绑定服务似乎是正确的选择。