Skip to content

Service 依赖注入为什么不能直接用 @Inject constructor #61

@cnwutianhao

Description

@cnwutianhao
  1. Android组件创建方式的区别

    • Fragment:由 FragmentManager 管理创建
    • Service:由 Android 系统通过反射创建
  2. Hilt/Dagger 依赖注入原理

    • 使用 @Inject constructor 时会生成工厂类
    • 需要通过这些工厂类来创建对象实例
  3. 核心区别

    • Fragment:Hilt 可以接管创建过程
    • Service:系统必须通过无参构造函数反射创建
  4. Service 创建流程

    // Android 系统创建 Service 的简化代码
    Class<?> serviceClass = Class.forName(serviceName);
    Service service = (Service) serviceClass.newInstance(); // 必须有无参构造函数
  5. Fragment 创建流程

    // Hilt 接管 Fragment 创建的简化示意
    class HiltFragment : Fragment {
        @Inject
        constructor(dependency: SomeDependency)
    
        companion object {
            fun newInstance(): HiltFragment {
                return HiltFragmentFactory.create() // Hilt 工厂创建
            }
        }
    }
  6. 正确的 Service 依赖注入方式

    @AndroidEntryPoint
    class MyService : Service() {
        @Inject 
        lateinit var dependency: SomeDependency // 属性注入
    
        // 默认无参构造函数
    }
  7. 总结
    Android 系统对 Service 的创建有特殊要求,必须保留无参构造函数,而 Fragment 的创建则可以被 Hilt 完全接管。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions