Android AAR + Intent过滤器:澄清

时间:2015-04-07 08:07:22

标签: android nfc intentfilter ndef android-applicationrecord

根据Android NFC doc提供的此文档:

  

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

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

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

  4.   
  5. 如果没有应用程序可以从AAR开始,请转到Google Play   下载基于AAR的应用程序。

  6.   

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

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

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

是否有人可以提供提示?

1 个答案:

答案 0 :(得分:5)

  

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

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

  

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

这意味着有

  • 活动A,其NDEF_DISCOVERED意图过滤器与标签上的NDEF消息的第一个 NDEF记录的数据类型不匹配AAR匹配活动A所属的应用程序包名称,
  • 活动A和活动B,两者都有NDEF_DISCOVERED意图过滤器与NDEF消息的第一个 NDEF记录的数据类型相匹配标记 AAR与活动A和B所属的应用程序包名称匹配,或
  • 与AAR匹配的应用的任何活动都没有NDEF_DISCOVERED意图过滤器。

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

  

3.如果没有应用程序可以从AAR开始,请转到Google 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意图过滤器,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>