这需要一些上下文,请与我裸露...
我已将用于评估 NFC 数据的依赖项迁移到新应用程序。每当发现 NFC 标签时,我的应用程序都会生成一个 Activity 来处理该事件。在onCreate
this 的函数中NfcActivity
,启动了一个后台服务(我们称之为它MyNfcHelperService
)来检索扫描标签上的一些数据:
class NfcActivity : AppCompatActivity() {
/*...*/
override fun onCreate(savedInstanceState: Bundle?) {
/*...*/
val intent = Intent(this, MyNfcHelperService::class.java)
.putExtra(/*...*/)
startService(intent)
}
}
此服务生成的作品稍后会被NfcActivity
. 过去一切正常,但一旦发布到野外,我们注意到一些崩溃,这会报告Not allowed to start service Intent
调用startService(intent)
。
我很快就看到了这篇相关的帖子,这表明这是由于对后台进程的 RAM 管理进行了一些改进(在 Android 8 中引入)。
根据接受的答案和提出的评论,我研究了JobIntentServices 上的文档并最终得到了类似的设置。我本来希望将MyNfcHelperService
所有内容放在一起并将其逻辑移动到MyJobIntentService
. 但是里面发生的事情MyNfcHelperService
对我来说绝对是一个黑匣子。因此,我将上述服务包装在onHandleWork
我的派生对象中JobIntentService
,如下所示:
class MyJobIntentService: JobIntentService() {
companion object {
private const val JOB_ID = 1000
fun start(context: Context) {
val intentPkm = Intent(context, MyNfcHelperService::class.java)
.putExtra(/*...*/)
enqueueWork(context, intentPkm)
}
private fun enqueueWork(context: Context, intent: Intent) {
enqueueWork(context, MyJobIntentService::class.java, JOB_ID, intent)
}
}
override fun onHandleWork(intent: Intent) {
applicationContext.startService(intent)
}
}
然后我将这个类应用于NfcActivity
:
class NfcActivity : AppCompatActivity() {
/*...*/
override fun onCreate(savedInstanceState: Bundle?) {
/*...*/
MyJobIntentService.start(applicationContext)
}
}
到目前为止,代码似乎工作。但是我很犹豫是否将它发布到野外,因为它感觉有点hacky,我不确定这个解决方案是否真的解决了上述问题。毕竟,我知道这个基础设施会根据计划的作业创建后台服务。
那么,我的代码对java.lang.IllegalStateException: Not allowed to start service Intent
错误是否稳健,还是我完全走错了路?如果是后者,考虑到我无法访问MyNfcHelperService
?