0

我已经在android:name="android.intent.action.MEDIA_BUTTON"的清单中注册了一个 BroadcastReceiver, 并且我已经使用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
4

1 回答 1

0

真正的问题是,您能否保证系统正在发送您认为丢失的事件(Logcat 等)?当广播被触发时,系统会评估它的目标并将其放入消息队列中以发送到接收器,因此创建的事件不太可能没有发送到您的接收器。

更有可能的情况是,由于您生成它们的频率,某些事件没有被发送。生成广播的框架的许多部分在系统稳定时发送事件,这意味着如果新事件在前一个广播发送之前进入,则可以取消挂起的广播,因为旧广播不再代表系统状态;屏幕开/关广播就是我知道的一个例子。

这意味着您可以保证您将收到代表该特定子系统当前(最新)状态的广播,即使您没有获得其间的每个中间事件。注意你的测试总是以“Up”消息结束。

高温高压

于 2012-04-23T18:14:48.177 回答