Android - 其他应用窃取我的意图接收器?

时间:2011-06-29 04:14:38

标签: java android android-intent broadcastreceiver

我有一个应用程序,它使用ACTION_MEDIA_BUTTON意图和BroadcastReceiver来控制音乐播放器。用户按下外部硬件上的按钮,它控制应用内音乐播放器。用户还可以按住按钮并更改音量。

我最近下载了另一个使用耳机按钮的应用程序,它接管了我的应用程序中的媒体按钮意图!因此,当这个其他应用程序打开并按下按钮时,另一个应用程序将开始运行,但我的应用程序将认为该按钮仍然按下,因此它将循环音量。

总结一下,

  • 我的应用是开放的,应该是媒体按钮意图的唯一监听者
  • 其他应用程序被打开,它也想成为媒体按钮意图的唯一监听者
  • 按钮在两个应用程序打开时被按下,控制权转到其他应用程序
  • 我的应用程序认为按钮被按下,因为在按下模式下按下按钮时失去控制(我认为)。然后它启动我不想启动的功能,因为它认为用户按下了按钮。

有什么方法可以确保在我的应用程序打开时它是这个媒体按钮意图的唯一接收者?我至少可以检查另一个应用程序是否已经接管,这样我可以防止出现意外行为吗?

感谢您的帮助,我从未让应用程序之前玩得不好!

2 个答案:

答案 0 :(得分:1)

你可以改变你的BroadcastReceiver优先级(让它变大,比如10000):它应该首先获得Intent,然后你可以将它传递给另一个app。

答案 1 :(得分:0)

我有一个类似的问题。我相信,除了上述提到的优先级之外的“军备竞赛”之外,唯一真正的解决方案是关闭其他应用程序。如果您要将此应用程序发布给其他用户,您可能会给他们一条消息,告诉他们关闭其他媒体播放器应用程序和服务。

在清单中,您可以将意图优先级设置为整数的最大值,即:2147483647。

但是,您不应将IntentFilter优先级设置为超过1000,因为它在API文档中告诉您。您可以像这样设置IntentFilter优先级:

myIntentFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);

我假设您应该从SYSTEM_HIGH_PRIORITY常量中减去一个,因为文档说该值必须小于SYSTEM_HIGH_PRIORITY。

引自关于IntentFilter.setPriority(int)的文档:

  

应用程序必须使用大于SYSTEM_LOW_PRIORITY且小于SYSTEM_HIGH_PRIORITY的值。