1. 程式人生 > >Android中的Intent和Intent-Filter詳解(二)

Android中的Intent和Intent-Filter詳解(二)



DataType屬性與intent-filter配置

Data屬性接收一個Uri物件作為其值,Uri物件類似於“content://com.android.contacts/contacts/#”,關於Uri的相關知識大家可以自行搜尋。

Data屬性通常用於向Action屬性提供操作的資料。例如,如果actionACTION_EDITdata的值應該指明被編輯文件的Uri;如果actionACTION_CALLdata的值應該是一個以“tel:”開頭並在其後附加號碼的Uri;如果actionACTION_VIEWdata應該以“http:”開頭並在其後附加網址的Uri

Type

屬性用於指定該Data指定的Uri對應的MIME型別,下面這個網站講解了什麼是MIME,並列出了大部分MIME型別對照表:

Data屬性與Type屬性可以相互覆蓋,這與DataType設定的先後順序有關:

  • 如果Intent先設定Data屬性,後設置Type屬性,那麼Type屬性將會覆蓋Data屬性;

  • 如果Intent先設定Type屬性,後設置Data屬性,那麼Data屬性將會覆蓋Data屬性;

  • 如果希望Intent既有Data屬性,也有Type屬性,應該呼叫IntentsetDataAndType()方法。

下面是針對這三種情況的例子:

private voidtemp() {

//先設定Type屬性,再設定Data屬性Intent intent1 =newIntent();
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
(
"http://www.52ij.com/uploads/allimg/160317/1110103957-0.jpg"));
intent2.setType("image/jpeg");
Toast.makeText(MainActivity.this,intent2.toString(),Toast.LENGTH_SHORT).show();

//同時設定TypeData屬性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();
}

DateType不僅可以在程式碼中設定,還可以在AndroidManifest.xml中通過<data…/>元素設定,<data…/>元素的格式如下:

<data android:mimeType=""

android:scheme=""

android:host=""

android:port=""

android:path=""

android:pathPrefix=""

android:pathPattern=""/>

屬性定義如下:

<data…/>元素的屬性

描述

mimeType

該元件所能匹配的IntentType屬性

scheme

該元件所能匹配的IntentData屬性的scheme部分,即協議標識,例如httpcontent

host

該元件所能匹配的IntentData屬性的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屬性

IntentExtra屬性用於在多個Action/Activity之間傳遞、交換資料,IntentExtra屬性值應該是一個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應用需要啟動某個元件(ActivityServiceBroadcastReceiver)時,總需要藉助於Intent來實現。Intent封裝了應用程式的啟動意圖,降低了元件之間的耦合,提高了系統的可擴充套件性和可維護性。要掌握Intent,需要知道Intent的屬性ComponentActionCategoryDataType等屬性的用法,並能通過程式碼和<intent-filter …/>配置各屬性。