每次MediaButton点击时,ACTION_MEDIA_BUTTON意图的BroadcastReceiver会触发TWICE

use*_*463 5 android bluetooth broadcastreceiver

我有一个简单但可能结构糟糕的Android应用程序.它由两个java类组成:MainActivity扩展Activity,以及扩展BroadcastReceiver的RemoteControlReceiver.

我按照以下两个链接中的说明设置了Mediabutton接收器: http://android-developers.blogspot.com/2010/06/allowing-applications-to-play-nicer.html http:// developer. android.com/training/managing-audio/volume-playback.html

问题是每当我按下蓝牙遥控器上的媒体按钮(播放/暂停,下一个,上一个)时,broadcastReceiver的onReceive()方法会运行两次.或者更具体地说,整个RemoteControlReceiver被初始化为对象,对象的onReceive()方法运行,对象被废弃,并重复.

我通过放置一个静态int mult = 0测试了这个; 在MainActivity中.每次运行onReceive时,我都会将mult增加1.每按一次按钮,它会增加两次.

我不确定是什么导致它运行两次.硬件是否每次点击发送双重信号,或者操作系统是否为每个信号发送多个媒体按钮意图,或者我的广播接收器是否按意图运行两次?

我的MediaButtonReceiver代码:

public class RemoteControlReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if(Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())){
            KeyEvent Xevent = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
            int keyType = Xevent.getKeyCode();



            Intent i = new Intent();
            i.setAction("com.MainActivity.Shakey.MEDIA_BUTTON");
            i.putExtra("keyType", keyType);
            context.sendBroadcast(i);
            Toast.makeText(context, String.valueOf(MainActivity.mult), Toast.LENGTH_SHORT).show();
            MainActivity.mult++;
            abortBroadcast();

        }

    }
}
Run Code Online (Sandbox Code Playgroud)

此接收者的过滤器在Manifest中注册如下:

<application>
 ...
   <receiver android:name=".RemoteControlReceiver">
       <intent-filter>
           <action android:name="android.intent.action.MEDIA_BUTTON"/>
       </intent-filter>
   </receiver>
 ...
</application>
Run Code Online (Sandbox Code Playgroud)

Broadcastreceiver动态注册到MainActivity的onResume()中的AudioManager对象.它在onPause()中未注册.正如链接所说,这是获得media_button意图优先级的可靠方法.我知道我可以通过使用静态变量忽略broadcastReceiver的每一次调用.但我想知道这个问题的原因.

PS播放/暂停/上一个/下一个按钮适用于默认的Android音乐播放器.

小智 12

在我看来问题是,OnReceive对按下和释放蓝牙按钮做出反应.这就是你的代码运行2次的原因.试着这样做:

    if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
    KeyEvent Xevent = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);    
    if ((KeyEvent.KEYCODE_MEDIA_PLAY == Xevent.getKeyCode()) && (Xevent.getAction() == KeyEvent.ACTION_DOWN)) {  //MainActivity.mult++; ...
Run Code Online (Sandbox Code Playgroud)

或者你可以使用ACTION_UP,尽管你想做什么.我不确定,但我希望这会对你有所帮助.