Application 单例 → Hilt Singleton
老写法(Java --- Application 单例容器)
java
public class App extends Application {
private static App instance;
private ApiService apiService;
private UserManager userManager;
@Override
public void onCreate() {
super.onCreate();
instance = this;
apiService = createApi();
userManager = new UserManager(apiService);
}
public static App get() { return instance; }
public ApiService getApi() { return apiService; }
public UserManager getUserManager() { return userManager; }
}
// 使用
App.get().getUserManager().login();
问题在哪里
Application 变成上帝对象,所有依赖都堆在一个类里。无法做作用域区分------有些依赖应该是单例,有些应该跟随 Activity/Fragment 生命周期,但全放在 Application 里就都是永久存活。
新写法(Hilt Singleton)
kotlin
// Singleton 生命周期
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides @Singleton
fun provideOkHttp(): OkHttpClient = OkHttpClient.Builder().build()
@Provides @Singleton
fun provideRetrofit(client: OkHttpClient): Retrofit =
Retrofit.Builder().baseUrl("...").client(client).build()
@Provides @Singleton
fun provideApi(retrofit: Retrofit): ApiService =
retrofit.create(ApiService::class.java)
@Provides @Singleton
fun provideUserManager(api: ApiService): UserManager = UserManager(api)
}
// Activity 生命周期
@Module
@InstallIn(ActivityComponent::class)
object ActivityModule {
@Provides @ActivityScoped
fun provideNavigator(activity: Activity): Navigator = Navigator(activity)
}
一句话注意
Hilt 的 @Singleton 作用域:单例在整个应用生命周期存活。@ActivityScoped 只在单个 Activity 生命周期内共享同一个实例,Activity 销毁后实例也释放。@ViewModelScoped 跟 ViewModel 同生命周期,ViewModel 清除时释放。
Application 单例模式迁移到 Hilt 的核心变化:从命令式获取(App.get().getApi())变成声明式注入(@Inject constructor),不需要自己管理实例的生命周期。
Java Android 老项目迁移系列,持续更新中。