今天使用 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了