Android中的Intent和Intent-Filter詳解(二)
Data、Type屬性與intent-filter配置
Data屬性接收一個Uri物件作為其值,Uri物件類似於“content://com.android.contacts/contacts/#”,關於Uri的相關知識大家可以自行搜尋。
Data屬性通常用於向Action屬性提供操作的資料。例如,如果action為ACTION_EDIT,data的值應該指明被編輯文件的Uri;如果action為ACTION_CALL,data的值應該是一個以“tel:”開頭並在其後附加號碼的Uri;如果action為ACTION_VIEW,data應該以“http:”開頭並在其後附加網址的Uri。
Type
Data屬性與Type屬性可以相互覆蓋,這與Data和Type設定的先後順序有關:
-
如果Intent先設定Data屬性,後設置Type屬性,那麼Type屬性將會覆蓋Data屬性;
-
如果Intent先設定Type屬性,後設置Data屬性,那麼Data屬性將會覆蓋Data屬性;
-
如果希望Intent既有Data屬性,也有Type屬性,應該呼叫Intent的setDataAndType()方法。
下面是針對這三種情況的例子:
private voidtemp() {
intent1.setType("image/jpeg");
intent1.setData(Uri.parse("http://www.52ij.com/uploads/allimg/160317/1110103957-0.jpg"));
Toast.makeText(MainActivity.this,intent1.toString(),Toast.LENGTH_SHORT).show();
//先設定Data屬性,再設定Type屬性Intent intent2 =newIntent();
intent2.setData(Uri.parse
intent2.setType("image/jpeg");
Toast.makeText(MainActivity.this,intent2.toString(),Toast.LENGTH_SHORT).show();
//同時設定Type和Data屬性Intent intent3 =newIntent();
intent3.setDataAndType(Uri.parse("http://www.52ij.com/uploads/allimg/160317/1110103957-0.jpg"),"image/jpeg");
Toast.makeText(MainActivity.this,intent3.toString(),Toast.LENGTH_SHORT).show();
}
Date和Type不僅可以在程式碼中設定,還可以在AndroidManifest.xml中通過<data…/>元素設定,<data…/>元素的格式如下:
<data android:mimeType="" android:scheme="" android:host="" android:port="" android:path="" android:pathPrefix="" android:pathPattern=""/>
屬性定義如下:
<data…/>元素的屬性 |
描述 |
mimeType |
該元件所能匹配的Intent的Type屬性 |
scheme |
該元件所能匹配的Intent的Data屬性的scheme部分,即協議標識,例如http、content等 |
host |
該元件所能匹配的Intent的Data屬性的host部分,即IP、域名 |
port |
埠號 |
path |
二級路徑,例如”/mypath”、”/contact/#” |
pathPrefix |
設定path路徑以什麼開頭 |
pathPattern |
設定帶統配符的路徑,萬用字元為“*”和“.*” |
Data屬性的“匹配”過程則有些差別,它會先檢查<intent-filter …/>裡的<data …/>子元素,子元素的屬性指定不全或只指定一部分,造成的結果是不一樣的,想深入瞭解請自行百度”android <intent-filter> data屬性”。
附上一段簡單的例子:
@OnClick({R.id.button1,R.id.button2,R.id.button3})
public voidonClick(View
view) {
Intent intent = newIntent();
switch (view.getId()) {
caseR.id.button1:
intent.setData(Uri.parse("http://www.baidu.com"));
intent.setAction(Intent.ACTION_VIEW);
startActivity(intent);
break;
case R.id.button2:
intent.setData(ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,1));
intent.setAction(Intent.ACTION_EDIT);
startActivity(intent);
break;
case R.id.button3:
intent.setData(Uri.parse("tel:13112345678"));
intent.setAction(Intent.ACTION_DIAL);
startActivity(intent);
break;
}
}
Extra屬性
Intent的Extra屬性用於在多個Action/Activity之間傳遞、交換資料,Intent的Extra屬性值應該是一個Bundle物件,Bundle物件就想一個Map物件,可以傳遞基本型別和其陣列物件,以及實現Parclable介面的自定義物件及其陣列。
Flag屬性
Flag屬性用於為該Intent新增一些額外的控制旗標,Intent可呼叫addFlag()方法來為Intent新增控制旗標。常用的控制旗標如下:
Flag旗標 |
作用 |
FLAG_ACTIVITY_BROUGHT_TO_FRONT |
若通過該flag啟動的Activity已存在,下次再啟動時,會將該Activity帶到前臺,而不會重新例項化一個,而通過該Activity啟動的Activity在棧中的位置會按順序往下壓一格。 |
FLAG_ACTIVITY_CLEAR_TOP |
相當於載入模式中的singleTask,通過該flag啟動的Activity,在棧中若其上面還有其它Activity,會將其它Activity全部彈出棧(銷燬),而不是將其它Activity往下壓一格。 |
FLAG_ACTIVITY_NEW_TASK |
預設的啟動旗標,控制重新建立一個Activity |
FLAG_ACTIVITY_NO_ANIMATION |
控制Activity啟動時不使用動畫 |
FLAG_ACTIVITY_NO_HISTORY |
被啟動的Activity(不包含被該Activity啟動的Activity)將不會保留在當前棧中(具體儲存在哪我也不清楚),而且也不會回撥onActivityResult() |
FLAG_ACTIVITY_REORDER_TO_FRONT |
和FLAG_ACTIVITY_BROUGHT_TO_FRONT一樣,我也不知道區別在哪 |
FLAG_ACTIVITY_SINGLE_TOP |
相當於載入模式中的singleTop,若棧頂的Activity就是當前將啟動的Activity,則不會重新例項化一個。 |
總結
主要介紹了Intent的功能和用法,當Android應用需要啟動某個元件(Activity、Service、BroadcastReceiver)時,總需要藉助於Intent來實現。Intent封裝了應用程式的“啟動意圖”,降低了元件之間的耦合,提高了系統的可擴充套件性和可維護性。要掌握Intent,需要知道Intent的屬性Component、Action、Category、Data、Type等屬性的用法,並能通過程式碼和<intent-filter …/>配置各屬性。