Androidコンポーネント間通信

6366 ワード

Intent
1、概要
              ——activities、services、broadcast receivers,      intent     。
  • Activity:Contextに渡されるintentオブジェクトstartActivity()またはActivity.startActivity ForRestult()は、アクティビティを開始したり、既存のアクティビティを新しいことをしたりします.
  • Service:Contextに渡されるintentオブジェクトstartService()は、サービスを初期化したり、実行中のサービスに新しいコマンドを渡したりします.同様に、1つのintentはContextに渡すことができる.bindService()は、呼び出しコンポーネントとターゲットサービスとの間の接続を確立します.
  • Broadcast Receiver:Context.sendBroadcast()などの任意のブロードキャストメソッドにintentオブジェクトを渡すContext.sendOrderedBroadcast(),Context.sendStickyBroadcast()は、興味のあるすべての放送受信者に伝えられます.

  • 2、意図と暗黙の意図を表示する
  • 明示的intent:名前でターゲットコンポーネントを指定します.開発者は通常、他のアプリケーションのコンポーネントの名前を知らないため、明示的なintentは通常、アクティビティが依存するサービスを開始したり、姉妹アクティビティを開始したりするなどのアプリケーション内部メッセージに使用されます.
  • 暗黙intent:ターゲットの名前は指定されません(コンポーネント名フィールドは空です).暗黙的intentは、他のアプリケーションのコンポーネントをアクティブにするためによく使用されます.

  • 3、Intent-filter
    1)動作検出
    インベントリ・ファイルの要素は、次のようなサブ要素でアクションをリストします.
    <intent-filter . . . >
        <action android:name="com.example.project.SHOW_CURRENT" />
        <action android:name="com.example.project.SHOW_RECENT" />
        <action android:name="com.example.project.SHOW_PENDING" />
        . . .
    </intent-filter>
    

    1つのIntentオブジェクトは単一のアクションのみですが、1つのフィルタは1つ以上リストできます.このリストは空にすることはできません.1つのフィルタには少なくとも1つのサブ要素が含まれていなければなりません.そうしないと、すべてのintentsがブロックされます.
    検出するには、Intentオブジェクトで指定したアクションがフィルタのアクションリストの1つに一致する必要があります.オブジェクトまたはフィルタにアクションが指定されていない場合は、次のようになります.
  • フィルタが動作を指定していない場合、1つのIntentが一致しない場合、すべてのintentはフィルタを通過できるintentがないことを検出します.
  • Inentオブジェクトが動作を指定していない場合、自動的にチェックを通過します(少なくとも1つのフィルタがある限り、そうでない場合は上の場合です)
  • .
    2)種類検出
    同様に、インベントリ・ファイルの要素には、次のようなサブ要素があります.
    <intent-filter . . . >
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        . . .
    </intent-filter>

    1つのintentが種類検出される場合、intentオブジェクトの各種類はフィルタの1つに一致する必要があります.すなわち、フィルタは追加の種類をリストすることができるが、intentオブジェクトの種類はフィルタで見つけることができる必要がある.1つの種類がフィルタリストにない限り、種類検出に失敗しても!
    したがって、原則として、1つのintentオブジェクトに種類がない場合(すなわち、種類フィールドが空の場合)は、フィルタにどの種類があるかにかかわらず、常に種類テストに合格するべきである.しかし、AndroidはContextにすべてを伝える例外があります.startActivity()の暗黙的なintentは、少なくとも「android」を含むようです.intent.category.DEFAULT」(CATEGORY_DEFAULT定数に対応).したがって、アクティビティが暗黙的なintentを受信ためにはintentフィルタに「android」を含める必要がある.intent.category.DEFAULT”.
    注意:android.intent.action.MAINとandroid.intent.category.LAUNCHERの設定は、アクティビティが新しいタスクを開始し、起動リストインタフェースに持ち込まれることをそれぞれマークします.これらには「android」が含まれます.intent.category.DEFAULT」から種類リストまで、含まなくてもよい.
    3)データ検出
    同様に、インベントリ・ファイルの要素は、次のようなサブ要素でデータをリストします.
    <intent-filter . . . >
        <data android:mimeType="video/mpeg" android:scheme="http" . . . /> 
        <data android:mimeType="audio/mpeg" android:scheme="http" . . . />
        . . .
    </intent-filter>

    要素はURIとデータ型(MIMEタイプ)を指定します.4つの属性scheme、host、port、pathがURIの各部分に対応しています.
    scheme://host:port/path例えば、次のURI:content://com.example.project:200/folder/subfolder/etcschemeはcontent、hostは「com.example.Project」、portは200、pathは「folder/subfolder/etc」です.hostはportとともにURIの認証情報(authority)を構成し、hostが指定していない場合、portも無視される.この4つのプロパティはオプションですが、完全に独立しているわけではありません.authorityに意味を持たせるにはschemeも指定しなければなりません.パスに意味を持たせるには、schemeもauthorityも指定しなければなりません.
    intentオブジェクトとフィルタのURIを比較すると,フィルタに現れるURI属性のみを比較する.たとえば、1つのフィルタがschemeのみを指定した場合、このschemeを持つURIsはすべてフィルタに一致します.フィルタがschemeとauthorityを指定しているがpathを指定していない場合、schemeとauthorityに一致するURIsはすべて検出され、pathにかかわらず検出されます.4つのプロパティが指定されている場合は、すべて一致しなければ一致しません.しかしながら、フィルタ内のpathは、pathの一部を一致させるようにワイルドカードを含むことができる.
    要素のtype属性は、データのMIMEタイプを指定します.Intentオブジェクトとフィルタは、「text/」「audio/*」などのワイルドカード照合サブタイプフィールドで任意のサブタイプを表すことができます.
    データ検出はURIもデータ型も検出する.ルールは次のとおりです.
  • IntentオブジェクトにはURIもデータ型も含まれていません.
  • を検出できるのは、フィルタがURIsとデータ型を指定しない場合のみです.
  • IntentオブジェクトにはURIが含まれていますが、データ型は含まれていません.フィルタでもデータ型が指定されていない場合にのみ、URIが一致している場合に検出されます.たとえばmailto:もtel:も実際のデータを指定しません.
  • Intentオブジェクトにはデータ型が含まれていますが、URIは含まれていません.フィルタリングにもデータ型のみが含まれ、Intentと同じ場合にのみ検出されます.
  • 1 1つのIntentオブジェクトにはURIも含まれ、データ型も含まれています(または、データ型はURIから推定できます):データ型部分は、フィルタの1つと一致してこそ通過します.URIセクションでは、そのURIがフィルタに表示されるか、content:またはfile:URIがあるか、またはフィルタがURIを指定していない.すなわち、フィルタがデータ型のみをリストしている場合、コンポーネントはcontent:およびfile:をサポートすると仮定します.