Android的AAR +意图过滤器:澄清(Android AAR + Intent Filter:

2019-10-22 13:24发布

基于这个文档可用的Android NFC文档 :

如果一个标签包含一个AAR,标签调度系统调度的方式如下:

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

  2. 如果在意向不匹配AAR滤波器的活动,如果多个活动可以处理这个意图,或者如果没有活动处理的意图,开始由AAR指定的应用程序。

  3. 如果没有应用程序可以与AAR开始,去谷歌Play下载基于AAR的应用。

从这些行我明白,如果我指定一个意图过滤器为活动A和接收的NDEF消息的过滤器匹配AA会即使NDEF消息包含应用程序的AAR记录开始A属于。

在我的情况A开始只是如果没有AAR记录。 当我加入AAR记录,活动A未启动:当检测到NDEF消息时,在AAR指定的应用程序的主要活动启动。

这是什么意思与“ 如果活动[...]也匹配AAR”?

是否有任何人谁可以提供一个暗示?

Answer 1:

1.)尝试使用意图过滤器正常开始一个活动。 如果意图相匹配的活动的AAR也匹配,启动活动。

这意味着,活动A具有NDEF_DISCOVERED 标签上的NDEF消息的第一 NDEF记录的数据类型相匹配意图过滤器所述AAR该活动A属于应用程序包名称相匹配。

2)如果在意向不匹配AAR滤波器的活动,如果多个活动可以处理这个意图,或者如果没有活动处理的意图,开始由AAR指定的应用程序。

这意味着,有

  • 具有活性的NDEF_DISCOVERED意图滤波器不在标签所述AAR匹配的应用程序包名活性的属于NDEF消息的第一 NDEF记录的数据类型相匹配,
  • 活性的和活动B中均具有NDEF_DISCOVERED 关于标签所述AAR匹配活动应用程序包的名称和B中的NDEF消息的第一 NDEF记录的数据类型相匹配意图过滤器属于,或
  • 没有匹配AAR应用程序的活动有一个NDEF_DISCOVERED意图过滤器。

在这种情况下,具有相匹配的一个在AAR包名称的应用程序通过发送意图的行动开始MAIN用类LAUNCHER在您的应用程序,有这样一个意图过滤器的第一个活动。 因此,应用程序是“开始”,仿佛被点击了该活动的启动器图标。

3)如果没有应用程序可以与AAR开始,去谷歌Play下载基于AAR的应用。

这意味着,如果存在与匹配的AAR的一个包名没有应用程序,然后Play商店被打开。


所以,举例来说,如果你有NDEF消息

+------------------------------+----------------------+
| URI: http://www.example.com/ | AAR: com.example.app |
+------------------------------+----------------------+

那么你就需要用包名称的应用com.example.app有一个活动,意图过滤器像

<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>

方案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>

场景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>

场景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>

场景2c(没有NDEF_DISCOVERED意图过滤器,主要是推出):

<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>


文章来源: Android AAR + Intent Filter: clarification