我在清单中注册了一个BroadcastReceiver android:name =“android.intent.action.MEDIA_BUTTON” 我使用 registerMediaButtonEventReceiver 方法在AudioManager中注册了接收器。现在我的接收功能定义如下。
public void onReceive(final Context context, Intent intent) {
Log.e(LOG_TAG, "Entering Receiver");
KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
int action = event.getAction();
if (action == KeyEvent.ACTION_DOWN) {
Log.e(LOG_TAG, "Down");
} else {
Log.e(LOG_TAG, "Up");
}
}
此代码仅在记录媒体按钮上下事件时打印。如果我点击足够快,我就无法注册所有的活动。你有什么问题吗?我的LogCat输出如下。需要注意的是,可以通过按住按钮来重现此输出,尽管我没有这样做。
04-24 01:47:38.136: E/MicReceiver(3769): Entering Receiver
04-24 01:47:38.136: E/MicReceiver(3769): Down
04-24 01:47:38.187: E/MicReceiver(3769): Entering Receiver
04-24 01:47:38.187: E/MicReceiver(3769): Down
04-24 01:47:38.257: E/MicReceiver(3769): Entering Receiver
04-24 01:47:38.257: E/MicReceiver(3769): Down
04-24 01:47:38.281: E/MicReceiver(3769): Entering Receiver
04-24 01:47:38.281: E/MicReceiver(3769): Down
04-24 01:47:38.390: E/MicReceiver(3769): Entering Receiver
04-24 01:47:38.390: E/MicReceiver(3769): Down
04-24 01:47:38.402: E/MicReceiver(3769): Entering Receiver
04-24 01:47:38.402: E/MicReceiver(3769): Up
答案 0 :(得分:0)
真正的问题是,你能保证系统发送你认为缺少的事件(Logcat等)吗?触发广播时,系统会对目标进行评估,并将其放入消息队列中以发送给接收方,因此创建的事件不太可能不会发送给您的接收方。
更可能的情况是,由于您生成某些事件的频率,因此未发送某些事件。生成广播的框架的许多部分在系统稳定时发送事件,这意味着如果在发送前一个广播之前新事件可以取消挂起广播,因为旧广播不再代表系统状态;屏幕开/关广播就是我所知道的一个例子。
这意味着您可以保证您将接收代表该特定子系统的当前(最新)状态的广播,即使您没有在其间获得每个中间事件。请注意您的测试始终以“向上”消息结束。
HTH