将Android Intent交给另一个应用程序

时间:2016-01-14 16:16:53

标签: android android-intent

应用程序是否有办法接收Intent并将其“传递”到下一个应用程序?

我的意图如下:我希望我的应用程序收到android.nfc.action.TAG_DISCOVEREDandroid.nfc.action.TECH_DISCOVERED意图,并检查他们的额外内容以决定如何处理它们:要么在应用程序中触发操作,或忽略意图并将其交给可能对其感兴趣的任何其他应用程序。

据我了解,IntentFilter仅适用于Intent的Action,Category或Data,但不适用于其Extras。因此,我必须确保我的应用程序获得所有Intent,但为了与其他应用程序很好地协作,我需要手动复制此功能。

Android是否为应用提供了一种方式告诉它“我不会处理您发给我的意图,将其交给其他人”?如果没有,我该怎么办?从我的应用程序重新发送Intent?

2 个答案:

答案 0 :(得分:2)

  

Android是否为应用提供了一种告诉它的方式"我不会处理您发给我的意图,将其提供给其他人"?

没有

Android不允许你拦截"在他们到达其他应用程序之前的意图。如果确实如此,你会陷入困境,试图决定哪些应用程序应该先将Intent放到其他应用程序之前。

  

如果没有,我该怎么办?从我的应用程序重新发送Intent?

对于广播意图,您不必做任何事情。 已注册intent-filter收听广播的每个应用都会收到广播。

仅传递给单个应用程序的其他意图 - 这些是启动“活动”或“服务”的意图。如果对于哪个应用程序应该接收其中一个意图(即多个应用程序注册与意图匹配的意图过滤器)存在任何歧义,Android将显示消歧UI,要求用户选择他们想要使用的应用程序。

android.nfc.action.TAG_DISCOVEREDandroid.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_DISCOVEREDandroid.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的活动会触发所需的操作,然后退出。但是,仍有两个主要障碍需要克服:

  • 如果发送了NFC意图,则只有前景android.nfc.action.TAG_DISCOVERED能够拦截它。在所有其他情况下,如果有多个潜在收件人,Android将显示选择器,而应用无法确定谁获得Intent - 它可能甚至不知道有一个。除非我们构建自己的Android发行版(我们可以以任何方式篡改),否则我们可能必须拦截Activity意图并从其Intent中提取原始android.intent.action.CHOOSER } extra - 但由于Intent也是EXTRA_INTENT传递给android.intent.action.CHOOSER,我们也有同样的问题可靠地拦截它并转发我们不感兴趣的内容英寸
  • 即使对于应用程序收到的意图,也没有简单的方法来传递"那些它没有处理的东西。它最多可以复制Android的行为,并重新发送它无法处理的Intents。它将使用IntentActivity来确定其他收件人,以及复制上述特定的NFC Intent逻辑。只有在Android的安全框架没有任何机制阻止随机应用发送NFC意图时,这才有效。