用Dagger2实现Application同生命周期的单例
1、用Module和Provide返回需要的注入对象,其中@Provide注解下要加上@Singleton注解指明此对象返回单例。
@Module
public class ActivityListModule {
@Provides
@Singleton
List<Activity> provideActivityList() {
return new ArrayList<Activity>();
}
}
2、在上面Module对应的Component中指定(modules = xxx.class)后也要在#Component注解上加@Singleton注解,要是这里不加上这个注解的话,单例只能是局部单例,也就是说该单例的范围有限。
@Singleton
@Component(modules = ActivityListModule.class)
public interface ActivityListComponent {
List<Activity> getActivityList();
}
3、在需要注入该对象的类的Component中如MainActivityComponent,首先要用dependencies 来依赖上面注入对象的Component,这里需要注意的是 这里的@Component上面也需要用范围注解,但是不能用@Singleten,需要自定义范围注解,如:(否则不能通过编译)
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
4、要保证该单例的生命周期与Application相同,则必须在Application类中得到注入对象类的Component,使其为全局变量。
public class App extends Application {
private static Context mContext;
private static ActivityListComponent mActivityListComponent;
@Override
public void onCreate() {
super.onCreate();
mContext = getContext();
mActivityListComponent = DaggerActivityListComponent.create();
}
public static Context getContext() {
return mContext;
}
public static ActivityListComponent getActivityListComponent() {
return mActivityListComponent;
}
}
5、再在需要的注入该单例的地方初始化并@Inject注入。
@Inject
List<Activity> mActivities;
DaggerMainActivityComponent.builder()
.activityListComponent(App.getActivityListComponent())
.build()
.inject(this);
(这里是实现了一个单例集合管理项目中所有的Activity)