我有一个简单但结构可能很糟糕的 Android 应用程序。它由两个java类组成:MainActivity扩展Activity,RemoteControlReceiver扩展BroadcastReceiver。
我已按照以下两个链接中的说明设置 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; 对此进行了测试。在主活动中。每次运行 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();
}
}
}
此接收器的过滤器在 Manifest 中注册如下:
<application> ... <receiver android:name=".RemoteControlReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON"/> </intent-filter> </receiver> ... </application>
Broadcastreceiver 在 MainActivity 的 onResume() 中动态注册到 AudioManager 对象。它在 onPause() 中未注册。正如链接所说,这是在 media_button 意图上获得第一优先级的可靠方法。我知道我可以通过使用静态变量来忽略广播接收器的每个偶数调用。但我想知道这个问题的原因。
PS 播放/暂停/上一个/下一个按钮适用于默认的 android 音乐播放器。