編輯:關於Android編程
Android中提供了Intent機制來協助應用間的交互與通訊,Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。Intent不僅可用於應用程序之間,也可用於應用程序內部的Activity/Service之間的交互。因此,Intent在這裡起著一個媒體中介的作用,專門提供組件互相調用的相關信息,實現調用者與被調用者之間的解耦。在SDK中給出了Intent作用的表現形式為:
Context.sendStickyBroadcast()) 發給broadcast receivers。
Intent可分為隱式(implicitly)和顯式(explicitly)兩種:
即在構造Intent對象時就指定接收者,它一般用在知道目標組件名稱的前提下,一般是在相同的應用程序內部實現的,如下:
Intent intent = new Intent(MainActivit.this, NewActivity.class);
startActivity(intent );
上面那個intent中,直接指明了接收者:NewActivity
即Intent的發送者在構造Intent對象時,並不知道也不關心接收者是誰,有利於降低發送者和接收者之間的耦合,它一般用在沒有明確指出目標組件名稱的前提下,一般是用於在不同應用程序之間,如下:
Intent intent = new Intent();
intent.setAction("com.wooyun.test");
startActivity(intent);
上面那個intent,沒有指明接收者,只是給了一個action作為接收者的過濾條件。
對於顯式Intent,Android不需要去做解析,因為目標組件已經很明確,Android需要解析的是那些隱式Intent,通過解析,將Intent映射給可以處理此Intent的Activity、IntentReceiver或Service。
Intent解析機制主要是通過查找已注冊在AndroidManifest.xml中的所有IntentFilter及其中定義的Intent,最終找到匹配的Intent。在這個解析過程中,Android是通過Intent的action、type、category這三個屬性來進行匹配判斷的。一個過濾列表中的action、type、category可以有多個,所有的action、type、category分別構成不同類別,同一類別信息共同約束當前類別的匹配過程。只有一個Intent同時匹配action、type、category這三個類別才算完全匹配,只有完全匹配才能啟動Activity。另外一個組件若聲明了多個Intent Filter,只需要匹配任意一個即可啟動該組件。
例如:
<action android:name="com.wooyun.project.SHOW_CURRENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="video/mpeg" android:scheme="http" . . . />
<data android:mimeType="image/*" />
<data android:scheme="http" android:type="video/*" />
action是一個字符串,如果Intent指明定了action,則目標組件的IntentFilter的action列表中就必須包含有這個action,否則不能匹配。一個Intent Filter中可聲明多個action,Intent中的action與其中的任一個action在字符串形式上完全相同(注意,區分大小寫,大小寫不同但字符串內容相同也會造成匹配失敗),action方面就匹配成功。可通過setAction方法為Intent設置action,也可在構造Intent時傳入action。需要注意的是,隱式Intent必須指定action。比如我們在Manifest文件中為MyActivity定義了如下Intent Filter:
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<action android:name="android.intent.action.SEND_TO"/>