web-dev-qa-db-ja.com

Android:インテントフィルターを理解する

特定のリンクがアプリケーションの開始をトリガーするように、Intent-Filterを作成したいと思います(たとえば、このstackoverflow-threadを参照してください: RL名前空間を登録する方法(myapp://app.start/) Android OS? でブラウザのURLを呼び出してプログラムにアクセスする場合

試しているうちに、インテントとインテントフィルター(Manifest.xmlで定義)が実際にどのように機能するのかよくわからないことがわかりました。次の違いは何ですか:

<action Android:name="Android.intent.action.VIEW" />
<action Android:name="Android.intent.action.MAIN" />

または以下:

<category Android:name="Android.intent.category.LAUNCHER" />
<category Android:name="Android.intent.category.DEFAULT" />
<category Android:name="Android.intent.category.MAIN" />

そして、実際にはカテゴリとアクションのインテントフィルタの違いは何ですか。このページを読みました http://developer.Android.com/reference/Android/content/Intent.html しかし、まだ基本的な理解が不足しています。

33
Pascal Klein

アプリの視点から見るのではなく、裏返してインテント側から見てください。

インテントが作成されると、作成者は、そのインテントを処理するためにシステム上にあるアプリがわかりません。ただし、作成者は自分が何をしたいのかを知っており(たとえば、アプリがユーザーにデバイスのどこかから連絡先を選択させたい場合があります)、システム上の他のアプリに連絡して、必要なものを尋ねる必要があります。

これを行うために、インテントにはいくつかの情報が添付されています。それらの中には、アクションとカテゴリーがあります。

アクションは、連絡先の表示、ギャラリーからの画像の選択など、インテントが実行したいアクションを一般的な方法で定義します。

カテゴリは、インテントにそれ自体を区別する別の方法を提供する追加情報です。たとえば、ブラウザのリンクをクリックすると、作成されるインテントにBROWSABLEカテゴリが添付されます。

したがって、OSがインテントを解決するとき、それはallの情報を含むインテントフィルターを持つ登録されたアクティビティまたはBroadcastReceiversを探します。インテントでPICKアクションが指定されている場合、PICKアクションを含むインテントフィルターがないアクティビティは、インテントを処理する候補のリストから破棄されます。

このように、インテントに関連付けられたアクション、カテゴリ、タイプ、および(場合によっては)スキームの組み合わせは、インテントを処理できるアクティビティのセットを特定するのに役立ちます。マニフェストでインテントフィルターを設定すると、処理できるインテントのクラスがOSに通知されます。

89
Brian Cooley

カテゴリの一致を理解するには、Android.content.IntentFilter.matchCategories(Set<String> categories)のコードを調べる必要がありました。

  1. IntentFilterにカテゴリがあり、Intentがカテゴリを提供しない場合、一致は成功します
  2. IntentFilterにインテントのすべてのカテゴリがある場合、一致は成功します。フィルタには、追加のカテゴリを含めることもできます。
  3. IntentFilterにカテゴリがなく、Intentにカテゴリがある場合、一致しません
  4. IntentFilterにIntentのカテゴリがない場合、一致しません

特に#1と#3は明確ではありません。

2
OneWorld