美文网首页
关于onActivityResult的resultCode为0的

关于onActivityResult的resultCode为0的

作者: 管弦_ | 来源:发表于2017-08-10 11:12 被阅读0次

    问题描述

    测试反馈,我们的项目在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也是无法接收到的。

    image

    转载自:
    [Android]startActivityForResult启动singleTask的Activity,则onActivitResult()立即回调且resultCode为RESULT_CANCEL

    总结

    当Activity的启动模式为singleTask和singleInstance时,此时应当放弃使用startActivityForResult来实现回调,应当采用其他方式,比如:全局变量、onNewIntent()等方式来实现。至于为什么在Android5.1的MIUI8上居然没有出现问题,现在还是个谜。

    相关文章

      网友评论

          本文标题:关于onActivityResult的resultCode为0的

          本文链接:https://www.haomeiwen.com/subject/egxhrxtx.html