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

Android跨应用跳转后AppB的onCreate方法出现死循环问题

问题根因

  • AppB的onCreate中跳转AppA的逻辑没有做执行次数限制,只要进入onCreate就会触发跳转,和你预期的「仅新安装时执行」不符
  • 调用recreate()重建Activity时,携带Key参数的Intent会被保留,每次重建后getIntent().hasExtra("Key")都会返回true,触发无限重建
  • 存在参数类型不匹配问题:你往Intent中存入的Key值是String类型,读取时用了getLongExtra,即使不触发死循环也拿不到正确值
  • 原有代码存在语法笔误:starActivity缺少字符t应为startActivity,构造ComponentName的代码末尾缺少右括号

解决方案

第一步:给AppB的跳转AppA逻辑加执行限制

用SharedPreferences存储首次启动标记,只有第一次打开AppB时才执行跳转逻辑,同时统一参数类型、处理完参数后主动清理Intent中的额外参数,避免重复触发重建:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...其他初始化代码
    SharedPreferences sp = getSharedPreferences("app_config", MODE_PRIVATE);
    // 仅首次启动时执行跳转AppA逻辑
    if (sp.getBoolean("is_first_start", true)) {
        Intent i = new Intent();
        i.putExtra("Key", 1L); // 统一参数类型为Long,和后续读取逻辑匹配
        i.setComponent(new ComponentName("com.example.AppA", "com.example.AppA.MainActivity"));
        startActivity(i);
        sp.edit().putBoolean("is_first_start", false).apply(); // 标记已执行过首次跳转
        finishAffinity();
        return; // 直接终止后续逻辑,避免不必要的执行
    }

    // 处理来自AppA的跳转参数
    Intent i1 = getIntent();
    if (i1.hasExtra("Key")) {
        long temp = i1.getLongExtra("Key", -1);
        // 先移除Intent中的参数,避免重建后再次触发
        i1.removeExtra("Key");
        setIntent(i1);
        // 执行重建逻辑
        recreate();
    }
}

可选优化

如果不需要跨应用长期携带参数,跳转时可以添加FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP标记按需清理栈,避免重复携带无效参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:45:01