Android 11下调用startActivityForResult等API跳转singleTask主页无法返回问题
问题根因
你遇到的问题是Android官方对singleTask启动模式的规则收紧导致的:
- 按照Android原生规范,
singleTask模式的Activity全局仅存在一个实例,当已有实例存在时,系统会直接将该实例上方的所有Activity弹出任务栈,复用现有实例,回调onNewIntent->onResume,不会触发onCreate。Android 10及以下存在兼容漏洞,偶发会重新创建实例,Android 11修复了该漏洞,行为完全符合官方规范。 - 同时官方明确不支持对
singleTask/singleInstance模式的Activity使用startActivityForResult(包括新的Activity Result API),因为这类Activity和发起启动的Activity不在同一个任务栈,无法传递返回结果,所以你调用finish后任务栈内已经没有SecondaryActivity实例,应用直接退出。
解决方案
方案1:不删除MainActivity的singleTask启动属性(无历史兼容风险)
调整原有跳转和结果传递逻辑即可解决,不需要修改原有业务流程:
- SecondaryActivity跳转MainActivity无需使用Activity Result API,直接用普通
startActivity即可:
public void onPhoneNumberClick() { Intent intent = new Intent(this, MainActivity.class); intent.putExtra("UserInfo", userInfo); intent.putExtra("SecondaryActivity", true); startActivity(intent); }
- 在MainActivity中重写
onNewIntent方法处理传入参数,所有参数判断逻辑都放在这里,不会增加onResume的额外开销:
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); // 仅当从SecondaryActivity跳转过来时才执行以下逻辑 if (intent.getBooleanExtra("SecondaryActivity", false)) { UserInfo userInfo = (UserInfo) intent.getSerializableExtra("UserInfo"); // 切换到手机号选择列表Fragment的逻辑 } }
- 选完手机号后改用启动SecondaryActivity的方式回传结果,给Intent加
FLAG_ACTIVITY_SINGLE_TOP标记复用已有的SecondaryActivity实例:
// MainActivity中选完号码后的逻辑 Intent returnIntent = new Intent(this, SecondaryActivity.class); returnIntent.putExtra(PHONE_NUMBER, phoneNumber); returnIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(returnIntent); // 如果不需要用户返回当前MainActivity实例,再加以下代码: finish();
- 在SecondaryActivity中重写
onNewIntent接收结果即可:
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (intent.hasExtra(PHONE_NUMBER)) { String phoneNumber = intent.getStringExtra(PHONE_NUMBER); // 处理手机号逻辑 } }
方案2:后续排查singleTask使用场景后的优化方案
如果后续你排查清楚当初设置singleTask的原因,确认可以调整的话,可以用以下更规范的方案:
- 如果是为了避免MainActivity重复创建,可以把启动模式换成
singleTop,启动MainActivity的时候加FLAG_ACTIVITY_CLEAR_TOP标记,既可以保证单实例,也可以正常使用Activity Result API获取返回结果 - 也可以把手机号选择逻辑抽成独立的
PickPhoneActivity,不用耦合在MainActivity里,启动模式用默认标准模式,直接用Activity Result API跳转拿结果,完全不影响原有MainActivity的逻辑
内容的提问来源于stack exchange,提问作者Aaron Tuil
相关产品推荐
相关产品推荐

