一 概述-Hilt(依赖注入)
1 2
| Hilt 是 Android 官方推荐的依赖注入(DI)框架,基于 Dagger,提供 更简洁、更易用的依赖注入方式, 帮助开发者管理对象的生命周期、简化依赖关系,并 提高应用的模块化和可测试性。
|
二 面试题解答(仅供参考)
2.1 什么是 Hilt?它的作用是什么?
1 2 3 4 5 6 7 8 9
| 1.概念 Hilt 是 Dagger 在 Android 上的封装,用于 自动管理依赖对象的创建、生命周期和注入。
2.Hilt 的作用 ✅ 简化 Dagger 依赖注入(无需手写 Factory 和 Component) ✅ 提供标准作用域(Activity、Fragment、ViewModel...) ✅ 减少样板代码,提高可维护性 ✅ 兼容 ViewModel、WorkManager、Navigation 等 Jetpack 组件 ✅ 方便单元测试
|
2.2 Hilt 的核心组件有哪些?
组件 |
作用 |
@HiltAndroidApp |
Application 入口,生成 Hilt 依赖注入容器 |
@Inject |
用于构造函数或字段,标记可注入对象 |
@HiltViewModel |
用于 ViewModel,使其支持 Hilt 依赖注入 |
@Module |
定义依赖提供者 |
@InstallIn |
指定 Module 作用域(Application、Activity...) |
@Provides |
提供非构造函数可注入对象 |
@Singleton |
标记全局单例对象 |
2.3 Hilt 的基本使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| 1.在 Application 入口添加 Hilt @HiltAndroidApp public class MyApplication extends Application { }
2.注入依赖(构造函数方式) 2.1 如果 对象可以通过构造函数直接创建,直接用 @Inject 标记: public class UserRepository { @Inject public UserRepository() { } } 2.2 在 Activity 里使用 @AndroidEntryPoint public class MainActivity extends AppCompatActivity { @Inject UserRepository userRepository; // Hilt 自动提供实例 }
3.使用 @Module 提供实例 3.1 如果对象 不能通过构造函数直接创建(如 Retrofit),使用 @Module 和 @Provides 提供 @Module @InstallIn(SingletonComponent.class) // 作用域:全局 public class AppModule {
@Provides @Singleton public static Retrofit provideRetrofit() { return new Retrofit.Builder() .baseUrl("https://api.example.com") .addConverterFactory(GsonConverterFactory.create()) .build(); }
@Provides @Singleton public static ApiService provideApiService(Retrofit retrofit) { return retrofit.create(ApiService.class); } } 3.2 在 Activity 里使用 @AndroidEntryPoint public class MainActivity extends AppCompatActivity { @Inject ApiService apiService; // Hilt 自动提供实例 }
|
2.4 Hilt 作用域(Scope)
1.Hilt 提供多个作用域,控制对象的生命周期:
作用域 |
注解 |
生命周期 |
全局单例 |
@Singleton |
整个应用生命周期 |
Activity 作用域 |
@ActivityScoped |
仅在 Activity 期间有效 |
Fragment 作用域 |
@FragmentScoped |
仅在 Fragment 期间有效 |
ViewModel 作用域 |
@HiltViewModel |
仅在 ViewModel 期间有效 |
Service 作用域 |
@ServiceScoped |
仅在 Service 期间有效 |
2-示例
1 2 3 4 5 6
| @ActivityScoped public class UserManager { @Inject public UserManager() { } }
|
2.5 Hilt 在 ViewModel 中使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 1.viewmodel @HiltViewModel public class MyViewModel extends ViewModel { private final UserRepository userRepository;
@Inject public MyViewModel(UserRepository userRepository) { this.userRepository = userRepository; } }
2.在 Activity / Fragment 里使用 public class MainActivity extends AppCompatActivity { private MyViewModel viewModel;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
viewModel = new ViewModelProvider(this).get(MyViewModel.class); } }
|
2.6 Hilt 如何提供不同实现?(Qualifier)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| 1.当有多个相同类型的依赖时,需要使用 @Qualifier 区分 @Qualifier @Retention(RUNTIME) public @interface LocalSource {}
@Qualifier @Retention(RUNTIME) public @interface RemoteSource {}
2.在 Module 提供多个实现 @Module @InstallIn(SingletonComponent.class) public class DataModule { @Provides @Singleton @LocalSource public static UserRepository provideLocalRepo() { return new LocalUserRepository(); }
@Provides @Singleton @RemoteSource public static UserRepository provideRemoteRepo() { return new RemoteUserRepository(); } } 3.在 ViewModel 里使用 @HiltViewModel public class MyViewModel extends ViewModel { private final UserRepository userRepository;
@Inject public MyViewModel(@RemoteSource UserRepository userRepository) { this.userRepository = userRepository; } }
|
2.7 Hilt 如何与 WorkManager 结合?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 1.自定义Worker
@HiltWorker public class MyWorker extends Worker { private final ApiService apiService;
@Inject public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams, ApiService apiService) { super(context, workerParams); this.apiService = apiService; }
@NonNull @Override public Result doWork() { // 使用 apiService return Result.success(); } }
2-创建 WorkManager 实例 WorkManager.getInstance(context) .enqueue(new OneTimeWorkRequest.Builder(MyWorker.class).build());
|
2.8 Hilt 如何进行单元测试?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 1.概念 Hilt 提供 @HiltAndroidTest 和 @UninstallModules 进行依赖替换
2.示例 @HiltAndroidTest public class ExampleTest { @Rule public HiltAndroidRule hiltRule = new HiltAndroidRule(this);
@Inject UserRepository userRepository;
@Before public void init() { hiltRule.inject(); }
@Test public void testUserRepository() { assertNotNull(userRepository); } }
|
2.9 Hilt 和 Dagger 的区别?
对比项 |
Hilt |
Dagger |
简洁性 |
更简单,无需手动 Component |
需要手动创建 Component |
注入方式 |
自动管理依赖注入 |
需要手动管理 |
适配 Android |
官方推荐,支持 ViewModel、WorkManager |
需手动适配 |
测试支持 |
内置单元测试支持 |
需要额外配置 |
2.10 Hilt 的优缺点?
1 2 3 4 5 6 7 8 9
| 1.优点 -比 Dagger 更易用,自动管理依赖 -支持 Android 生命周期,作用域清晰 -兼容 Jetpack 组件(ViewModel、WorkManager) -支持单元测试
2.缺点 -灵活性不如 Dagger(Dagger 适合更复杂的依赖管理) -不适用于特别复杂的多级 Component 依赖注入
|
2.11 Hilt 核心知识点
1 2 3 4 5 6 7
| -Hilt 是 Dagger 的封装,简化依赖注入 -@HiltAndroidApp 启动 Hilt -@Inject 标记需要注入的对象 -@Module + @Provides 提供外部依赖 -@HiltViewModel 让 ViewModel 支持 Hilt -支持 WorkManager、Retrofit、RxJava、Flow -支持单元测试
|
三 参考