应用程序是否有办法接收Intent并将其“传递”到下一个应用程序?
我的意图如下:我希望我的应用程序收到android.nfc.action.TAG_DISCOVERED
和android.nfc.action.TECH_DISCOVERED
意图,并检查他们的额外内容以决定如何处理它们:要么在应用程序中触发操作,或忽略意图并将其交给可能对其感兴趣的任何其他应用程序。
据我了解,IntentFilter
仅适用于Intent的Action,Category或Data,但不适用于其Extras。因此,我必须确保我的应用程序获得所有Intent,但为了与其他应用程序很好地协作,我需要手动复制此功能。
Android是否为应用提供了一种方式告诉它“我不会处理您发给我的意图,将其交给其他人”?如果没有,我该怎么办?从我的应用程序重新发送Intent?
答案 0 :(得分:2)
Android是否为应用提供了一种告诉它的方式"我不会处理您发给我的意图,将其提供给其他人"?
没有
Android不允许你拦截"在他们到达其他应用程序之前的意图。如果确实如此,你会陷入困境,试图决定哪些应用程序应该先将Intent放到其他应用程序之前。
如果没有,我该怎么办?从我的应用程序重新发送Intent?
对于广播意图,您不必做任何事情。 已注册intent-filter
收听广播的每个应用都会收到广播。
仅传递给单个应用程序的其他意图 - 这些是启动“活动”或“服务”的意图。如果对于哪个应用程序应该接收其中一个意图(即多个应用程序注册与意图匹配的意图过滤器)存在任何歧义,Android将显示消歧UI,要求用户选择他们想要使用的应用程序。
android.nfc.action.TAG_DISCOVERED
和android.nfc.action.TECH_DISCOVERED
属于后者(根据their documentation),因此只有一个应用可以接收这些事件,系统可能会要求用户选择申请使用。
答案 1 :(得分:0)
在对这个主题做了一些更多的研究后,似乎没有简单的方法来实现这个目标。
Android中的Intent
可以发送给三个不同的收件人类。发送Intent
时会进行此选择,只有匹配的收件人类的实例才会收到Intent
。行为因收件人类和调用发送Intent
的方法而异。有关详细信息,请参阅Intents and Intent Filters。
如果使用startActivity()
或startActivityForResult()
方法,则收件人为Activity
。只有一个Activity
会收到意图。如果有多个Activity
且匹配IntentFilter
,则通常会显示选择器对话框,以便用户可以做出选择。反过来,选择器对话框由另一个Intent
触发,android.intent.action.CHOOSER
作为其操作,充当原始Intent
的包装器。 (see code)
如果使用startService()
或bindService()
方法,Service
将收到Intent
。强烈建议(以及bindService()
甚至从API 21开始执行)仅在显式 Intents上使用这些方法,这些Intent唯一地标识其组件。否则Android将随机选择匹配的服务,而应用程序开发人员无法控制该选择。
如果使用sendBroadcast()
,sendOrdererdBroadcast()
或(现已弃用)sendStickyBroadcast()
方法,BroadcastReceiver
将收到意图。使用sendBroadcast()
时,Intent
将以随机顺序发送给所有匹配的接收器。使用sendOrderedBroadcast()
,收件人将一次发送一个广播。注册BroadcastReceiver
后,应用可以为其IntentFilter
设置优先级,优先级较高的应用优先获得Intent
。在这种特殊情况下,队列中的任何BroadcastReceiver
都可以在收到abortBroadcast()
时调用Intent
,以防止它传播到优先级较低的收件人。
现在,正如其他人所指出的那样,android.nfc.action.TAG_DISCOVERED
和android.nfc.action.TECH_DISCOVERED
会以startActivity()
(或以类似的方式)发送。活动可以使用NfcAdapter.enableForegroundDispatch()
绕过选择器对话框并将所有NFC意图传递给他们,但只有Activity
位于前台时才有效。
NFC意图在发送方式上也很特别:
发现NDEF代码后,Android会首先尝试发送android.nfc.action.NDEF_DISCOVERED
。
如果没有匹配Activity
的{{1}},或者该代码不是NDEF代码,则Android会尝试发送IntentFilter
。
如果仍然没有匹配android.nfc.action.TECH_DISCOVERED
的{{1}},Android将最终尝试发送Activity
。
活动意图可用于通过实施"适配器来启动服务或发送广播。收到IntentFilter
的活动会触发所需的操作,然后退出。但是,仍有两个主要障碍需要克服:
android.nfc.action.TAG_DISCOVERED
能够拦截它。在所有其他情况下,如果有多个潜在收件人,Android将显示选择器,而应用无法确定谁获得Intent
- 它可能甚至不知道有一个。除非我们构建自己的Android发行版(我们可以以任何方式篡改),否则我们可能必须拦截Activity
意图并从其Intent
中提取原始android.intent.action.CHOOSER
} extra - 但由于Intent
也是EXTRA_INTENT
传递给android.intent.action.CHOOSER
,我们也有同样的问题可靠地拦截它并转发我们不感兴趣的内容英寸Intent
或Activity
来确定其他收件人,以及复制上述特定的NFC Intent逻辑。只有在Android的安全框架没有任何机制阻止随机应用发送NFC意图时,这才有效。