【问题标题】:Service error "... has no zero argument constructor"服务错误“...没有零参数构造函数”
【发布时间】:2018-12-06 00:51:50
【问题描述】:

我想启动一个服务,我使用:

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)

我该怎么办?

【问题讨论】:

    标签: android kotlin android-service


    【解决方案1】:

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

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

    更新:

    除了上述之外,你的类也不能是内部类。它可以嵌套,但不能是内部类,因为它们持有对它们所在类的引用。这意味着系统无法自行创建服务实例 - 它无法提供外部类供其引用。

    【讨论】:

    • 我注册了!!
    • 对。它工作。但是当我通过 context: HomeService(val context: Context) : Service() 时,我在清单中得到同样的错误: 错误:“..没有零参数构造函数”
    • 这是因为 Service 具有零参数构造函数,而您正在将一个值构造函数应用于 HomeService。因此,您将需要 HomeService 中的两个构造函数,一个带有主构造函数,一个带有您想要的参数。请查看stackoverflow.com/a/51058986/9734616
    【解决方案2】:
    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)

    【讨论】:

      猜你喜欢
      • 2020-09-26
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 2023-01-02
      • 2012-10-21
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      相关资源
      最近更新 更多