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




更多相关文章

  1. 将列添加到表时可能发生的冲突
  2. 解决Android应用安装快完毕时提示签名冲突
  3. android ontouch和onclick冲突处理

随机推荐

  1. Android(cacerts.bks)添加根证书
  2. android 透明activity
  3. 使用Android Studio创建Android Wear项目
  4. TextView 中文字滚动的必要条件
  5. Android HTTP
  6. Java代码设置Android全屏
  7. Could not find SDK_Root\tools\adb.ex
  8. android上实现蓝牙透传时遇到点问题
  9. android:layout_weight 属性对于组件长度
  10. Android获取当前网络状态