Android使用 startActivityForResult 、 onActivityResult 时的注意事项
2014-03-10 15:29
603 查看
今天使用 startActivityForResult 时遇到两个问题,应该是常见问题了吧,浪费了些时间才搞定,做个记录。
1. onActivityResult 的触发顺序问题
这个问题很郁闷,我一开始的设计是
MainActivity -> LoginActivity -> onActivityResult (通知已登录成功相关 UI 更新)
结果却是刚进入 LoginActivity 时就触发了 onActivityResult 事件,导致 resultCode 始终为 0 ,为这个问题郁闷了半天
MainActivity.java
Intent intent = new Intent(this, LoginActivity.class);
startActivityForResult(intent, LOGIN_REQUEST);
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了
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中回调接口使用实例
- android sdk虚拟机配置方法
- Android数据的四种存储方式
- android 没有main函数,怎么找到程序执行入口呢?以及activity主要生命周期的方法说明
- Android通过findViewById()获取控件为NULL
- 深入理解Android的startservice和bindservice
- Android的按钮单击事件及监听器的实现方式
- android之BroadcastReceiver应用详解
- Android PageAdapter翻译
- Android性能调优
- 为Android内核添加新驱动,并添加menuconfig菜单
- Android优秀开源项目[持续更新~欢迎推荐~]
- android Animations 动画效果(一)
- Android中的Selector的用法
- android第三步电话拔号器
- Android 开发中的专业词语
- 关于Android中的armeabi 和armeabi-v7a
- Android中的Handler的post方法详解
- Android移植教程