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


用法一 : 從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地到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;
       
        }
     
    }




用法四 :傳遞自定義的物件

上面提到的方法都只能傳基本型別
如: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物件

 


, , , ,
創作者介紹

Mazs's Notes

cookiesp 發表在 痞客邦 PIXNET 留言(5) 人氣()


留言列表 (5)

發表留言
  • 悄悄話
  • 訪客
  • 謝謝!!
    想請問如果要寫A到C,是要從B拿A資料再寫put到C嗎?
  • 可以再說清楚一點嗎? 如果A到C那直接從A利用Intent Bundle傳資料過去C就可以了

    cookiesp 於 2015/05/07 02:52 回覆

  • MAX CHEN
  • 樓主大大您好,真的很謝謝你的文章,幫助到我許多。
    想請教一下,如果使用"用法2" 但是不想傳值的時候就跳轉頁面(不想 start activity),該如何編寫?
  • 什麼意思呢? 是想跳轉頁面但不想傳值嗎? 那可以用方法一就好了

    cookiesp 於 2015/05/22 15:26 回覆

  • 訪客
  • 請問有沒有只傳值不跳頁面的方法QQ?
    我現在有一個值要傳到activity3,可是頁面是要跳activity2...
    請問要怎麼做呢QQ?
  • 訪客
  • 感謝大大, 但請問一下, 當我在A頁面沒有任何數據時, 我不小心按到跳頁面的按鍵整個apps就會跳掉, 請問一下有什麼方法可以防止這問題?