我创建了一个使用Kotlin扩展NetworkSchedulerService
的JobService
。当然我在清单中注册了它,但由于某些原因,AndroidStudio标记它有警告:
the <service> project.services.network.NetworkSchedulerService is not registered in the manifest
当我运行应用程序时,它会因错误而崩溃(没有惊喜):
09-18 03:18:56.271 22289-22289/project E/AndroidRuntime: FATAL EXCEPTION: main
Process: project, PID: 22289
java.lang.RuntimeException: Unable to start activity ComponentInfo{project/project.ui.home.HomeScreenActivity}: java.lang.IllegalArgumentException: No such service ComponentInfo{projectt/project.services.network.NetworkSchedulerService}
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Mt清单注册:
<service
android:name="services.network.NetworkSchedulerService"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE"/>
我怎么称呼它(来自主要活动的onCreate()
):
fun scheduleJob() {
val myJob = JobInfo.Builder(0, ComponentName(this, NetworkSchedulerService::class.java))
.setRequiresCharging(true)
.setMinimumLatency(1000)
.setOverrideDeadline(2000)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setPersisted(true)
.build()
val jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
jobScheduler.schedule(myJob)
}
我的NetworkSchedulerService
课程:
open class NetworkSchedulerService : JobService(), ConnectivityReceiver.ConnectivityReceiverListener {
private val TAG = NetworkSchedulerService::class.java.simpleName
private lateinit var mConnectivityReceiver: ConnectivityReceiver
override fun onCreate() {
super.onCreate()
Log.i(TAG, "onCreate")
mConnectivityReceiver = ConnectivityReceiver(this)
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.i(TAG, "onStartCommand")
return Service.START_NOT_STICKY
}
override fun onStopJob(params: JobParameters?): Boolean {
Log.i(TAG, "onStopJob $mConnectivityReceiver")
unregisterReceiver(mConnectivityReceiver)
return true
}
override fun onStartJob(params: JobParameters?): Boolean {
Log.i(TAG, "onStartJob $mConnectivityReceiver")
registerReceiver(mConnectivityReceiver, IntentFilter(CONNECTIVITY_ACTION))
return true
}
override fun onNetworkConnectionChanged(isConnected: Boolean) {
val message = if (isConnected) "Good! Connected to Internet" else "Sorry! Not connected to internet"
Toast.makeText(applicationContext, message, Toast.LENGTH_SHORT).show()
}
}
我试图打开NetworkSchedulerService类(因为默认情况下它是静态的和最终的),试图清理项目和许多其他的东西。有人可以帮忙吗?
好吧,经过整整一天,我没有成功(在发布这个问题之前),我发现了问题!我失踪了
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
在清单中。偶然发现它:)