You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:06:06