赞
踩
添加依赖库app build.gradle.kts
- implementation("com.google.dagger:hilt-android:2.49")
- annotationProcessor("com.google.dagger:hilt-android:2.49")
- annotationProcessor("com.google.dagger:hilt-compiler:2.49")
添加插件app build.gradle.kts
- plugins {
- id("dagger.hit.android.plugin")
- }
添加插件项目中 build.gradle.kts
- plugins {
- id("com.google.dagger.hilt.android") version "2.49" apply false
- }
- //生成相应组件,Hilt会自动生成所需要的组件
- @HiltAndroidApp
- public class HiltApplication extends Application {
- }
- public class User {
- //构造器注入创建
- @Inject
- public User() {
- Log.e("User", "new User()");
- }
- }
- //Hilt会自动创建注入方法,然后通过注入方法注入对象,必须是ComponentActivity或者ComponentActivity的子类
- @AndroidEntryPoint
- public class MainActivity extends ComponentActivity {
-
- //需要注入的实例化类
- @Inject
- User user;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Log.e("MainActivity", "new onCreate");
- }
- }
打印如下
从打印中可以发现,Hilt的注入对象是我们打印位置之前的
改造代码如下
- public class User {
- public User() {
- Log.e("User", "new User()");
- }
- }
- //将module加入对应作用域的容器,这里是ActivityComponent,作用域是 @ActivityScoped
- @InstallIn(ActivityComponent.class)
- @Module
- public class UserMOdule {
- //添加activity的作用域 @ActivityScoped后,该类的在activity为单利
- @ActivityScoped
- @Provides
- User provideUser() {
- return new User();
- }
- }
- //Hilt会自动创建注入方法,然后通过注入方法注入对象,必须是ComponentActivity或者ComponentActivity的子类
- @AndroidEntryPoint
- public class MainActivity extends ComponentActivity {
-
- //需要注入的实例化类
- @Inject
- User user;
- @Inject
- User user1;
-
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Log.e("MainActivity", "new onCreate");
- }
- }
代码打印如下
这里进行了多次注入User对象,实际上User的构造器之调用了一次,表明之创建了一次,所以这几个对象都指向这个创建的对象,所以在该类中为单利
修改代码如下
- //SingletonComponent全局单利容器,其余的容器都是这个容器的子容器
- @InstallIn(SingletonComponent.class)
- @Module
- public class UserMOdule {
- //添加单利全局单利作用域,该方法只会被调用一次
- @Singleton
- @Provides
- User provideUser() {
- return new User();
- }
- }
- //Hilt会自动创建注入方法,然后通过注入方法注入对象,必须是ComponentActivity或者ComponentActivity的子类
- @AndroidEntryPoint
- public class MainActivity extends ComponentActivity {
-
- //需要注入的实例化类
- @Inject
- User user;
- @Inject
- User user1;
-
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Log.e("MainActivity", "MainActivity new onCreate");
- startActivity(new Intent(this,MainActivity2.class));
- }
- }
- @AndroidEntryPoint
- public class MainActivity2 extends AppCompatActivity {
-
- @Inject
- User user;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main3);
- Log.e("MainActivity", "MainActivity2 new onCreate");
- }
- }
调用打印
这里User创建了一次,和前面所讲对应
修改代码
- public class User {
- public User(Context context) {
- Log.e("User", "new User() context " + context);
- }
- }
-
- //SingletonComponent全局单利容器,其余的容器都是这个容器的子容器
- @InstallIn(SingletonComponent.class)
- @Module
- public class UserMOdule {
- //添加单利全局单利作用域,该方法只会被调用一次
- @Singleton
- @Provides
- User provideUser(@ApplicationContext Context context) {
- return new User(context);
- }
- }
打印如下
这样就传入了Application的context了
参考
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。