Android 14(API 34)启动Activity报错:No Activity found to handle Intent
Android 14下Activity-for-Result启动失败(ActivityNotFoundException)的解决办法
问题根源
Android 14对隐式Intent的解析规则做了收紧,你的代码中使用仅包含action的隐式Intent启动应用内Activity,在Android 13及以下系统中可能因系统检查宽松可正常匹配,但Android 14下必须满足更严格的匹配条件才会被识别。
解决方案
方案1:改用显式Intent(推荐)
应用内启动Activity最可靠的方式是使用显式Intent,直接指定目标Activity的类,完全避免隐式Intent的兼容性问题。修改代码如下:
// 替换TargetActivity为你实际要启动的Activity类 myNewActivity.launch(new Intent(myActivity, TargetActivity.class));
方案2:修复隐式Intent配置(若必须使用隐式Intent)
如果坚持使用隐式Intent,需完成两项配置:
- 给目标Activity的intent-filter添加DEFAULT category
在AndroidManifest.xml中,确保目标Activity的包含 android.intent.category.DEFAULT,因为隐式Intent启动Activity必须匹配该category:<activity android:name=".TargetActivity" android:exported="false"> <!-- 应用内启动无需设为true --> <intent-filter> <action android:name="app.my.application.MyActivity"/> <!-- 添加这一行 --> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> - 给Intent添加包名限定
若启动的Intent仅指定action,Android 14可能搜索所有可见应用的Activity,添加包名限定可确保只在当前应用内查找:Intent intent = new Intent("app.my.application.MyActivity"); // 限定只在当前应用内查找Activity intent.setPackage(myActivity.getPackageName()); myNewActivity.launch(intent);
补充说明
Android 14对隐式Intent的限制主要是为提升系统安全性,避免Intent被其他应用劫持。对于应用内页面跳转,显式Intent始终是最优选择,不仅兼容性更好,还能规避潜在安全风险。
内容的提问来源于stack exchange,提问作者Rishabh Kabra
相关产品推荐
相关产品推荐

