Android使用 startActivityForResult 、 onActivityResult 時的注意事項
今天使用 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了
最後更新:2017-04-03 12:55:33