Android Intent和Bundle 傳遞資料(包含傳遞自定義物件)

Android Intent和Bundle 傳遞資料(包含傳遞自定義物件)

Android Intent和Bundle 傳遞資料(包含傳遞自定義物件)

 

資料來源:http://cookiesp.pixnet.net/blog/post/84190702-android-intent%26bundle-%E5%82%B3%E9%81%9E%E8%B3%87%E6%96%99(%E5%8C%85%E5%90%AB%E5%82%B3%E9%81%9E%E8%87%AA%E5%AE%9A%E7%BE%A9%E7%89%A9

 

Intent 一般用來跳轉Activity 或是 在兩個Activity間傳遞參數

 

EX1:直接跳不傳變數

A.class 目前的Class

B.class 目的Class

 

在A.class中加上

 

Intent i = new Intent();

i.setClass(A.this,B.class)

startActivity(i);

 

Intent i = new Intent(A.this,B.class);

startActivity(i);//開始跳往要去的Activity

 

 

EX2:傳遞資料從A到B

比喻: 某人要從 A地帶東西(Bundle)到B地  靠的是交通工具(Intent),

所以他把東西(Bundle) 放在 交通工具上(Intent)一起帶去

 

1.Intent

 

        A.class(傳送資料)

        //new一個intent物件,並指定Activity切換的class

        Intent intent = new Intent();

        intent.setClass(A.this,B.class);

        intent .putExtra(“name”,name);//可放所有基本類別

        //切換Activity

        startActivity(intent);

 

        B.class(接收資料)

        Intent intent = this.getIntent();

        //取得傳遞過來的資料  

        String name = intent.getStringExtra(“name”);

 

2.Bundle+Intent

 

        A.class(傳送資料)

 

        //new一個intent物件,並指定Activity切換的class

        Intent intent = new Intent();

        intent.setClass(A.this,B.class);

         

        //new一個Bundle物件,並將要傳遞的資料傳入

        Bundle bundle = new Bundle();

        bundle.putDouble(“age”,age );//傳遞Double

        bundle.putString(“name”,name);//傳遞String

         

        //將Bundle物件傳給intent

        intent.putExtras(bundle);

         

        //切換Activity

        startActivity(intent);

 

 

        B.class(接收資料)

 

        Bundle bundle = getIntent().getExtras(); 

        String name = bundle.getString(“name”);

        double age = bundle.getDouble(“age”);

 

EX3:從A跳到B再從B傳參數回去

比喻: 甲拜託乙 從A地到B地買東西回來 ,靠的是交通工具(Intent),

乙回來的話東西送到甲的地址(requestCode)

 

        A.class

 

        Intent intent = new Intent(A.this,B.class);

        //requestCode(識別碼) 型別為 int ,從B傳回來的物件將會有一樣的requestCode

        startActivityForResult(intent,requestCode);

 

        B.class

 

        Intent intent = getIntent();

        Bundle bundle = new Bundle();

        bundle.putString(“name”,name); 

        intent.putExtras(bundle);

        setResult(requestCode, intent); //requestCode需跟A.class的一樣

        B.this.finish();

 

        然後要在A.class裡複寫onActivityResult 才能接收B傳回的值

 

        Intent intent = getIntent();

        @Override

                protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

                       

                        switch(resultCode){//resultCode是剛剛妳A切換到B時設的resultCode 

                        case requestCode://當B傳回來的Intent的requestCode 等於當初A傳出去的話

                                String result = data.getExtras().getString(“name”);

                                 

                                break;

                       

                        }

                 

                }

 

 

EX4:傳遞自定義的物件

 

上面提到的方法都只能傳基本型別

如:String ,boolean ,int ,double 等等的

那要如何傳遞自定義的物件到另一個class呢?

 

1.利用Serializable or Parcelable

 

        Bundle.putSerializable(Key,Object);

        Bundle.putParcelable(Key, Object);

 

        這兩種都必須時做接口

 

        今天講Serializable

 

        要利用 Serializable 傳遞物件的話

 

        妳的物件必須  implements Serializable

 

        EX :

 

        public class CustomObject implements Serializable {

        private static final long serialVersionUID = -7060210544600464481L;

        //省略以下 為你class的內容

        }

 

 

        然後在要傳資料的B.class裡

 

        CustomObject co_b = new CustomObject ();

         

        Intent i=new Intent();

        Bundle bundle=new Bundle();

         

        bundle.putSerializable(“CustomObject “, co_b);

         

        i.putExtras(bundle);

         

        startActivity(i);

 

 

        然後在需要資料的A.class裡就能使用了

 

        CustomObject co_a = null;

         

        co_a = getIntent().getSerializableExtra(“CustomObject “)

 

2.利用全域變數 簡單使用別的class的自定義物件

 

在A.class裡

 

        public class A extends Activity{

           public static CustomObject co_a = null; //一定要加static 且 public

           //以下intent從A到B的內容省略

        }

 

        在B.class裡

 

        CustomObject co_b = A.co_a;//直接使用A的static物件

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *