Android使用 startActivityForResult 、 onActivityResult 时的注意事项
2024-08-24 05:24:20
今天使用 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了
最新文章
- Java简易日历的实现
- Java 8 Stream API详解--转
- Guava学习-目录
- [转]office 2016 4合1/3合1 专业版 增强版 精简绿色安装版
- java控制台输入
- iOS 利用self.navigationItem.backBarButtonItem修改后退按钮文字
- 迷你sql profile,给缺少sql跟踪的朋友们
- Session深入理解
- css expression explaination
- css05文本,文字属性
- Android手势识别(单击 双击 抬起 短按 长按 滚动 滑动)
- mongodb迁移
- 响应式web-媒体查询
- Git使用教程,最详细,最傻瓜,最浅显,真正手把手教
- PHP获取新插入的主键id
- hive中使用union出现异常数据
- _T宏的使用
- mysql 常用sql语句
- virt-manager中为centos 7.2 扩容根分区
- 从浏览器输入URL到显示页面到底发生了什么?