intent.resolveActivity!= null但是启动intent会抛出一个ActivityNotFound异常

tan*_*ine 24 android android-intent

我在这里发布这个问题用于教育目的,因为我无法在任何地方找到答案,最终找到了原因,即我自己.

这是有问题的代码:

// initially getting the intent from polling the PackageManager about activities resolving Search intent.

ComponentName componentName = intent.resolveActivity(pm);

if (componentName != null) {
    context.startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)

尽管检查我得到一个ActivityNotFound异常.

编辑:显然这一点对每个人来说并不明显:为什么有一个活动解决了意图,但试图启动它会抛出一个ActivityNotFound异常 - 两个事实显然是矛盾的?

tan*_*ine 29

从我所看到的,如果有任何活动解决此意图,intent.resolveActivity()将返回true.即使没有导出此活动(这使得它不能用于所有实际目的,以防它不在您的包中).Android的API并不在乎提及,因此您必须自己解决,并确保您尝试启动的活动确实已导出.

ActivityInfo activityInfo = intent.resolveActivityInfo(pm, intent.getFlags());
if (activityInfo.exported) {
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)

编辑:这个问题的重点是ResolveActivity将返回一个componentName,即使activityInfo.exported == false并且它不是来自你自己的包 - 这使得它无法解析,并且让我感到惊讶,因为意图已经解决但却无法解决.

  • 很好的解决方案,只需要执行null检查,因为activityInfo可以为null。 (3认同)