Kotlin:如何从 Fragment 调用 JobIntentService?
Posted
技术标签:
【中文标题】Kotlin:如何从 Fragment 调用 JobIntentService?【英文标题】:Kotlin: How to call JobIntentService from Fragment? 【发布时间】:2021-06-01 01:51:19 【问题描述】:我正在创建 GPS 跟踪应用。所以我需要在后台(或前台?)运行这个应用程序。在 Fragment (FirstClass) 中点击“开始”按钮时如何调用 JobIntentService (SecondClass) 类?
例如,我查看了 this code - 但我仍然不明白如何从 Fragment 类调用 JobIntentService 类。
我尝试这样调用 SecondClass (source):
val contentIntent = Intent(context, SecondClass::class.java)
但它以这个错误结束:java.lang.RuntimeException: Unable to instantiate service com...SecondClass: java.lang.InstantiationException: java.lang.Class<com...SecondClass> cannot be instantiated
【问题讨论】:
【参考方案1】:context?.run
JobIntentService.enqueueWork(
applicationContext,
SecondClass::class.java,
100,// your id
Intent(applicationContext, SecondClass::class.java)
)
不要忘记以这种方式在清单中声明服务
<service
android:name=".SecondClass"
android:permission="android.permission.BIND_JOB_SERVICE" />
【讨论】:
谢谢!看起来不错,但有一个错误:Unresolved reference: enqueueWork
。我发现了这个:***.com/a/54207056/15309916 - 但SecondClass.enqueueWork
也不起作用。
@djlj 是的,是的。尝试通过JobIntentService.enqueueWork
是的! Gradle Build 现在可以工作,但是当我点击“开始”并出现以下错误时应用程序崩溃:Scheduled service ComponentInfocom...SecondClass does not require android.permission.BIND_JOB_SERVICE permission
。我在清单中使用了很长时间的BIND_JOB_SERVICE
。我尝试删除它 - 没有成功。
@djlj 在最后看到我的答案
我用的是android:permission="ACCESS_BACKGROUND_LOCATION|ACCESS_COARSE_LOCATION|ACCESS_FINE_LOCATION|ACCESS_LOCATION_EXTRA_COMMANDS|ACCESS_MEDIA_LOCATION|CONTROL_LOCATION_UPDATES|INSTALL_LOCATION_PROVIDER|LOCATION_HARDWARE|android.permission.BLUETOOTH"
,我把它改成了android:permission="android.permission.BIND_JOB_SERVICE"
。新错误:Unable to instantiate service com...SecondClass: java.lang.InstantiationException: java.lang.Class<com...SecondClass> cannot be instantiated
:'(以上是关于Kotlin:如何从 Fragment 调用 JobIntentService?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Kotlin 中使用与 Activity 和 Fragment 相同的 RecyclerView 适配器?
Kotlin:是不是可以从 Activity-1 的 Fragment 移动到 Activity-2
Kotlin基础从入门到进阶系列讲解(基础篇)Fragment的基本使用