Android Kotlin应用使用Activity Alias切换图标后,Android Studio重运行报‘cannot find Main activity’错误的解决咨询
我太懂你这个头疼的问题了!之前用Activity Alias做应用图标切换功能时,也碰到过一模一样的情况——切换完图标再在Android Studio里点重新运行,就弹出找不到主Activity的报错。这其实是因为你切换图标时把原MainActivity给禁用了,而Android Studio默认会优先找Manifest里标记为LAUNCHER的原主Activity,可它此时处于禁用状态,自然就找不到了。下面给你几个实用的解决办法:
1. 给Android Studio指定运行的目标组件
这是最直接的临时解决办法:
- 点击Android Studio右上角运行按钮旁边的下拉框,选择「Edit Configurations...」
- 在打开的配置窗口中,找到你的App模块配置,切换到「Launch options」标签
- 把「Launch」选项从默认的「Default Activity」改成「Specified Activity」
- 输入你当前启用的Activity Alias的完整类名(比如
com.example.textapplication.MainActivityAliasYellow),或者点击旁边的下拉按钮直接选择对应的Alias组件 - 保存配置后再运行,Studio就会直接启动这个可用的Alias组件,不会再盯着被禁用的原MainActivity了
2. 调试模式下保留原MainActivity的启用状态
为了避免每次调试都要改配置,可以在代码里加个判断,只在发布版本中禁用原MainActivity,调试模式下让它保持启用:
// 切换图标逻辑中加入调试判断 if (!BuildConfig.DEBUG) { updateComponent( name = "MainActivity", status = PackageManager.COMPONENT_ENABLED_STATE_DISABLED, manager = applicationContext.packageManager, applicationContext = applicationContext ) } // 启用Alias的逻辑正常执行 updateComponent( name = "MainActivityAliasYellow", status = PackageManager.COMPONENT_ENABLED_STATE_ENABLED, manager = applicationContext.packageManager, applicationContext = applicationContext )
这样调试时原MainActivity还是处于启用状态,Android Studio能正常识别到它,发布版本则会正常切换图标。
3. 用ADB命令临时恢复原MainActivity
如果已经切换了图标导致运行报错,还可以用ADB命令快速恢复原MainActivity的启用状态:
adb shell pm enable com.example.textapplication/.MainActivity
执行完这条命令后,再回到Android Studio重新运行项目,就能正常找到主Activity了。
另外给你提个小建议:你在updateComponent方法里硬编码包名com.example.textapplication不太灵活,不如换成BuildConfig.APPLICATION_ID,这样以后包名修改时不用手动改这个字符串:
private fun updateComponent( name: String, status: Int, applicationContext: Context ) { applicationContext.packageManager.setComponentEnabledSetting( ComponentName( applicationContext.packageName, "${BuildConfig.APPLICATION_ID}.$name" ), status, PackageManager.DONT_KILL_APP ) }
甚至可以直接用Class对象来创建ComponentName,比如ComponentName(applicationContext, MainActivity::class.java),这样能彻底避免字符串拼写错误的问题。
内容来源于stack exchange

