Kotlin中用object实现Service单例启动触发IllegalAccessException问题
问题解决:Kotlin object实现前台服务单例启动抛出IllegalAccessException
原因分析
Kotlin的object声明会生成一个带有私有无参构造方法的类,且实例由Kotlin runtime提前创建并管理。但Android系统启动Service组件时,必须通过公共无参构造方法实例化组件,系统的AppComponentFactory无法访问object类的私有构造,因此触发IllegalAccessException。
正确的Kotlin单例实现方式
要同时满足Android组件实例化要求和Kotlin语法风格,推荐用公开类+伴生对象的方式实现单例:
class MyForegroundService : Service() { companion object { const val ACTION_START_FOREGROUND_SERVICE = "ACTION_START_FOREGROUND" @Volatile private var instance: MyForegroundService? = null fun getInstance(): MyForegroundService = instance ?: synchronized(this) { instance ?: MyForegroundService().also { instance = it } } } override fun onCreate() { super.onCreate() // Service首次创建时绑定实例,保证单例唯一性 instance = this } override fun onBind(intent: Intent?): IBinder? { return null } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { // 实现前台服务逻辑(如通知栏展示) return START_STICKY } }
关键说明
- 必须使用公开
class继承Service,确保系统能通过公共无参构造实例化组件 onCreate仅在Service首次启动时调用一次,在此处赋值单例变量可保证实例唯一- 伴生对象中的
getInstance采用双重锁校验,保证线程安全的同时提供全局访问入口
注意:Android四大组件(Activity、Service、BroadcastReceiver、ContentProvider)均不能用object声明,这类组件的实例化必须由系统框架控制,与object的预实例化机制冲突。
内容的提问来源于stack exchange,提问作者juztcode
相关产品推荐
相关产品推荐

