不要問我從哪裡來~我的故鄉在遠方…
謎之音:「喂!~」
怕有人會接唱走就先唱出來了…
謎之音:「搞錯重點了吧!先說今天的重點啦!」
何去何從~
謎之音:「啊!?…」
呈如一開始的那一句,在 Android 的世界裡,每個 Activity 皆有自己執行的生命週期,但是每個 Activity 之間誰執行到哪裡,誰返回上一頁結束時回到誰身上,亦或是說被重新啟動(onRestart)時,又是從誰接棒回來的~若是沒有需求時,「別問從何方來」是真的不會有什麼影響,可是,我們真想要知道是從哪個 Activity 回來、想要從不同地方回來的 Activity 獲得不同的資料時,得要怎麼處理,這就是今天的主題啦!
皆下來要麻煩各位直接抓下Day22_Menu的範例,在下稍微動了點手腳,除了 MoogleActivity 外,ChocoboActivity 以及 Moogle2Activity 在點下 menu 的清單按鈕時,都會將現階段的自己結束掉「finish()」。在這種狀況下,只要是從「清單頁」也就是從 Moogle3Activity 返回後,一律都會回到 MoogleActivity。大家可能會在心裡想,這樣有什麼關係嗎?就如第上一段所提到的觀點,我們若沒有想要做什麼事的話,這麼做的確是沒有什麼問題,但若是我們想讓 MoogleActivity 在接收不同地方所返回而有不同的反應時,得要怎麼做呢?
這個時候,我們就要回到這系列的主線任務啦~
謎之音:「這系列有主線任務哦!」
那就麻煩大家取得昨天的範例之後,將之重新複製為「Day23_ReturnTo」吧!各位可以先執行看看,除了 MoogleActivity 外,其餘二者都在執行到 Moogle3Activity 之後會再回到自己的前一個 Activity 而不是自己,這時候就請各位先加入編號的物件。
先在將專案的 Package 上,點下新增圖示會開啟新增視窗,這時請選擇 Java 的 Class,會看到下面這個畫面
請確認目錄、Package是我們今天這個專案的位子,接著請在Name的欄位打上"Number"後結束,這時就會新增一個 Number.java 的檔案了!這時候我們先定義四個靜態常數:
public class Number {
public static final int Chocobo = 0;
public static final int MOOGLE = 1;
public static final int MOOGLE2 = 2;
public static final int MOOGLE3 = 3;
}
接著,請到Moogle3Activity的介面上加入一個按鈕,將按鈕設定名稱為"@+id/btn_moogle3_back",然後在 Moogel3Activity 定義以下的動作
//先宣告全域的物件
private Button mBtnBack;
定義偵聽式,這裡是一個重要的關鍵
setResult()是設定回傳的函式
private View.OnClickListener btnClick = new View.OnClickListener() {
public void onClick(View v) {
//這裡除了結束自己外還要設定回傳值
setResult(Number.MOOGLE3);
finish();
}
};
給定物件並設定動作
mBtnBack = (Button)findViewById(R.id.btn_moogle3_back);
mBtnBack.setOnClickListener(btnClick);
再來,先從 MoogleActivity.java 的 Menu 動作來設定,整個區塊如下
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.menu_moogle:
Intent intent = new Intent(this, Moogle3Activity.class);
//startActivity(intent);
//用startActivityForResult來取代之
startActivityForResult(intent, Number.MOOGLE);
break;
}
return super.onOptionsItemSelected(item);
}
startActivityForResult()是接收回傳值的啟動函式。
啟動函式、回傳函式準備好了,再來就是接收函式了!
@Override
protected void onActivityResult(
int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(resultCode){
case Number.MOOGLE3:
Toast.makeText(this, "看過清單了", Toast.LENGTH_SHORT).show();
break;
}
}
這邊只用到返回函式裡的一個"resultCode"值,這裡所接收的就是在Moogle3Activity.java裡所設定的setResult()函式裡的Number.MOOGLE3。如此一來,在Moogle3Activity這裡按下返回按鈕後,回來到MoogleActivity就會從startActivityForResult開始啦!
今天就簡單地為各位做這樣的說明,明天我們再來針對 Chocobo 以及 Moogle2 來玩一些互動吧^_^
Day 22 - Android - 任意門《 》Day 24 - Android - 溝通