1. ホーム

Intentを処理するためのアクティビティが見つからないことに関するAndroidの質問

2022-02-22 13:02:03
<パス
                Androidには、明示的と暗黙的の2種類のIntentがあります。 
Intentオブジェクトの構築時に受信者が指定されるExplicit Intent。
Implicit Intent, ここでIntentの送信者はIntentオブジェクトの構築時に受信者を指定する。
は、受信者が誰であるかを知らないし、気にしないので、送信者と受信者の間の結合を減らすことができる。
明示的なIntentの場合、ターゲットとなるコンポーネントがすでに明確に定義されているため、Androidはパース処理を行う必要がありません。
Implicit Intentは、Androidにパースを要求することで、このIntentを処理できるActivity、IntentReceiver、ServiceにIntentをマッピングします。
Intentの解析機構は、主にAndroidManifest.xmlに登録されている全てのIntentFilterとその中で定義されているIntentを探し出し、最終的にマッチするIntentを探し出すというものである。
このパース処理において、AndroidはIntentのaction、type、categoryの属性を用いて判定を行うが、これは以下のように行われる。
1 Intentがアクションを指定する場合、そのアクションはターゲットコンポーネントのIntentFilterのアクションリストに含まれていなければならず、そうでない場合はマッチングされない。
2 Intentが型を提供しない場合、システムはdataからデータ型を取得する。アクションと同様に
  ターゲットコンポーネントのデータ型のリストには、Intentのデータ型が含まれていなければなりません。そうでなければ、マッチングできません。
3 インテントのデータが content: 型の URI でなく、インテントが明示的にその型を指定しない場合。
  は、Intent 内のデータをそのスキーム (http: や mailto: など) に従ってマッチさせます。
  上記と同様に、Intentのスキームは、ターゲットコンポーネントのスキームリストに表示されなければなりません。
4 インテントが1つ以上のカテゴリーを指定する場合、これら全てのカテゴリーが形成されたカテゴリーリストに表示されなければならない。
  例えば、Intentが2つのカテゴリを含む場合。LAUNCHER_CATEGORY と ALTERNATIVE_CATEGORY の2つのカテゴリがある場合。
  解析されたターゲットコンポーネントは、少なくともこれら2つのカテゴリを含んでいなければなりません。
startActivity()メソッドで送信されるすべての暗黙のIntentは、少なくとも1つのカテゴリを持ち、それは"android.intent.category.DEFAULT"です。
したがって、暗黙のIntentを受信したいActivityは、"android.intent.category.DEFAULT"カテゴリを含める必要があり、さもなければIntentが一致しない原因となります。

Intent-Filterの定義済みプロパティ設定例です。