使用Hilt注入依赖时,自定义启动类调用Activity出现空白页问题
问题分析与解决方案
核心错误点
- 禁止手动实例化Application类:
ExampleApplication被@HiltAndroidApp注解,属于Android系统托管的应用核心类,系统会在APP启动时自动创建并初始化它,你不需要也不能通过ExampleApplication()手动创建实例,必须在AndroidManifest.xml中保留对它的配置。 - 禁止直接实例化Activity类:
ExampleActivity是被@AndroidEntryPoint注解的Activity组件,Android的Activity由系统管理生命周期,直接ExampleActivity()只是创建了一个普通对象,不会触发Activity的生命周期(如onCreate),也无法让Hilt完成依赖注入,自然不会显示任何UI内容。
正确实现步骤
1. 修正AndroidManifest.xml配置
确保ExampleApplication被指定为应用类,同时将MainActivity设为启动页,且ExampleActivity完成注册:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <application android:name=".ui.ExampleApplication" <!-- 必须保留该配置 --> android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.App" tools:targetApi="31"> <!-- 设置MainActivity为启动页 --> <activity android:name=".MainActivity" android:exported="true" android:label="@string/app_name" android:theme="@style/Theme.App"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.lib_name" android:value="" /> </activity> <!-- 注册ExampleActivity --> <activity android:name=".ExampleActivity" android:exported="true" android:theme="@style/Theme.App" /> </application> </manifest>
2. 给MainActivity添加Hilt注解
启动页MainActivity需要被Hilt管理,必须添加@AndroidEntryPoint注解,再通过Intent启动ExampleActivity:
@AndroidEntryPoint class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { AppTheme { // 可添加MainActivity自身UI,或直接跳转ExampleActivity Button(onClick = { startActivity(Intent(this@MainActivity, ExampleActivity::class.java)) // 若不需要保留MainActivity,可调用finish()关闭 // finish() }) { Text(text = "打开ExampleActivity") } } } } }
3. 保持ExampleActivity的正确配置
确保ExampleActivity的@AndroidEntryPoint注解和生命周期逻辑正常:
@AndroidEntryPoint class ExampleActivity : ComponentActivity() { @RequiresApi(Build.VERSION_CODES.N) override fun onCreate(instance: Bundle?) { super.onCreate(instance) setContent { AppTheme { Surface(modifier = Modifier.fillMaxSize()) { // 此处添加ExampleActivity的UI内容 Text(text = "ExampleActivity页面内容") } } } } }
关键说明
@HiltAndroidApp注解的Application类必须在Manifest中指定,系统会自动初始化Hilt的依赖容器,所有被Hilt注解的组件(Activity、Fragment等)都依赖该容器完成注入。- 所有使用
@AndroidEntryPoint的Activity都必须在Manifest中注册,且通过Intent启动,这样系统才能正确处理生命周期和Hilt注入流程。
内容的提问来源于stack exchange,提问作者AncientS
相关产品推荐
相关产品推荐

