我希望我的应用程序将事件(由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()
。
最后我不确定服务是否适合我的用例。
我有两个问题:
onCreate()
?答案 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)更适合一次性或定期工作。因此,混合启动/绑定服务似乎是这里的正确选择。