Android開始アクティビティは、表示開始と暗黙開始の 2つのタイプに分けられます
スタートアップの表示:これは、開発で最も一般的に使用されるスタートアップメソッドである、インテントを介してパッケージ名+クラス名Activityを指定することです。ここでは言うまでもなく、この記事の目的ではありません。
暗黙的な起動:暗黙的な起動について説明します。暗黙的な開始もインテントを介して行われますが、一致するデータをインテントに追加し、ターゲットアクティビティを開始する前に、一致するデータをターゲットアクティビティのフィルターの1つと一致させる必要があります。一致するデータとフィルターについては、以下を参照してください。
暗黙的に開始できるアクティビティは、マニフェストファイルAndroidManifest.xmlで1つ以上のフィルター<intent-filter>を使用して構成する必要があります。
以下、インテントフィルターを総称して「フィルター」と呼びます。
このフィルターの役割は次のとおりです。このアクティビティの外部で開始できますが、いずれかの フィルターに一致させる必要があります。アクティビティを開始できます。
フォーカス!!!!------ ターゲットアクティビティを開始するには、いずれかのフィルターに一致させます
最初のデモでは、フィルターは AndroidManifest.xmlでアクティビティ用に構成されています。といった:
<activity android:name=".filter.FilterActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="FilterActivity_Action1"/>
<action android:name="FilterActivity_Action2"/>
<category android:name="FilterActivity_Category1"/>
<category android:name="FilterActivity_Category2"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="test"
android:host="11"
android:port="8080">
</data>
<data android:scheme="test2"
android:host="22"
android:port="8081"
android:pathPattern="string"
android:path="/string"
android:mimeType="string">
</data>
</intent-filter>
</activity>
明らかに、FilterActivityは2つのフィルター<intent-filter>で構成されています 。長い間話し合った後、どのようにして前のフィルターのマッチングに成功しますか?
心配しないで、最初にフィルターの構造を見てみましょう。上記の構成を見ると、フィルターに次の3つのパラメーターがあることがわかります。
1>アクション
2>カテゴリー
3>データ
1および2パラメータのタイプは文字タイプです。3はUri + mimeTypeです
また、これら3つのパラメーターはそれぞれ1つ以上を持つことができます。上記のような
アクションパラメータ:2つのパラメータFilterActivity_Action1とFilterActivity_Action2があります。
カテゴリパラメータ: 2つのパラメータFilterActivity_Category1とFilterActivity_Category2があります
データパラメータ: Uri + mimeTypeの形式で2つあります(後で説明します)。
とりあえず、各パラメータのサブディビジョンマッチングについては話さないでください。前のフィルターと完全に一致していると見なすにはどうすればよいですか。
回答:インテントは、このフィルターの3つの条件(アクション、カテゴリ、データ)に一致する必要があり ます。
どうやってそれをマッチとして数えることができるか、私たちは一つずつ分割します
========== [ アクション一致ルール ] =============
アクションは一種の文字列です。実際、システムは次のような文字列も定義しています。android.intent.action.MAIN
しかし、上記のように自分自身を定義することができます:FilterActivity_Action1と FilterActivity_Action2
アクション一致ルールは次のとおりです。インテントアクションがフィルターアクションの1つと一致する限り、一致は成功します。ここでの一致は、まったく同じ文字列を指します。大文字と小文字を区別。たとえば、上記のコードでは、インテントのアクションがFilterActivity_Action1または FilterActivity_Action2に 設定されている限り、マッチングは成功します。
別のポイントがあります。インテントアクションには必ず必要なものがあり、設定されていない場合、正常に照合できません。設定されていない場合、フィルターのどのアクションにも一致しないためです。
========== [ カテゴリ一致ルール ] =============
カテゴリ は実際には action に 似ていて、一種の文字列でもありますが、実際にはシステムによっていくつかの文字列も定義されており、これらも自分で定義できます。一致は文字列の完全一致でもあります。
上記の カテゴリなど :FilterActivity_Category1および FilterActivity_Category2
カテゴリと アクション の 違いは、カテゴリ を省略できることです。書くことなくうまくマッチできます。
ただし、カテゴリーがインテント用に構成されている限り 、インテントのすべてのカテゴリーがフィルターに正常に一致する必要があります。それ以外の場合、一致は失敗します。
つまり、インテントによって設定されたカテゴリはフィルターに含まれている必要があります。フィルターが含まれていない限り、フィルターは失敗します。
たとえば、上記のコードを見てみましょう:
私の意図はFilterActivity_Category1、 FilterActivity_Category2および FilterActivity_Category3を設定します
ただし、フィルターにはFilterActivity_Category1と FilterActivity_Category2しかあり ません
その後、一致は失敗します。
別のポイントは、システムがstartActivityを呼び出すと、デフォルトでandroid.intent.category.DEFAULTがIntentに追加されるということです
このカテゴリ。したがって、アクティビティを暗黙的に開始する場合は、各フィルターで設定する必要があります。
<category android:name = "android.intent.category.DEFAULT" /> そうしないと、起動しません。
どうして?実際、上記は非常に明確です。。。。。
========== [ データ照合ルール ] =============
データ インテントにはデータが含まれている必要があり、インテント内の各データはフィルターに一致している必要があります。
しかし、データの一致ルールは何ですか?これは前の2つとは異なり、単純な文字列の一致ではありません。
データの一致ルールについて説明する前に、データの形式を追加しましょう。
データは、UriとmimeTypeの2つの部分で構成されています。
データ= Uri + mimeType
[MimeType]はメディアタイプを表します。image / png、 audio / mpeg4-genericおよび video / *など。それぞれ画像、テキスト、ビデオなどを表します。
【Uri】 :的形式是:<スキーム >:// <ホスト >:<ポート > / <パス > | < pathPrefix > | < pathPattern >
例:https ://www.baidu.com:8080/sraech/football またはcontent://com.demo.test:200 // folder / subfolder / etd
スキームはUriの形式で、ファイル、coontent、httpなどです。
Hostは、www.baidu.comなどのドメイン名です。
portはポートです。例:8080
path、pathPrefixおよびpathPattern はパスパラメータを表します
とはいえ、チェイス解析では、どのように一致と見なすことができますか?
[ ルール1-URIは指定されていません ]
といった:
<data android:mimeType="image/*">
</data>
Uriが指定されていない場合、システムはデフォルトでこのデータにUriを設定します。つまり、コンテンツまたはファイルです。
現在のmimeTypeは画像タイプです。ファイルやコンテンツなどのインテントデータタイプは画像です
といった:
Intent intent = new Intent();
intent.setDataAndType(Uri.parse("file://abcd"),"image/png");
このようにして、インテントのデータをフィルターのデータと一致させることができます。
データとタイプを設定するときは、setDataAndType()メソッドを呼び出すことを 忘れないでください。
最初にsetData()を呼び出してから setType()を呼び出さないでください。これらの2つのメソッドは同時にお互いをクリアします。ソースコードを見てください。
【ルール2-Uri指定】
といった:
<data android:scheme="http" android:host="www.test.com" android:mimeType="video/mpeg"></data>
<data android:scheme="http" android:host="www.test.com" android:mimeType="audio/mpeg"></data>
次に、データを一致させるために、このようにインテントを構成する必要があります
intent.setDataAndType(Uri.parse("http://www.test.com"),"video/mpeg");
または
intent.setDataAndType(Uri.parse("http://www.test.com"),"audio/mpeg");
基本的に明確な2つの例が示されています。
データの一致ルールは次のとおりです:UriとmimeTypeは同時に一致する必要があります
さて、次のような完全なフィルターをいくつか提供します。
<intent-filter>
<action android:name="action1"/>
<action android:name="action2"/>
<category android:name="category1"/>
<category android:name="category2"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="test1" android:host="11" android:port="8080"></data>
<data android:scheme="http" android:host="www.test.com" android:mimeType="video/mpeg"></data>
<data android:scheme="http" android:host="www.test.com" android:mimeType="audio/mpeg"></data>
</intent-filter>
次に、このアクティビティを暗黙的に開始します。
/**
* 隐式启动Activity
* */
public void test(Activity activity) {
Intent intent = new Intent();
//Action只需匹配上一个即可
intent.setAction("action1");
//Category必须全部匹配上
intent.addCategory("category1");
intent.addCategory("category2");
//android.intent.category.DEFAULT 这个加不加都没问题,
// 因为系统会默认给Intent加上,但是AndroidManifest.xml里就必须加上
intent.addCategory("android.intent.category.DEFAULT");
//Action只需匹配上一个即可
intent.setDataAndType(Uri.parse("http://www.test.com"), "video/mpeg");
activity.startActivity(intent);
}
上記のコードプロテストでは、ターゲットアクティビティを開始できます。
最後に、要約します。
【アクション】
インテントにはアクションを設定する必要があり、フィルターにはアクションの1つとまったく同じアクションを指定する必要があります。そうでない場合、一致は失敗します。すべてのsetActionが前のアクションを上書きするため、インテントは最大で1つのアクションしか設定できません。知るためにソースコードを参照してください...
【カテゴリー】
インテントはカテゴリを設定する必要があります。複数を設定できますが、インテントに設定されたカテゴリがフィルタに存在する必要があります。それ以外の場合、一致は失敗します。
注意:システムはデフォルトでandroid.intent.category.DEFAULTをインテントに追加するため、暗黙的に開始できるアクティビティはこのカテゴリをフィルターに追加する必要があります。
【データ】
インテントにはデータを設定し、フィルタには一致するデータを含める必要があります。いわゆる一致は、UriとmimeTypeが完全に同じである必要があります。それ以外の場合、一致は失敗します。インテントは、せいぜい1つのデータしか設定できません。これは、setDataAndTypeが毎回以前のデータを上書きするためです。知るためにソースコードを参照してください...
【インテントフィルターフィルター】
アクティビティは複数のフィルターを持つことができます。各フィルターには、同時に1つ以上のアクション、カテゴリー、およびデータが必要です。
インテントがいずれかのフィルターに一致する限り、アクティビティを開始できます。
このフィルターを一致させるとは、このフィルターのアクション、カテゴリー、およびデータを同時に一致させることを意味します。
上記の インテントフィルター は、実際にはBroadcastReceiverおよびServiceにも適用できます。
ただし、システムは、可能な限りディスプレイからサービスを開始することをお勧めします。
上記のコードテストは問題ありません。質問がある場合はメッセージを残してください。ありがとうございました!