问题描述
测试反馈,我们的项目在Android版本适配上有问题,某个模块在Android5.1的MIUI8上没有问题,在4.4.4的山寨机上跑会出现bug。
查代码得知,问题出在onActivityResult的resultCode等于0。
startActivityForResult(mapIntent, ConstantsUtils.SOMETHING_REQUEST_CODE);
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
switch (requestCode) {
case ConstantsUtils.SOMETHING_REQUEST_CODE:
if(resultCode == Activity.RESULT_OK){
//do something
}
break;
}
}
如代码所示,如果resultCode一直等于0则不会执行下一步动作,从而产生BUG。
通过排查发现,Activity被设置成了singleTask模式,如果恢复成默认的standard启动模式,则没有问题。
原因解析:
在下图中,存在着前两个栈,其中直接显示在屏幕上与用户交互的Back Stack,及另一个隐藏在后台的Background Task,该栈栈顶的Activity Y其launchMode为singleTask。
如果在Activity 2中调用BackgroundTask中已经启动过的Activity Y,则Background Task内占据屏幕并且该Task下所有的栈都会保留当前的栈位置及顺序push进Back Task形成新的结构,顺序由上至下为Activity Y→Activity X→Activity 2→Activity 1。
在Activity Y界面按返回键,则ActivityY出栈,Activity X占据屏幕!注意,由Activity2调用的Activity Y,但返回键后,回退显示的是Activity X!所以即使在Activity Y执行setResult(),Activity 2也是无法接收到的。
转载自:
[Android]startActivityForResult启动singleTask的Activity,则onActivitResult()立即回调且resultCode为RESULT_CANCEL
总结
当Activity的启动模式为singleTask和singleInstance时,此时应当放弃使用startActivityForResult来实现回调,应当采用其他方式,比如:全局变量、onNewIntent()等方式来实现。至于为什么在Android5.1的MIUI8上居然没有出现问题,现在还是个谜。