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

Hilt Singleton在Service中失效,实例不一致问题求助

问题根源与解决方案

你的问题和字段注入无关,核心原因是:AIDL Service大概率运行在独立进程中,而Hilt的@Singleton(绑定到SingletonComponent)是进程内单例——Android每个进程都有独立的虚拟机实例,Hilt会在每个进程里单独初始化一套组件,自然生成多个SettingsRepository实例,导致跨进程的数据无法同步。

验证方法

检查AndroidManifest.xml中Service的声明,是否包含android:process属性:

<service
    android:name=".AppService"
    android:process=":remote" <!-- 该属性会让Service运行在独立进程 -->
    android:exported="true">
    <!-- AIDL相关配置 -->
</service>

同时可在代码中打印进程ID,确认UI进程和Service进程是否不同:

// 在ViewModel/UI类中打印
Log.d("ProcessCheck", "UI进程ID: ${android.os.Process.myPid()}")

// 在AppService中打印
Log.d("ProcessCheck", "Service进程ID: ${android.os.Process.myPid()}")

解决方案

方案1:让Service与主进程同属一个进程

如果业务不需要Service在独立进程运行,直接删除android:process属性即可。这样Service和UI进程共享同一个Hilt组件树,SettingsRepository的单例就能在整个应用内共享,数据同步问题自然解决。

方案2:必须使用独立进程时的跨进程数据同步

若业务要求Service必须在独立进程,内存中的单例无法跨进程共享,可改用以下方案:

  • 使用Jetpack DataStore:用Preferences DataStore替代内存中的StateFlow,它原生支持跨进程数据读写,所有进程都能订阅DataStore的Flow获取最新值。
  • 本地数据库持久化:将Repository的状态存储到Room数据库中,所有进程通过Room的Flow订阅数据变化,确保状态一致。
  • 跨进程通信同步:在AIDL接口中新增数据同步方法,当UI进程更新数据时,主动通过AIDL通知Service进程更新本地状态;反之亦然。

额外检查点

确认你的Application类已添加@HiltAndroidApp注解,这是Hilt初始化组件树的必要条件:

@HiltAndroidApp
class MyApplication : Application() {
    // ...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:10:35