将登录界面设为主Activity时遇报错:activity must be exported or contain an intent filter
嘿,这个问题我之前也踩过坑,其实是AndroidManifest的配置没到位导致的,咱们一步步来搞定它:
问题根源
Android系统有个硬性要求:作为启动入口的Activity,要么设置android:exported="true",要么包含指定的intent-filter。哪怕你在Run配置里手动选了这个Activity启动,系统也会因为它不符合这个规则而报错。
解决方法
你有两种可选的方案,根据你的需求选就行:
方案1:把登录Activity设为默认启动页(标准做法)
这是最推荐的方式,直接把登录Activity变成应用的默认入口。首先找到你的AndroidManifest.xml文件——就是你截图里的这个位置:
打开后,找到登录Activity的标签,添加主入口的intent-filter,同时显式设置android:exported="true"(API 30+建议必填):
<activity android:name=".LoginActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
⚠️ 注意:如果原来的主Activity(比如MainActivity)也有这个intent-filter,记得把它删掉,不然你的应用会出现多个启动图标。
方案2:仅开启exported(适合临时测试)
如果你只是想临时从登录Activity启动测试,不想修改应用的默认入口,可以只给登录Activity添加android:exported="true"属性:
<activity android:name=".LoginActivity" android:exported="true"> <!-- 这里不需要添加intent-filter --> </activity>
这样你之前在Run配置里的设置(就是你截图的这个配置)就可以正常生效了:
额外小贴士
- 对于Android 11(API 30)及以上的版本,
android:exported是必填属性,不管用哪种方案,都建议显式设置这个值,避免出现兼容性问题。 - 如果你的登录Activity不需要接收外部应用的Intent,测试完成后可以把
exported改回false——但如果它是应用的默认启动入口,就必须保持true或者带有intent-filter。
内容的提问来源于stack exchange,提问作者David Gourley




