Androidは暗黙的にアクティビティを開始します:アクション、カテゴリ、データ

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にも適用できます。

ただし、システムは、可能な限りディスプレイからサービスを開始することをお勧めします。

 

上記のコードテストは問題ありません。質問がある場合はメッセージを残してください。ありがとうございました!

 

 

 

 

おすすめ

転載: blog.csdn.net/Leo_Liang_jie/article/details/92836838