android 开发,如何从自己的APP打开另一个APP

来源:互联网 发布:健康大数据定义 编辑:程序博客网 时间:2024/05/30 05:13

当你需要从自己的APP中打开另一个APP的时候,网上搜到的方法一般可以打开大部分的APP。

  
public static void  openApp(Activity activity,String packageName) {    PackageInfo pi;    try {        pi = activity.getPackageManager().getPackageInfo(packageName, 0);        Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);        resolveIntent.setPackage(pi.packageName);        PackageManager pManager = activity.getPackageManager();        List<ResolveInfo> apps = pManager.queryIntentActivities(                resolveIntent, 0);     ResolveInfo ri = (ResolveInfo) apps.iterator().next();    if (ri != null) {        packageName = ri.activityInfo.packageName;        String className = ri.activityInfo.name;        Intent intent = new Intent(Intent.ACTION_MAIN);        ComponentName cn = new ComponentName(packageName, className);        intent.setComponent(cn);        activity.startActivity(intent);    }    } catch (PackageManager.NameNotFoundException e) {        Log.e(TAG, "Package Name not found: " + e.getMessage() + ", App is not installed.");    } catch (SecurityException e){        SnackBar.newBuilder().activity(activity).                text(activity.getString(R.string.permission_denied_to_open))                .build().show();    }}

但是在我自己的实践当中遇到了两个问题,这里总结一下。

第一:无法打开微信(部分机型),但是大部分机型打开微信都会出现无法关闭返回自己APP的问题。这里需要加一句话:

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);(打开一个新任务)

第二:无法打开QQ阅读。经过网上求教大大,最后发现是
 List<ResolveInfo> apps = pManager.queryIntentActivities(                resolveIntent, 0);
这里得到的结果不止一个,其中只有一个包含了正确的APP启动aty。需要将代码修改为如下,即
可避免上面说的两个问题
  public static void  openApp(Activity activity,String packageName) {        PackageInfo pi;        try {            pi = activity.getPackageManager().getPackageInfo(packageName, 0);            Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);            resolveIntent.setPackage(pi.packageName);            PackageManager pManager = activity.getPackageManager();            List<ResolveInfo> apps = pManager.queryIntentActivities(                    resolveIntent, 0);            for(ResolveInfo app: apps){                Log.d(TAG,String.format("%s %s",app.activityInfo.packageName,app.activityInfo.name));                packageName = app.activityInfo.packageName;                String className = app.activityInfo.name;                Intent intent = new Intent(Intent.ACTION_MAIN);                       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//                intent.addCategory(Intent.CATEGORY_LAUNCHER);                ComponentName cn = new ComponentName(packageName, className);                intent.setComponent(cn);                try {                    activity.startActivity(intent);                }catch(SecurityException e){                    e.printStackTrace();                }            }      /*  ResolveInfo ri = (ResolveInfo) apps.iterator().next();        if (ri != null) {            packageName = ri.activityInfo.packageName;            String className = ri.activityInfo.name;            Intent intent = new Intent(Intent.ACTION_MAIN);            intent.addCategory(Intent.CATEGORY_LAUNCHER);            ComponentName cn = new ComponentName(packageName, className);            intent.setComponent(cn);            activity.startActivity(intent);        }*/        } catch (PackageManager.NameNotFoundException e) {            Log.e(TAG, "Package Name not found: " + e.getMessage() + ", App is not installed.");        } catch (SecurityException e){            SnackBar.newBuilder().activity(activity).                    text(activity.getString(R.string.permission_denied_to_open))                    .build().show();        }    }

0 0