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 など) をシステムが送信していることを保証できますか? ブロードキャストが開始されると、システムによってターゲットの評価が行われ、受信者に送信されるメッセージ キューに置かれるため、作成されたイベントが受信者に送信されないことはほとんどありません。

より可能性の高いシナリオは、特定のイベントを生成する頻度が原因で、特定のイベントが送信されていないことです。ブロードキャストを生成するフレームワークの多くの部分は、システムが安定したときにイベントを送信します。つまり、古いブロードキャストはシステム状態を表していないため、前のイベントが送信される前に新しいイベントが発生すると、保留中のブロードキャストをキャンセルできます。画面のオン/オフ ブロードキャストは、この方法で機能することを私が知っている 1 つの例です。

これは、その間にすべての中間イベントを取得しなくても、その特定のサブシステムの現在の (最新の) 状態を表すブロードキャストを確実に受信できることを意味します。テストが常に「Up」メッセージで終了することに注意してください。

HTH

于 2012-04-23T18:14:48.177 に答える