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了




目录
相关文章
|
Android开发
Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听
原文:Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听 简单记录下android 盒子开发遥控器的监听 ,希望能帮到新入门的朋友们 不多说,直接贴代码 public...
7562 0
|
2月前
|
Android开发
Android面试题之自定义View注意事项
在Android开发中,自定义View主要分为四类:直接继承View重写onDraw,继承ViewGroup创建布局,扩展特定View如TextView,以及继承特定ViewGroup。实现时需注意:支持wrap_content通过onMeasure处理,支持padding需在onDraw或onMeasure/onLayout中处理。避免在View中使用Handler,使用post系列方法代替。记得在onDetachedFromWindow时停止线程和动画以防止内存泄漏。处理滑动嵌套时解决滑动冲突,并避免在onDraw中大量创建临时对象。
37 4
|
11月前
|
Java 程序员 Android开发
C++ 程序员,安卓开发注意事项
C++ 程序员,安卓开发注意事项
|
Android开发
Android onActivityResult()的属性与用法
Android onActivityResult()的属性与用法
126 1
|
存储 Android开发
Android startActivityForResult和onActivityResult的基本用法
Android startActivityForResult和onActivityResult的基本用法
90 0
|
XML 缓存 数据库
Android桌面小部件开发,及注意事项
Android桌面小部件开发,及注意事项
428 0
|
Android开发
关于安卓aab打包生成apks注意事项
关于安卓aab打包生成apks注意事项
284 0
|
存储 IDE 编译器
Android C++系列:函数返回值注意事项
函数返回值就是使用return语句终止正在执行的函数,看是很简单的问题有什么说的呢?因为越是简单的问题里面越是有一些不易发现的坑。
88 0
|
编译器 Android开发 C++
Android C++系列:数组在函数中注意事项
数组作为函数形参传递的是数组首元素的地址本来是很简单的知识点,但是在具体使用中还会有一些坑需要注意。
122 0
|
缓存 5G Shell
【Android 电量优化】电量优化 ( Battery Historian 环境要求 | 电量分析报告 | 电量优化三原则 | 电量优化注意事项 )(二)
【Android 电量优化】电量优化 ( Battery Historian 环境要求 | 电量分析报告 | 电量优化三原则 | 电量优化注意事项 )(二)
306 0
【Android 电量优化】电量优化 ( Battery Historian 环境要求 | 电量分析报告 | 电量优化三原则 | 电量优化注意事项 )(二)