• Android使用 startActivityForResult 、 onActivityResult 时的注意事项


    今天使用 startActivityForResult 时遇到两个问题,应该是常见问题了吧,浪费了些时间才搞定,做个记录。

    1. onActivityResult 的触发顺序问题

    这个问题很郁闷,我一开始的设计是 

    MainActivity -> LoginActivity -> onActivityResult  (通知已登录成功相关 UI 更新)

    结果却是刚进入 LoginActivity 时就触发了 onActivityResult  事件,导致 resultCode 始终为 0 ,为这个问题郁闷了半天

    MainActivity.java

                Intent intent = new Intent(this, LoginActivity.class);
                startActivityForResult(intent, LOGIN_REQUEST);

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data)
        {
            ZLog.i(TAG, "onActivityResult: requestCode="+ requestCode +", resultCode="+ resultCode);
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == LOGIN_REQUEST) {
                ZLog.i(TAG, "requestCode");
                if (resultCode == LOGIN_RESULT) {
                    ZLog.i(TAG, "resultCode");
                    this.onCreateOptionsMenu(this.mMenu);
                }
            }
        }

    LoginActivity.java

                    setResult(MainActivity.LOGIN_RESULT);
                    finish();


    后来谷歌一番之后,找到了问题所在,是 onActivityResult 和 AndroidManifest.xml 中 activity 的 launchMode 配置有冲突造成的。


    解决办法:

    需要返回 result 的 activity 不能使用:

    android:launchMode="singleTask"
    android:launchMode="singleInstance"


    甚至有人说 singleTop 也会冲突,那就只好用默认的 standard 了,至于原理我没空深入去研究了。

    经试验,设置为默认的 standard 后确实就正常了,暂时就这样解决吧。


    2. 执行 finish() 后出现错误提示 Activity has leaked window com.android.internal.policy.impl.PhoneWindow



    这是因为在执行 finish 释放一个 activity 时,还有一些依赖于该 activity 的控件没有关闭造成的,我这里是因为 dialog 只是执行了一下 hide() 方法,使用 dismiss() 一下就ok了




  • 相关阅读:
    微信红包开发
    第一次开博客,留此纪念
    数据结构--树(遍历,红黑,B树)
    c++之vector
    动态规划求解最长公共子序列问题
    c++之map
    k-折交叉验证(k-fold crossValidation)
    prim算法
    快速排序算法
    浙大机试题目
  • 原文地址:https://www.cnblogs.com/zhouzme/p/5758454.html
Copyright © 2020-2023  润新知