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

Posted

技术标签:

【中文标题】服务错误“...没有零参数构造函数”【英文标题】: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)

我该怎么办?

【问题讨论】:

【参考方案1】:

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

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

更新:

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

【讨论】:

我注册了!! 对。它工作。但是当我通过 context: HomeService(val context: Context) : Service() 时,我在清单中得到同样的错误: 错误:“..没有零参数构造函数” 这是因为 Service 具有零参数构造函数,而您正在将一个值构造函数应用于 HomeService。因此,您将需要 HomeService 中的两个构造函数,一个带有主构造函数,一个带有您想要的参数。请查看***.com/a/51058986/9734616【参考方案2】:
class HomeService() : Service() 
    constructor(context: Context) : this() 
        Log.d("TAG","ANOTHER CONSTRUCTOR")
    

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

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

【讨论】:

以上是关于服务错误“...没有零参数构造函数”的主要内容,如果未能解决你的问题,请参考以下文章

InstantiationException:没有零参数构造函数?

AsyncTask没有零参数构造函数

超类 'Bloc<xxx, xxx>' 在 dart 中没有零参数构造函数

Xamarin Android java.lang.InstantiationException:java.lang.Class 没有零参数构造函数

当我添加构造函数来调用服务类时,Laravel Livewire 错误

IntentService (kotlin) 的默认构造函数