服务错误“ ...没有零参数构造函数”

时间:2018-06-27 07:57:08

标签: android kotlin android-service

我要启动服务,我使用:

inner class HomeService : Service() {
    override fun onBind(intent: Intent?): IBinder? {
        return null
    }

    override fun onCreate() {
        super.onCreate()
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        notification(light.toString())
        return START_STICKY
    }

    override fun onDestroy() {
        super.onDestroy()
    }
}

启动它:

val i = Intent(this@Main3Activity, HomeService()::class.java)
startService(i)

我的应用程序崩溃后,logcat返回:

  

java.lang.Class   没有零参数构造函数           在android.app.ActivityThread.handleCreateService(ActivityThread.java:3201)           在android.app.ActivityThread.-wrap5(ActivityThread.java)           在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1586)           在android.os.Handler.dispatchMessage(Handler.java:102)           在android.os.Looper.loop(Looper.java:154)           在android.app.ActivityThread.main(ActivityThread.java:6186)           在java.lang.reflect.Method.invoke(本机方法)           在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:889)           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)        引起原因:java.lang.InstantiationException:java.lang.Class   没有零参数构造函数           在java.lang.Class.newInstance(本地方法)           在android.app.ActivityThread.handleCreateService(ActivityThread.java:3198)           在android.app.ActivityThread.-wrap5(ActivityThread.java)           在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1586)           在android.os.Handler.dispatchMessage(Handler.java:102)           在android.os.Looper.loop(Looper.java:154)           在android.app.ActivityThread.main(ActivityThread.java:6186)           在java.lang.reflect.Method.invoke(本机方法)           在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:889)           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

我该怎么办?

2 个答案:

答案 0 :(得分:4)

您正在通过在HomeService()创建代码中写下Intent来手工创建实例。创建服务是框架的任务,您可以在不创建实例的情况下传递其类:

val i = Intent(this@Main3Activity, HomeService::class.java)
startService(i)

更新:

除上述内容外,您的课程也不能成为内部课程。它可以嵌套,但不能是内部类,因为它们持有对内部类的引用。这意味着系统无法独自创建服务的实例-它无法提供外部类供其引用。

答案 1 :(得分:0)

class HomeService() : Service() {
    constructor(context: Context) : this() {
        Log.d("TAG","ANOTHER CONSTRUCTOR")
    }
}

现在您可以通过两种方式使用此服务

  1. val intent = Intent(this@Main3Activity, HomeService::class.java)
  2. val intent = Intent(this@Main3Activity, HomeService(context)::class.java)