26.Android Intent理解

Intent

小提示:

Android正是使用Intent來封裝程序的“調用意圖”。不管你是想激活一個Activity,還是想啟動一個Service組件,亦或是想啟動一個Broadcast,Android統一使用Intent對象來封裝你的“啟動意圖”,這種思想極大地降低了和你要啟動的某個組件的耦合性。

Intent 也是程序應用程序組件之間數據交換、傳遞的媒介。這些通信的數據也正是通過Intent來攜帶傳遞的。

一、Intent是什么?

Intent,中文意思:意圖。Intent可能是安卓開發中最獨特、最重要的概念。Intent是一種消息傳遞機制,可以在應用內使用,也可以在多個app之間使用。

二、Intent有什么用?

Intent有兩大重要作用:


1 激活組件。

Android正是使用Intent來封裝程序的“調用意圖”。不管你是想激活一個Activity,還是想啟動一個Service組件,亦或是想啟動一個Broadcast,Android統一使用Intent對象來封裝你的“啟動意圖”,這種思想極大地降低了和你要啟動的某個組件的耦合性。

2 傳遞數據。

Intent 也是程序應用程序組件之間數據交換、傳遞的媒介。這些通信的數據也正是通過Intent來攜帶傳遞的。


三、Intent怎么用?

1 激活組件。利用Intent激活不同組件的方法:

  • 激活Activity組件:
  • startActivity(Intent intent)
  • startAcitvityForResult(Intent intent, int requestCode)
  • 激活Service組件:
  • startService(Intent intent)
  • boolean bindService(Intent intent,ServiceConnection conn, int flags)
  • 激活Broadcast組件:
  • sendBroadcast(Intent intent)無序廣播
  • sendBroadcast(Intent intent, String receivePermission)無序廣播
  • sendOrderedBroadcast(Intent intent, String receiverPermisson, BroadcastReceiver resultReceiver, Handler scheduler, int inintialCode, String initialData, Bundle initalExtras)有序廣播
  • sendOrderedBroadcast(Intent intent, String receiverPermisson)有序廣播
  • sendStickyBroadcast(Intent intent)有序廣播
  • sendStickyOrderedBroadcast(Intent intent, String receiverPermisson, BroadcastReceiver resultReceiver, Handler scheduler, int inintialCode, String initialData, Bundle initalExtras)有序廣播

2 傳遞數據

Intent的Extra屬性,通常用于在多個Action之間進行數據交換,Intent的Extra屬性值應該是一個Bundle對象,Bundle對象就像一個Map對象,可以存儲多個key-value鍵值對,這樣就可以通過Intent在不同的組件之間進行數據傳遞了。


四、Intent屬性及Intent-filter配置的詳解

 Intent代表了Android應用的啟動的意圖,android應用會根據Intent來啟動指定組件,至于到底啟動哪個組件,則是取決于Intent的各個屬性。
組件也有個子元素<intent-filter>,專門用來過濾Intent的,即對Intent的激活行為提出了一些限制的條件。
比如:Intent要想啟動一個Activity,就要滿足該Activity的<intent-filter>的條件才可以。
  • Component屬性
    指明Component屬性的Intent,即明確了它將要啟動哪個組件,這種Intent也被稱為顯示Intent,沒有指定Component屬性的Intent被稱為隱式Intent,即沒有明確指明它將要啟動哪個組件,此時應用會根據Intent指定的規則去啟動符合條件的組件,但具體是那個組件則不確定。

  • Action屬性(一個Intent最多只能設置一個action屬性值)

Intent的Action屬性值是一個普通的字符串,該字符串代表了該Intent所要完成的一個抽象的動作。也可以理解為:為該抽象動作起了一個名字,該名字即Action的值,是一個區分動作的普普通通的字符串標識而已。

注意:一個Intent最多只能設置一個action屬性值。代碼則可以通過:Intent 對象的 setAction(String actionStr)來設置值;


  • Category屬性(一個Intent能設置多個category屬性值)

Intent的Action屬性值是一個普通的字符串,該字符串代表了為一個Intent的Action增加的額外的附加類別的信息,通常Action屬性會與Category屬性結合使用。

注意:
一個Intent可以設置多個category屬性值。代碼則可以通過:Intent 對象的 addCategroy(String actionStr)來添加category屬性值;
 當程序創建Intent時,如不添加category屬性值,該Intent默認啟動Category屬性值為Intent.CATEGORY_DEFAULT常量的組件;

  • Data 屬性

data屬性通常用于向Action屬性提供操作的數據。Data屬性接受一個Uri對象,一個Uri對象通常形如以下的字符串:scheme://host:port/path;

-Data的“匹配”原則:

  • 如果:目標組件的Data子元素,只指定了android:scheme屬性,那么Intent的Data屬性的scheme部分與android:scheme屬性值一致即可;
  • 如果:目標組件的Data子元素,指定了android:scheme屬性、android:host屬性,那么Intent的Data屬性的scheme、host與android:scheme、android:host屬性值一致即可;
  • 如果:目標組件的Data子元素,指定了android:scheme屬性、android:host屬性、android:port屬性,那么Intent的Data屬性的scheme、host、port部分與android:scheme、android:host、android:port屬性值一致即可;
  • 如果:目標組件的Data子元素,scheme、host、port、path都指定了,那么就要求Intent的Data屬性的scheme、host、port、path部分與目標組件的Data子元素,scheme、host、port、path屬性值一致才可;
  • 如果:目標組件的Data子元素,只指定了android:port、path屬性,則該port、path屬性不起限制、過濾作用。

  • Type 屬性
    Type屬性用于指定該Data屬性所指定Uri對應的MIME類型,這種MIME類型可以是任何自定義的MIME類型,只要是符合abc/xyz格式的字符串即可。
注意:Data屬性和Type屬性的關系:會相互覆蓋。如果希望Itent既有Data屬性,又有Type屬性,則應該調用Itent 的setDataAndType()方法;
  • Extra屬性
    Intent的Extra屬性,通常用于在多個Action之間進行數據交換,Intent的Extra屬性值應該是一個Bundle對象,Bundle對象就像一個Map對象,可以存儲多個key-value鍵值對,這樣就可以通過Intent在不同的組件之間進行數據傳遞了。

  • 說明:<intent-filter>(一個組件(activity、service、receiver等)能設置多個<intent-filter>屬性值)

<intent-filter>是清單文件中,組件(activity、service、receiver等)的子元素,<intent-filter>正是用于表示對要響應此組件的Intent所要滿足的約束條件。一個<intent-filter>元素通常可以包含如下子元素:

     <intent-filter>
          0~N個<action.../>子元素,該屬性值是一個普通的字符串。即對Intent屬性的action屬性的要求;
          0~N個<category.../>子元素,該屬性值是一個普通的字符串。即對Intent屬性的category屬性的要求;
          0~1個<data.../>子元素
     </intent-filter>

說明:上面的0~N:表示一個 <intent-filter>標簽內可以包含0或多個action、category。表明該Activity能響應Action屬性值為其中任意Intent的action屬性值為其中一個action值字符串的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Intent組件雖然不是四大組件,但卻是連接四大組件的橋梁,學習好這個知識,也非常的重要。 一、什么是Intent...
    困惑困惑困惑閱讀 1,541評論 0 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,117評論 25 708
  • 百年修得同船渡,千年修得共枕眠。妻子與你是天地合一、陰陽互補和缺一不可的共同體。你有了妻子,切莫沾沾自喜。在你的思...
    茗藝堂閱讀 395評論 0 2