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 intent = packageManager.getLaunchIntentForPackage("com.example.android"); if (intent != null) { // 清除原有组件绑定 intent.setComponent(null); intent.setAction(Intent.ACTION_VIEW); intent.setData(myAction); startActivity(intent); }
内容的提问来源于stack exchange,提问作者chrizonline
相关产品推荐
相关产品推荐

