Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 深入學習Android中的Intent

深入學習Android中的Intent

編輯:關於Android編程

Intent提供了一種通用的消息系統,它允許在你的應用程序見傳遞Intent來執行動作和產生事件,使用Intent可以激活Android應用的三種類型的核心組件:活動Activity、服務Service、廣播接受者Broadcast。

Intent又分為隱士意圖顯示意圖

顯示意圖:調用intent.setComponent()、intent.setClassName()或者intent.setClass()方法明確的制定組件名的Intent為顯示意圖,顯示意圖明確的制定要激活哪一個組件。

隱士意圖:沒有明確的制定組件的名稱;下邊是一個隱士意圖的案例

首先應該在清單文件中添加相應的intent-filter

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
      android:label="@string/app_name"
      android:name=".IntentActivity" >
      <intent-filter >
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>

    <activity android:name=".OtherActivity" android:label="@string/windowtitle">
      <intent-filter >
        <action android:name="cn.itcast.zhangxx"/>
        <action android:name="cn.itcast.laoli"/>
        <category android:name="cn.itcast.category.java"/> 
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="cn.itcast.category.php"/>
        <data android:scheme="itcast" android:host="www.itcast.cn" android:path="/liming"/>
        <data android:mimeType="image/*"/>
      </intent-filter>      
    </activity>
  </application>

在MainActivity.java中

public void openActivity(View v){
    /**
     * (沒設數據參數的情況下)只要Intent中的Action和Category都出現在Intent-Filter中,就能與之匹配,否則匹配失敗
     */
    Intent intent = new Intent();//隱式意圖激活Activity
    intent.setAction("cn.itcast.zhangxx");
    intent.addCategory("cn.itcast.category.java");  

    // intent.setData(Uri.parse("itcast://www.itcast.cn/liming"));
    // intent.setType("image/jpeg");
    //根據Android的API可以知道
    //This method automatically clears any data that was previously set (for example by setData(Uri)). 
    //也就是說如果設置了setData方法在設置setType方法的話,那麼setType方法就會clers掉setData方法
    //解決方案如下:

    intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/liming"), "image/jpeg");
    startActivity(intent);//方法內部為Intent添加了android.intent.category.DEFAULT類別
  }

如下是隱士意圖的匹配規則:

Intent Filter(意圖過濾器)其實就是用來匹配隱式Intent的,當一個意圖對象被一個意圖過濾器進行匹配測試時,只有三個方面會被參考到:動作、數據(URI以及數據類型)和類別。

動作測試(Action test)

一個意圖對象只能指定一個動作名稱,而一個過濾器可能列舉多個動作名稱。如果意圖對象或過濾器沒有指定任何動作,結果將如下:

  • • 如果過濾器沒有指定任何動作,那麼將阻塞所有的意圖,因此所有的意圖都會測試失敗。沒有意圖能夠通過這個過濾器。
  • • 另一方面,只要過濾器包含至少一個動作,一個沒有指定動作的意圖對象自動通過這個測試

類別測試(Category test)

對於一個能夠通過類別匹配測試的意圖,意圖對象中的類別必須匹配過濾器中的類別。這個過濾器可以列舉另外的類別,但它不能遺漏在這個意圖中的任何類別。

原則上一個沒有類別的意圖對象應該總能夠通過匹配測試,而不管過濾器裡有什麼。大部分情況下這個是對的。但有一個例外,Android把所有傳給startActivity()的隱式意圖當作他們包含至少一個類別:”android.intent.category.DEFAULT” (CATEGORY_DEFAULT常量)。因此,想要接收隱式意圖的活動必須在它們的意圖過濾器中包含”android.intent.category.DEFAULT”。(帶”android.intent.action.MAIN”和”android.intent.category.LAUNCHER”設置的過濾器是例外)

數據測試(Data test)

當一個意圖對象中的URI被用來和一個過濾器中的URI比較時,比較的是URI的各個組成部分。例如,如果過濾器僅指定了一個scheme,所有該scheme的URIs都能夠和這個過濾器相匹配;如果過濾器指定了一個scheme、主機名但沒有路經部分,所有具有相同scheme和主機名的URIs都可以和這個過濾器相匹配,而不管它們的路經;如果過濾器指定了一個scheme、主機名和路經,只有具有相同scheme、主機名和路經的URIs才可以和這個過濾器相匹配。當然,一個過濾器中的路徑規格可以包含通配符,這樣只需要部分匹配即可。

數據測試同時比較意圖對象和過濾器中指定的URI和數據類型。

規則如下:

a. 一個既不包含URI也不包含數據類型的意圖對象僅在過濾器也同樣沒有指定任何URIs和數據類型的情況下才能通過測試。

b. 一個包含URI但沒有數據類型的意圖對象僅在它的URI和一個同樣沒有指定數據類型的過濾器裡的URI匹配時才能通過測試。這通常發生在類似於mailto:和tel:這樣的URIs上:它們並不引用實際數據。

c. 一個包含數據類型但不包含URI的意圖對象僅在這個過濾器列舉了同樣的數據類型而且也沒有指定一個URI的情況下才能通過測試。

d. 一個同時包含URI和數據類型(或者可從URI推斷出數據類型)的意圖對象可以通過測試,如果它的類型和過濾器中列舉的類型相匹配的話。如果它的URI和這個過濾器中的一個URI相匹配或者它有一個內容content:或者文件file: URI而且這個過濾器沒有指定一個URI,那麼它也能通過測試。換句話說,一個組件被假定為支持content:和file: 數據如果它的過濾器僅列舉了一個數據類型。

以上就是針對Android中的Intent詳細介紹,特別適合初學者學習,希望對大家的學習有所幫助。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved