跨App启动Activity,隐式Intent启动,ActivityNotFoundException解决

自己开发的应用,有时候需要在应用内部调用别人的应用,使用隐式调用他人APP的主Activity入口即可

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//已知包名和启动Activity名 若只知道包名可以用
//下面的 openApp方法 
ComponentName cn = new ComponentName("com.zhou","com.zhou.ZhouActivity");
intent.setComponent(cn);
    try {
        startActivity(intent);
        } catch (ActivityNotFoundException e) {
            e.printStackTrace();}

不知道入口Activity名是可以使用openApp查找

private void openApp(String packageName){
        PackageManager pm = this.getPackageManager();
        try {
            PackageInfo pi = pm.getPackageInfo(packageName, 0);

            Intent a = new Intent(Intent.ACTION_MAIN,null);
            a.addCategory(Intent.CATEGORY_LAUNCHER);
            a.setPackage(pi.packageName);

            List<ResolveInfo> list =  pm.queryIntentActivities(a, 0);

            ResolveInfo info = list.iterator().next();
            if(info !=null){
                String packagename = info.activityInfo.packageName;
                String classname = info.activityInfo.name;
                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.addCategory(Intent.CATEGORY_LAUNCHER);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                ComponentName cn = new ComponentName(packagename, classname);
                intent.setComponent(cn);
                startActivity(intent);
            }

        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
}

如果启动的不是APP入口的Activity,而是指定的某个Activity
则需在跳转过去的Activity,即目标Activity添加过滤器

<activity
   android:name="com.zhou.LocalOtherActivity">
    <intent-filter>
    <action android:name="other" />
    <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

对应启动Intent

Intent intent = new Intent();
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setAction("other");//和你过滤器设置的值一致
ComponentName("com.zhou", "com.zhou.LocalOtherActivity");
intent.setComponent(cn);
startActivity(intent);

如果出现 ActivityNotFoundException 请检查package 是否为你目标APP的Package,即目标APP的manifest中的package!

猜你喜欢

转载自blog.csdn.net/ganfanzhou/article/details/50352505