Android AAR + Intent过滤器:澄清

Ant*_*sto 1 android nfc intentfilter ndef android-applicationrecord

基于Android NFC doc提供的此文档:

如果标记包含AAR,则标记调度系统将按以下方式调度:

  1. 尝试使用意图过滤器正常启动活动.如果与意图匹配的活动也与AAR匹配,则启动活动.

  2. 如果为intent过滤的Activity与AAR不匹配,如果多个Activities可以处理intent,或者没有Activity处理intent,请启动AAR指定的应用程序.

  3. 如果没有应用程序可以从AAR开始,请转到Google Play以根据AAR下载应用程序.

从这些方面我明白,如果我为活动指定了一个intent过滤器,A并且收到的NDEF消息与过滤器匹配A,A即使NDEF消息包含A属于的app的AAR记录,也会启动.

在我的情况下,A只有在没有AAR记录时才开始.一旦我添加AAR记录,活动A就不会启动:当检测到NDEF消息时,将启动AAR中指示的应用程序的主要活动.

" 如果活动[...]也与AAR相匹配 ",它们意味着什么?

有没有人可以提供提示?

Mic*_*and 7

1.)尝试使用意图过滤器正常启动活动.如果与意图匹配的活动也与AAR匹配,则启动活动.

这意味着活动A具有一个NDEF_DISCOVEREDintent过滤器,该过滤器匹配标签上NDEF消息的第一个 NDEF记录的数据类型,并且 AAR与活动A所属的应用程序包名称匹配.

2.)如果为intent过滤的Activity与AAR不匹配,如果多个Activities可以处理intent,或者没有Activity处理intent,则启动AAR指定的应用程序.

这意味着有

  • 具有活性的NDEF_DISCOVERED意图过滤不所述的数据类型相匹配第一标签上的NDEF消息的NDEF记录所述AAR匹配的应用程序包名活性的属于,
  • 活动A和活动B,它们都具有与标记上NDEF消息的第一个 NDEF记录的数据类型匹配的NDEF_DISCOVERED intent过滤器,并且 AAR与活动A和B所属的应用程序包名称匹配,或者
  • 没有与AAR匹配的应用程序的活动具有NDEF_DISCOVERED意图过滤器.

在这种情况下,具有与AAR中的包名称匹配的包名称的应用程序通过发送MAIN具有类别的意图操作来启动LAUNCHER,该类别适用于具有此类意图过滤器的应用程序中的第一个活动.因此,应用程序"已启动",就像点击了该活动的启动器图标一样.

3.)如果没有应用程序可以从AAR开始,请转到Google Play以根据AAR下载应用程序.

这意味着如果没有包含名称与AAR中的名称匹配的应用程序,则会打开Play商店.


因此,例如,如果您有NDEF消息

+------------------------------+----------------------+
| URI: http://www.example.com/ | AAR: com.example.app |
+------------------------------+----------------------+
Run Code Online (Sandbox Code Playgroud)

那么你需要一个包含名称的应用程序,该应用程序com.example.app具有一个带有intent过滤器的活动

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http" android:host="www.example.com" android:pathPrefix="/" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)

场景1(与活动A匹配):

<manifest package="com.example.app" ... >
    <uses-permission android:name="android.permission.NFC" />
    <application ...>
        <activity android:name="MAIN" ...>
            <intent-filter>
                <action android:name="android.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="A" ...>
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="http" android:host="www.example.com" android:pathPrefix="/" />
            </intent-filter>
        </activity>
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

场景2a(不匹配活动A,MAIN启动):

<manifest package="com.example.app" ... >
    <uses-permission android:name="android.permission.NFC" />
    <application ...>
        <activity android:name="MAIN" ...>
            <intent-filter>
                <action android:name="android.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="A" ...>
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

场景2b(匹配活动A和B,MAIN启动):

<manifest package="com.example.app" ... >
    <uses-permission android:name="android.permission.NFC" />
    <application ...>
        <activity android:name="MAIN" ...>
            <intent-filter>
                <action android:name="android.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="A" ...>
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="http" android:host="www.example.com" android:pathPrefix="/" />
            </intent-filter>
        </activity>
        <activity android:name="B" ...>
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="http" android:host="www.example.com" android:pathPrefix="/" />
            </intent-filter>
        </activity>
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

场景2c(没有NDEF_DISCOVERED意图过滤器,MAIN启动):

<manifest package="com.example.app" ... >
    <uses-permission android:name="android.permission.NFC" />
    <application ...>
        <activity android:name="MAIN" ...>
            <intent-filter>
                <action android:name="android.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)