Ошибка службы «... не имеет конструктора с нулевым аргументом»

Я хочу запустить службу, использую:

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 has no zero argument constructor at android.app.ActivityThread.handleCreateService(ActivityThread.java:3201) at android.app.ActivityThread.-wrap5(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1586) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6186) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) Caused by: java.lang.InstantiationException: java.lang.Class has no zero argument constructor at java.lang.Class.newInstance(Native Method) at android.app.ActivityThread.handleCreateService(ActivityThread.java:3198) at android.app.ActivityThread.-wrap5(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1586)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:6186)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

что мне делать?

1
0
5 290
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы создаете экземпляр вручную, записывая HomeService() в свой код создания Intent. Создание сервиса - задача фреймворка, и вы можете передать его класс без создания экземпляра:

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

Обновлять:

В дополнение к вышесказанному, ваш класс также не может быть внутренним классом. Он может быть вложенным, но не может быть внутренним классом, потому что он содержит ссылку на класс, внутри которого находится. Это означает, что система не может создать экземпляр вашей службы сама по себе - у нее нет возможности предоставить внешний класс для ссылки.

Я зарегистрировался !!

mducc 27.06.2018 10:25

Верно. это работает. Но когда я передаю context: HomeService (val context: Context): Service (), я получаю ту же ошибку в манифесте: <service android: name = "com.example.duc25.modules.HomeService" android: exported = "false" > </service> с ошибкой: "..без конструктора с нулевым аргументом"

mducc 27.06.2018 10:57

Это потому, что у Service есть конструктор с нулевым аргументом, а вы применяете конструктор с одним значением к своему HomeService. Таким образом, вам потребуются два конструктора в вашем HomeService: один с основным конструктором, а другой с нужным аргументом. Пожалуйста, проверьте stackoverflow.com/a/51058986/9734616

Brijesh Joshi 27.06.2018 11:20
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)

Другие вопросы по теме