《Android》『Intent』- 透過 Intent 切換 Activity 並利用 Bundle 傳送參數
《Android Developers 參考文獻》
《簡單介紹》
Intent 照字面翻譯,有『意圖』的意思,我們可以把它想像為這個應用程式的意圖,而要完成這個意圖,我們通常需要為其附帶一個『動作』,也就是 Action,像是撥打電話時需要代入 ACTION_DIAL、傳送電子郵件需要代入 ACTION_SENDTO…等,詳細的介紹我會另外寫一篇整理,這邊我們先來看看如何使用 Intent 來切換 Activity。
在前面 Activity 的生命週期文章中,我們已經知道 Activity 在是一個應用程式中,程序執行時的”行為”,一個 Application 可以由多個 Activity 的交互作用所構成。那麼當我們要由一個 Activity 切換至另一個 Activity 的時候,在程式碼中該如何實做呢?這個時候 Intent 就派上用場了。
《用法介紹》
➥透過 intent 由 A activity 跳轉至 B activity
➥透過 intent.putExtra() 夾帶基本型別參數
➥透過 Bundle 與 intent.putExtras() 夾帶基本型別參數
➥透過 startActivityForResult() 回傳參數給原 activity
透過 intent 由 A activity 跳轉至 B activity
透過 Intent 切換 Activity 的方法其實很簡單,以下我們直接透過程式碼片段做說明 –
1 2 3 4 5 6 7 |
. . Intent i = new Intent(); i.setClass(A.this, B.class) startActivity(i); A.this.finish();//結束目前 Activity |
寫法一
1 2 3 4 5 6 |
. . Intent intent = new Intent(A.this, B.class); startActivity(intent); A.this.finish();//結束目前 Activity |
寫法二
透過如上方式,我們可以輕易地將應用程式從 A activity 切換至 B activity,那麼如果我們想在切換的同時,把我們所需的參數由 A activity 傳至 B activity 呢?
跳轉 Activity 時傳遞基本型別參數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
. . //A.class(傳送資料) String str = "Xavier" Intent intent = new Intent(); intent.setClass(A.this,B.class); intent.putExtra("name", str);//此方式可以放所有基本型別 startActivity(intent); . . . //B.class(接收資料) Intent intent = this.getIntent();//取得傳遞過來的資料 String name = intent.getStringExtra("name"); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
. . //A.class(傳送資料) int age = 18; String name = "Xavier"; Intent intent = new Intent(); intent.setClass(A.this,B.class); Bundle bundle = new Bundle(); //new一個Bundle物件,並將要傳遞的資料傳入 bundle.putInt("age", age); //傳遞int bundle.putString("name", name); //傳遞String intent.putExtras(bundle);//將Bundle物件傳給intent . . . //B.class(接收資料) Bundle bundle = getIntent().getExtras(); String name = bundle.getString("name"); int age = bundle.getInt("age"); startActivity(intent);//切換Activity |
寫法二 : 透過 Bundle 實作
我們可以透過 intent 本身的 putExtra() 函式直接設定所要代入的參數,此參數可以是所有基本型別;亦可以透過另外宣告一個 Bundle 物件,將所要代入的參數設定好,再透過 intent 本身的 putExtras() 函式把設定好的 Bundle 一次塞給 intent,達到在不同 activity 間傳遞參數的效果。
跳轉 Activity 時傳遞物件
若要在跳轉 Activity 時傳遞物件,所要傳遞的物件必須 implements Serializable,接著我們才能透過 Bundle.putSerializable(Key,Object) 的方式,實現物件的傳遞。
相關程式碼片段如下 –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class CustomObject implements Serializable { ... //宣告一個繼承 Serializable 的物件 } . . . //A Activity CustomObject mCustomObject = new CustomObject(); Intent intent = new Intent(); Bundle bundle = new Bundle(); bundle.putSerializable("CustomObject", CustomObject); intent.putExtras(bundle); startActivity(i); . . . //B Activity CustomObject mCustomObject = null; mCustomObject = getIntent().getSerializableExtra("CustomObject") . . |
透過 putSerializable() 實作
透過 Bundle.putSerializable() 的方式,可以輕易地完成物件的傳遞,當然若是把物件宣告成 public static 型別,我們亦可以不用傳遞物件,直接對物件本身做操作。
從 A 跳轉到 B,再從 B 傳參數回去
在上面的例子中,我們都是透過 startActivity() 的方式來開啟新的活動 (Activity),讓 activity 由 A 跳轉至 B,但有時候我們會需要知道一些跳轉到 B 以後的判斷,來決定 A 所要執行的動作,這時候,我們就需要使用 startActivityForResult(),讓應用程式從 A 跳轉至 B 後,再從 B 傳參數回去給 A。
以下直接透過程式碼片段做說明 –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
. . // A.class private static final int REQ_FROM_A = 1; Intent intent = new Intent(A.this,B.class); startActivityForResult(intent, REQ_FROM_A);//REQ_FROM_A(識別碼) . . . @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode == RESULT_B) //確認是否從 B 回傳 { if(requestCode == REQ_FROM_A) //確認所要執行的動作 { String result = data.getExtras().getString("name"); } } } . . . //B.class private static final int RESULT_B = 1; Intent intent = getIntent(); Bundle bundle = new Bundle(); bundle.putString("name",name); intent.putExtras(bundle); setResult(RESULT_B, intent); B.this.finish(); . . |
startActivityForResult() 實作
當我們由 A activity 使用 startActivityForResult() 時,我們通常會傳入一個宣告為 static int 型別的識別碼,並在 onActivityResult() 中覆寫方法,以接收從 B activity 傳回來的參數並執行判斷,在 onActivityResult() 內,共有三個參數分別是 requestCode、resultCode、data,其中 requestCode 記錄著由 A 所傳出去的識別碼,resultCode 記錄著在 B 裡面透過 setResult() 函式設定的識別碼,data 則記錄著 setResult() 函式所夾帶的參數。
臉書留言
一般留言