第三方sdk通过工厂模式+di容器(如hilt)实现解耦,明确“谁创建、谁持有、谁提供、谁使用”;用接口定义工厂,实现类封装初始化逻辑;hilt模块中用@binds/@provides绑定并限定作用域,显式标注context限定符,多实例时用自定义注解隔离,业务中按生命周期安全注入。

第三方 SDK 的工厂模式 + 容器注入 + 绑定,本质是把 SDK 初始化和依赖管理交给 DI 框架(如 Hilt),避免硬编码 new 实例、手动传参或全局单例滥用。核心在于“谁创建、谁持有、谁提供、谁使用”四者解耦。
定义工厂接口与实现类
先为 SDK 封装一个抽象工厂,明确其职责边界:
- 接口声明统一的创建方法,比如 createClient() 或 getInstance(Context)
- 实现类负责具体初始化逻辑(含 Context、配置参数、回调监听等)
- 工厂内部不持有静态实例,每次调用返回新实例或按需复用(视 SDK 是否线程安全而定)
在 Hilt Module 中绑定工厂并限定作用域
用 @Module + @InstallIn 声明模块,通过 @Provides 或 @Binds 注入工厂或其实例:
- 若工厂本身是接口,用 @Binds 绑定具体实现类(需确保实现类有 @Inject 构造函数)
- 若直接提供 SDK 客户端实例,用 @Provides 方法,并标注作用域(如 @Singleton 或自定义 @ActivityScoped)
- 关键细节:Context 必须通过 @ApplicationContext 或 @ActivityContext 显式限定,避免内存泄漏
添加限定符区分多个同类 SDK 实例
当项目集成多个同类型 SDK(如两个不同厂商的推送服务),需用限定符隔离:
- 定义注解,如 @PushServiceA 和 @PushServiceB
- 在 @Provides 方法上添加对应限定符,注入时也带上该注解
- Hilt 会根据限定符匹配唯一实例,避免混淆或覆盖
在业务类中安全注入并使用
注入点需明确生命周期归属,避免跨组件误用:
- Activity/Fragment 中直接 @Inject 工厂或客户端实例(前提是模块已 @InstallIn(ActivityRetainedComponent::class) 等正确安装)
- ViewModel 中建议注入工厂而非 SDK 实例,由 ViewModel 按需创建,便于测试和复位
- 避免在 Application 类中直接注入非 @Singleton 实例,防止 Context 泄漏或提前初始化失败











