Я хочу запустить службу, использую:
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)
что мне делать?
Вы создаете экземпляр вручную, записывая HomeService() в свой код создания Intent. Создание сервиса - задача фреймворка, и вы можете передать его класс без создания экземпляра:
val i = Intent(this@Main3Activity, HomeService::class.java)
startService(i)
Обновлять:
В дополнение к вышесказанному, ваш класс также не может быть внутренним классом. Он может быть вложенным, но не может быть внутренним классом, потому что он содержит ссылку на класс, внутри которого находится. Это означает, что система не может создать экземпляр вашей службы сама по себе - у нее нет возможности предоставить внешний класс для ссылки.
Верно. это работает. Но когда я передаю context: HomeService (val context: Context): Service (), я получаю ту же ошибку в манифесте: <service android: name = "com.example.duc25.modules.HomeService" android: exported = "false" > </service> с ошибкой: "..без конструктора с нулевым аргументом"
Это потому, что у Service есть конструктор с нулевым аргументом, а вы применяете конструктор с одним значением к своему HomeService. Таким образом, вам потребуются два конструктора в вашем HomeService: один с основным конструктором, а другой с нужным аргументом. Пожалуйста, проверьте stackoverflow.com/a/51058986/9734616
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)
Я зарегистрировался !!