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

在Android开发中,通过隐式Intent调用其他应用的Activity是常见操作。当不确定目标Activity名称时,可以使用工具辅助查找。然而,若要启动特定的非入口Activity,需在目标Activity的清单文件中设置过滤器。如果遇到ActivityNotFoundException,务必确认使用的package是否正确,即目标APP manifest中的package。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己开发的应用,有时候需要在应用内部调用别人的应用,使用隐式调用他人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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值