轉換Activity取得結果
其實,上一篇 來證明你會了吧,Atm專案之登入功能實務 所完成的功能實際上是有問題(bug)的,在登入功能畫面時假如按下返回鍵,也可以正常回到主畫面。這個問題出在從MainActivity中過去LoginActivity時,使用的是startActivity方法,而不是startActivityForResult方法,由方法名稱可看出來,startActivityForResult是到另一個畫面中並取得結果(資料)的,在本例的登入功能應該使用這一個方法才是。
一個主功能的Activity可能會轉換到不同的畫面後,再回到主功能畫面後若需要取得特定的結果,使用startActivityForResult方法,可達成這類的需求,如下圖:
當畫面轉換至登入功能後,在結束的地方,以程式碼撰寫,並把欲傳回主功能的資料放在Intent中,再結束Activity,當回到主功能時,會自動呼叫「onActivityResult方法」,如下圖:
轉換Activity並取得結果的設計方式,有以下幾個步驟:
- 定義代表該功能的常數
- 呼叫startActivityForResult
- 在功能畫面結束之前設定返回值
- 回到主功能的onActivityResult方法
定義功能常數(int)
在MainActivity中新增一個類別層級常數FUNC_LOGIN,代表登入功能,如下:
呼叫startActivityForResult
在onCreate方法判斷尚未登入時,改以startActivityForResult方法啟動LoginActivity,如下圖:
上圖方法的第二個參數,使用上一步驟所定義的功能常數FUNC_LOGIN,如下:
startActivityForResult(intent, FUNC_LOGIN);
在功能畫面結束之前設定返回值
開啟LoginActivity,在login方法中,在原本呼叫finish方法之前,加入程式碼:
上圖程式碼第39與40行將帳號與密碼放入Intent物件中,第41行再呼叫Activity的setResult方法,設定這一個功能畫面的結果為RESULT_OK,並把Intent物件放入結果中,目的是在功能結束後,回去MainActivity後仍可得到結果。
回到主功能的onActivityResult方法
回到MainActivity中,按下覆寫方法的組合鍵「Ctrl+O」,再選擇覆寫onActivityResult方法,如下圖:
覆寫完成後,onActivityResult方法如下:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); }
方法內傳入參數的requestCode即是第一定義與第二步驟所傳遞的功能常數,第二與第三個參數則是由第三步驟在LoginActivity結束前所設定的RESULT_OK與Intent物件,參數名稱為resultCode與data。
接下來應該先判斷是否是requestCode是否為FUNC_LOGIN,是的話再進一步判斷resultCode是否為RESULT_OK,最後再取得Intent中的資料,程式碼如下:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == FUNC_LOGIN){ if (resultCode == RESULT_OK){ String uid = data.getStringExtra("LOGIN_USERID"); String pw = data.getStringExtra("LOGIN_PASSWD"); Log.d("RESULT", uid + "/" + pw); }else{ finish(); } } }
執行,並輸入帳號jack與密碼1234後,回到MainActivity之後檢視LogCat,將可找到如下圖的Log資料: