1. 程式人生 > >android橋樑之Intent

android橋樑之Intent

Android為我們提供了Intent這個元件,Intent本身是一個訊息傳遞的載體,來方便我們進行元件之間的通訊以及資料的傳輸。
通過檢視官方的文件,會發現Intent的用法很多,為了方便查閱,自己做了簡化和整理。

Intent包含的資訊

1:動作(action),這是Intent最重要的一個資訊,一個Intent被建立的主要目的就是利用該Intent去執行這個動作。可以通過setAction(ACTION欄位)方法來設定。可以自定義動作,但是注意要以自己的包名為字首。
2:資料(data),這個資料是用於Intent與android系統互動的資料。它是一個Uri物件。可以呼叫setData(Uri uri)

來設定。對於設定的Uri物件來說,要想更加準確地匹配到對應的元件,還應該為其新增MIME型別,這個型別可以更加詳細的表明該資料的型別,進而達到準確匹配的目的。可以用setType()方法來新增MIME型別。
3:類別:(category),它是包含了應處理Intent元件類別的附加資訊的字串,可以呼叫addCategory()方法設定。但是大多數的Intent並不需要新增額外的類別資訊。
4:額外資訊(Extra),Extra主要是為了方便Intent攜帶一些簡單的資料,來方便元件之間的通訊,這些資料以K-V的形式被儲存在Intent中。還可以通過Bundle物件攜帶所有的Extra資料,然後讓Intent物件攜帶Bundle物件來傳遞資料。
5:標誌(Flag)
,標誌用的地方不多,就不說了。用到了再寫。

元件通訊

1:activity之間的通訊,當一個activity想要啟動另外一個activity的時候,我們可以採用Intent。

intent myIntent = new Intent();
myIntent.setAction(com.example.MyDemo.STARTACTIVITY);
startActivity(myIntent);

2:傳送廣播,可以通過sendBroadcast(Intent Intent)來將資料資訊作為廣播發送出去。
3:啟動服務,可以通過startService(Intent Intent)

來啟動服務。而且在服務繫結中,也需要用到Intent。

Intent可以分為顯式和隱式Intent。對於顯式Intent來說,它要啟動的元件是明確申明的,所以不需要過多的解釋,而且,對於顯式Intent來說,不需要配置Intent過濾器。

對於隱式Intent來說,不會明確指出要啟動的元件,比如activity,我們需要配置Intent過濾器來讓activity響應具體的Intent請求。

<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

Intent可以返回資料給它的上一個活動,這個需要在啟動活動的時候不能直接使用startActivity()方法,而是使用startActivityForResult(intent ,requestCode)方法,其中的requestCode是用來判斷返回的資料的型別的,因為假如有多個Intent物件返回,可以根據requestCode來判斷哪個是我們需要的Intent。但是,到這兒還沒有結束,因為返回來的資料我們還沒有處理。這個時候,我們還需要重寫onActivityResult(int requestCode,int resultCode,Intent data)方法,在裡面我們就可以對返回來的資料進行處理了。

int requestCode = 1;//請求碼
Intent intent = new Intent();
intent.setAciton(my.example.MyDemo.STARTACTIVITY);
startActivityForResult(intent,requestCode);
//處理返回來的資料
protected void onActivityResult(int requestCode,int resultCode,Intent data){
	switch(requestCode){//根據請求碼來得到對應請求的資料
	case 1:
		if(resultCode == RESULT_OK){
			//resultCode用來判斷請求結果是否成功
			//處理資料,
		}
		break;
	}
}

被請求的activity返回資料:

//省略其他程式碼
//返回資料的程式碼
Intent intent  = new Intent();
intent.putExtra("data_return","hello world");//利用putExtra()將資料新增到Intent中
setResult(RESULT_OK,intent);//利用setResult()將攜帶資料的Intent返回給呼叫者。

當被請求資料的activity被銷燬的時候,它會先回調請求資料的activity的onActivityResult()方法來將資料返回給上一個activity。