You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用间深度链接异常:App1登录按钮跳转App2主页而非登录页

问题根源分析

你遇到的问题出在App1中创建Intent的方式上——getLaunchIntentForPackage()方法返回的是App2的启动页Intent(也就是绑定到MainActivity的Intent,因为它带有LAUNCHER的intent-filter)。即使你后续给这个Intent设置了ACTION_VIEW和Uri,系统依然会优先使用Intent中已绑定的组件信息(MainActivity),而不会去匹配LoginActivity的intent-filter。

而你用adb命令测试时,是直接创建了一个不带指定组件的Intent,系统会根据ACTION_VIEW和Uri去匹配App2中对应的intent-filter,所以能正确启动LoginActivity。

修正方案

把App1中创建Intent的代码替换成直接构建Intent,而不是依赖getLaunchIntentForPackage():

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button loginBtn = (Button) findViewById(R.id.btn_login); 
    loginBtn.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
            // 直接构建深度链接Intent
            Uri deepLinkUri = Uri.parse("example://login");
            Intent intent = new Intent(Intent.ACTION_VIEW, deepLinkUri);
            // 可选:如果想确保只打开目标App,可添加包名限制
            intent.setPackage("com.example.android");
            
            if (intent.resolveActivity(getPackageManager()) != null) {
                startActivity(intent);
            }
        } 
    }); 
}
额外说明
  • intent.resolveActivity(getPackageManager())可以用来检查是否有App能处理这个Intent,避免出现找不到Activity的崩溃。
  • 如果你坚持要用getLaunchIntentForPackage(),需要清除它原有的组件信息,再设置action和data:
    Intent intent = packageManager.getLaunchIntentForPackage("com.example.android");
    if (intent != null) {
        // 清除原有组件绑定
        intent.setComponent(null);
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(myAction);
        startActivity(intent);
    }
    
    但这种方式不如直接构建Intent优雅,更推荐第一种方案。

内容的提问来源于stack exchange,提问作者chrizonline

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:00:31