今天使用 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了
时间: 2024-10-22 06:44:25