最近实习要做一个需求的一部分是打开UC浏览器.
当然并不是那种使用UC浏览器打开一个网址,而是就像从launcher点开一样的打开.
到百度上搜,都说需要包名和主Activity名.实现起来也特别麻烦.自己尝试了半天也没有正确实现,结果在浏览PackageManager的方法的时候无意中发现一个叫getLaunchIntentForPackage的方法,只需要传入包名就能打开相应的应用,当然前提是你安装了,尝试了一下,成功了.
比如说我要打开UC浏览器,只需要知道UC浏览器的包名com.UCMobile,用下面的代码就可以调用
startActivity(getPackageManager().getLaunchIntentForPackage("com.UCMobile"));
但是我比较好奇网上的实现方法到底对不对,看了一下这个方法的源码,如下
@Override
public Intent getLaunchIntentForPackage(String packageName) {
// First see if the package has an INFO activity; the existence of
// such an activity is implied to be the desired front-door for the
// overall package (such as if it has multiple launcher entries).
Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
intentToResolve.addCategory(Intent.CATEGORY_INFO);
intentToResolve.setPackage(packageName);
List<ResolveInfo> ris = queryIntentActivities(intentToResolve, 0);
// Otherwise, try to find a main launcher activity.
if (ris == null || ris.size() <= 0) {
// reuse the intent instance
intentToResolve.removeCategory(Intent.CATEGORY_INFO);
intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER);
intentToResolve.setPackage(packageName);
ris = queryIntentActivities(intentToResolve, 0);
}
if (ris == null || ris.size() <= 0) {
return null;
}
Intent intent = new Intent(intentToResolve);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName(ris.get(0).activityInfo.packageName,
ris.get(0).activityInfo.name);
return intent;
}
网上的实现和Android源码中的实现最大的不同就是Android源码中考虑了app有多个launcher入口的情况.但是显然调用这么一个简单的方法比像网上那样写那么多还写错要好.
有些时候真的要多看看文档再动手,免得重复劳动.