今天有个需求,就是通过intent启动一个activity前要先判断手机上是否存在该activity。
通过查找网上资料以及自己的试验,得到的解决方案如下:
使用Intent的resolveActivityInfo方法,该方法会查找与Intent匹配的最佳的activity的详细信息,
如果系统不存在该activity,则该方法会返回null。
根据官方帮助文档的描述,方法中的第二个参数可以是
Use any combination of GET_META_DATA
, GET_SHARED_LIBRARY_FILES
, to modify the data (in ApplicationInfo) returned。
另外,网上还提供了另外一种方案:
You could create an Intent object with necessary component info and then check if the intent is callable or not.I stumbled upon this snippet here on SO, don't have the link to the actual thread.
private boolean isCallable(Intent intent) {
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
方案我没试验过,这个方法会找出所有可以响应这个Intent的activity的信息。
遇到的坑:
一开始使用了Intent的resolveActivity方法做判断,该方法返回的是与Intent匹配的activity的名称。
这个方法对于没有明确在Intent中明确指明component name的Intent有效,如果不存在可以匹配的activity,则返回的是null。
但对于明确指明了component name,但系统实际没有安装该activity的,该方法也会返回component name。
我还是通过查看源码才发现的,后来看google文档,才发现人家也是说对于隐式Intent才推荐使用该方法。