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
相关产品推荐
相关产品推荐

