搜尋此網誌

2015年1月13日 星期二

【Android】Intent & Bundle傳遞資料(含傳自定義物件及全域變數)

ref:http://goo.gl/nrAX9g

[方法一]從A.class傳到B.class

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

A.class 目前的Class
B.class 目的Class

Intent i = new Intent();
i.setClass(A.this,B.class)
startActivity(i);
or
Intent i = new Intent(A.this,B.class);
startActivity(i);//開始跳往要去的Activity

如果要結束A.class 要加上這行

A.this.finish();//結束目前Activity

[方法二]傳遞資料從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");
[方法三]傳遞資料從A傳到B後,再由B傳參數回去A
比喻: 甲拜託乙 從A地到B地買東西回來 ,靠的是交通工具(Intent),

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

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;
        
        }
      
    }
[方法四]傳遞自定義物件
1.利用Serializable or Parcelable

Bundle.putSerializable(Key,Object);
Bundle.putParcelable(Key, Object);
這兩種都必須時做接口
今天講Serializable
要利用 Serializable 傳遞物件的話 
妳的物件必須  implements Serializable
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);

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物件

3 則留言:

匿名 提到...

全域變數 延伸閱讀
http://ptodue.blogspot.tw/2015/01/android.html

匿名 提到...

全域變數 使用singleton pattern實做
https://www.ptt.cc/bbs/AndroidDev/M.1412383579.A.74F.html

隨手筆記 提到...

參考
http://ptodue.blogspot.tw/2014/12/androidonactivityresult.html