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

使用Dagger在Service中注入依赖失败,求现代解决方案

解决Dagger在Service中注入依赖的崩溃问题

崩溃原因分析

  1. 注入方式冲突:同时在AppComponent中显式声明inject(NetworkService)和使用@ContributesAndroidInjector,干扰了Dagger Android的自动注入逻辑,导致DispatchingAndroidInjector无法正确注册Service的注入器。
  2. 依赖初始化时机错误:Service中直接用@Inject val声明依赖,会在Service实例化时就尝试注入,但此时AndroidInjection.inject(this)还未执行,必然引发未初始化异常。
  3. Application初始化顺序问题:若Service在Application.onCreate()完成前启动(如开机自启),会导致dispatchingAndroidInjector还未被注入就被调用。

分步修复方案

1. 移除AppComponent中多余的inject方法

使用@ContributesAndroidInjector时,无需在根Component中手动声明Service的inject方法,删除后让Dagger自动管理子组件:

@Singleton
@Component(
    modules = [AndroidInjectionModule::class, DomainModule::class, DataModule::class, AppModule::class, ServiceModule::class]
)
interface AppComponent {
    fun inject(app: Application)
    fun inject(mainActivity: MainActivity)
    // 移除该行:fun inject(networkService: NetworkService)
}

2. 修正Service中的依赖声明

将val改为lateinit var,确保依赖在AndroidInjection.inject(this)执行后再使用:

class NetworkService : Service() {
    private val TAG = "NetworkService"

    @Inject
    lateinit var someDependency: SomeDependency

    override fun onCreate() {
        super.onCreate()
        Log.e(TAG, "Service create")
        AndroidInjection.inject(this)
        // 此时someDependency已完成注入,可安全调用
    }

    // 其他Service方法实现...
}

3. 优化AppModule的Context提供方式

无需手动传递Context,让Dagger自动注入Application实例来提供Context,简化代码:

@Module
class AppModule {
    @Provides
    fun provideContext(application: Application): Context {
        return application
    }
}

4. 调整Application的Dagger初始化时机(关键)

将Dagger组件的初始化移至attachBaseContext(),确保在任何组件(包括提前启动的Service)初始化前,dispatchingAndroidInjector已完成注入:

class App : Application(), HasAndroidInjector {

    lateinit var appComponent: AppComponent

    @Inject
    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>

    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(base)
        appComponent = DaggerAppComponent
            .builder()
            // 移除手动传参:.appModule(AppModule(context = this))
            .build()
        appComponent.inject(this)
    }

    override fun onCreate() {
        super.onCreate()
        // 此处放置其他应用初始化逻辑
    }

    override fun androidInjector(): AndroidInjector<Any> {
        return dispatchingAndroidInjector
    }
}

验证要点

  • 确保ServiceModule已正确添加到AppComponent的modules列表中
  • 所有依赖的类(如SomeDependency)已在对应Module中用@Provides或@Inject标记可注入性

内容的提问来源于stack exchange,提问作者Potolok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 10:53:14