AndroidのIntentを深く勉強します。

4676 ワード

Intentは、あなたのアプリケーションでIntentに会って動作とイベントを実行することができます。Intentを使用してAndroidアプリケーションの3つのタイプのコアコンポーネントをアクティブにすることができます。活動Activity、サービスService、放送受信者Broadcast。
Intentはまた隠士の意図と表示意図に分けられます。
表示の意図:intent.set Component()、intent.set Class Nameまたはintent.set Class()方法で明確にコンポーネント名を制定する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およびデータタイプ)とカテゴリの3つだけが参照されます。
動作テスト(アクションテスト)
一つの意図オブジェクトは一つの動作名しか指定できません。一つのフィルタは複数の動作名を列挙することができます。意図されたオブジェクトやフィルタが指定されていない場合は、以下のようになります。
  • •フィルタが動作を指定していないと、すべての意図がブロックされ、すべての意図がテストに失敗します。このフィルターを通す意図がない。
  • •一方、フィルタが少なくとも1つの動作を含む限り、動作を指定しない意図的なオブジェクトが自動的にこのテストを通過する。
    カテゴリテスト(Category test)
    カテゴリマッチングテストの意図で意図されるオブジェクトのカテゴリは、フィルタのカテゴリに一致する必要があります。このフィルタは他のカテゴリを列挙することができますが、この意図の中の任意のカテゴリを漏らしてはいけません。
    原則として、カテゴリのない意図的なオブジェクトは、フィルタの中に何があるかに関わらず、常にマッチングテストに合格するはずです。ほとんどの場合はこれが正しいです。しかし、例外的に、AndroidはstartActivity()にすべてを伝える暗黙の意図を彼らに少なくとも一つのカテゴリを含んでいると考えています。DEFAULT定数)したがって、暗黙的な意図を受信するための活動は、それらの意図フィルタに含まれるべきである。「android.intent.actions.MAIN」と「android.intent.cntategory.LAUNCHER」がセットされているフィルタは例外です)
    データテスト(Data test)
    一つの意図的なオブジェクトのURIを一つのフィルタのURIと比較するために用いた場合、比較はURIの各構成部分である。例えば、フィルタが一つのschemeだけを指定した場合、このフィルタとすべてのschemeのURIsが一致することができる。フィルタがscheme、ホスト名を指定しているが、パス部分がない場合、同じschemeとホスト名を持つURIsはこのフィルタと一致してもいいです。フィルタがscheme、ホスト名、およびパスを指定した場合、同じscheme、ホスト名、およびパスを有するURIsだけがこのフィルタと一致することができる。もちろん、フィルタのパス規格にはワイルドカードが含まれています。これは部分的なマッチングだけでいいです。
    データテストは意図対象とフィルタで指定されたURIとデータタイプを同時に比較します。
    ルールは以下の通りです
    a.URIもデータタイプも含まれていない意図的なオブジェクトは、フィルタも同様にURIsとデータタイプも指定されていない場合にのみ試験に合格することができる。
    b.URIを含むが、データタイプが意図されていないオブジェクトは、そのURIと同じデータタイプが指定されていないフィルタ内のURIがマッチングした場合のみテストに合格することができます。これは通常、malto:とtel:このようなURIsで発生します。それらは実際のデータを引用しません。
    c.データタイプを含むが、URIを含まない意図オブジェクトは、このフィルタで同じデータタイプを列挙しており、URIも指定されていない場合にのみ試験に合格することができる。
    d.URIとデータタイプ(またはURIからデータタイプを推定することができる)を同時に含む意図的なオブジェクトは、そのタイプとフィルタに列挙されたタイプが一致すればテストに合格することができる。そのURIがこのフィルタの中の一つのURIと一致しているか、またはコンテンツcontent:またはファイルfile:URIがあり、このフィルタはURIを指定していない場合、テストにも合格できます。言い換えれば、1つのコンポーネントは、サポートcontent:およびfile:データがそのフィルタに1つのデータタイプのみを列挙する場合を想定する。
    以上、AndroidのIntentについて詳しく紹介しました。特に初心者の学習に適しています。みなさんの勉強に役立ちたいです。