2014年7月11日 星期五

了解Intent / IntentFilter

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


Android 會比較 Intent 與 AndroidManifest.xml 中的 <intent-filter> 內容,以尋找最合適的 Activity 來處理回應 Intent 的請求。


Intent 是用來啟動 Activity、Service 與 Broadcast-Receiver 的物件,Intent 中包含了要傳給待啟動者的訊息,並用非同步模式 (Asynchronous) 傳給對方。


舉例而言,Intent 可能要求 Activity 呈現出圖片給使用者編輯。對於 Broadcast-Receiver 而言,Intent 會賦予該動作一個名稱,像是廣播拍照 (相機按下) 訊息給相關的物件


Activity 通常會啟動下一個 Activity,

如果 Activity 希望取得某些執行結果 (回傳訊息),可以用 startActivityForResult() 而不是用 startActivity()
如果某個 Activity 啟動了一個讓使用者選取一張圖片的 Activity ,則可能會希望傳回被選取的圖片。這個結果可以透過 Intent 中的 onActivityResult() 完成


Intent
作為一個完整的消息傳遞機制,Intent不僅需要發送端,還需要接收端
當指定了component屬性後,就是顯式的指定了目標組件,也就是接收端。如果沒有明確指定目標組件,那麼Android系統會使用Intent 裡的(actiondatacategory)三個屬性來尋找和匹配接收端。


IntentFilter


應用程序組件可以使用IntentFilter來向系統說明自己可以響應和處理那些Intent請求。組件一般通過AndroidManifest.xml文件的<Intent-Filter>描述。  /// 撥打電話的例子



用法一 : 從A.class跳到B.class

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

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

?
1
2
3
Intent i = new Intent();
i.setClass(A.this,B.class)
startActivity(i);

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

如果要結束A.class 要加上這行
?
1
A.this.finish();//結束目前Activity

用法二 :傳遞資料從A到B

比喻: 某人要從 A地帶東西(Bundle)到B地  靠的是交通工具(Intent), 
所以他把東西(Bundle) 放在 交通工具上(Intent)一起帶去

1.Intent

A.class(傳送資料)
?
1
2
3
4
5
6
7
8
//new一個intent物件,並指定Activity切換的class
Intent intent = new Intent();
intent.setClass(A.this,B.class);
intent .putExtra("name",name);//可放所有基本類別
//切換Activity
startActivity(intent);

B.class(接收資料)
?
1
2
3
Intent intent = this.getIntent();
//取得傳遞過來的資料  
String name = intent.getStringExtra("name"); 

2.Bundle+Intent


用法簡介:

A.class(傳送資料)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//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(接收資料)
?
1
2
3
Bundle bundle = getIntent().getExtras(); 
String name = bundle.getString("name");
double age = bundle.getDouble("age");


用法三 :從A跳到B再從B傳參數回去


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

A.class
?
1
2
3
Intent intent = new Intent(A.this,B.class);
//requestCode(識別碼) 型別為 int ,從B傳回來的物件將會有一樣的requestCode
startActivityForResult(intent,requestCode);

B.class
?
1
2
3
4
5
6
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傳回的值
?
1
2
3
4
5
6
7
8
9
10
11
12
13
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 :
?
1
2
3
4
public class CustomObject implements Serializable {
private static final long serialVersionUID = -7060210544600464481L;
//省略以下 為你class的內容
}

然後在要傳資料的B.class裡
?
1
2
3
4
5
6
7
8
9
10
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裡就能使用了
?
1
2
3
CustomObject co_a = null;
co_a = getIntent().getSerializableExtra("CustomObject ")
2.利用全域變數 簡單使用別的class的自定義物件

在A.class裡
?
1
2
3
4
public class A extends Activity{
   public static CustomObject co_a = null; //一定要加static 且 public
   //以下intent從A到B的內容省略
}

在B.class裡
?
1
CustomObject co_b = A.co_a;//直接使用A的static物件





沒有留言:

張貼留言