我在这里发布这个问题用于教育目的,因为我无法在任何地方找到答案,最终找到了原因,即我自己。
这是有问题的代码:
// initially getting the intent from polling the PackageManager about activities resolving Search intent.
ComponentName componentName = intent.resolveActivity(pm);
if (componentName != null) {
context.startActivity(intent);
}
尽管检查我得到一个ActivityNotFound异常。
编辑:显然这一点对所有人来说并不明显:为什么有一个活动解决了意图,但试图启动它会抛出一个ActivityNotFound异常 - 两个事实显然是矛盾的?答案 0 :(得分:27)
从我所看到的,如果有任何活动解析此意图,intent.resolveActivity()将返回true。即使没有导出此活动(这使得它不能用于所有实际目的,以防它不在您的包中)。 Android的API并不关心提及,因此您必须自己解决,并确保您尝试启动的活动确实已导出。
ActivityInfo activityInfo = intent.resolveActivityInfo(pm, intent.getFlags());
if (activityInfo.exported) {
doSomething();
}
编辑:这个问题的重点是ResolveActivity将返回一个componentName,即使activityInfo.exported == false并且它不是来自你自己的包 - 这使得它无法解析,并让我感到惊讶因为意图得到了解决然而却不可挽回
答案 1 :(得分:1)
ActivityNotFound
或其中一个变体的调用失败,因为无法找到startActivity(Intent)
来执行给定的Activity
时,会引发 Intent
异常。例如,如果您尝试发送电子邮件,但设备上没有可以处理ACTION_SEND
意图操作的应用,则会引发ActivityNotFound
。
避免异常的方法是执行以下操作:
final ComponentName componentName = intent.resolveActivity(pm);
if (componentName != null) {
try {
context.startActivity(intent);
} catch (ActivityNotFoundException ex) {
// Notify the user?
}
}