私は単純ですが、おそらく構造が悪い Android アプリケーションを持っています。これは、Activity を拡張する MainActivity と、BroadcastReceiver を拡張する RemoteControlReceiver の 2 つの Java クラスで構成されます。
次の 2 つのリンクの指示に従って、 Mediabutton レシーバーをセットアップしました 。 android.com/training/managing-audio/volume-playback.html
問題は、Bluetooth リモートのメディア ボタン (再生/一時停止、次、前) を押すたびに、broadcastReceiver の onReceive() メソッドが 2 回実行されることです。より具体的には、RemoteControlReceiver 全体がオブジェクトに初期化され、オブジェクトの onReceive() メソッドが実行され、オブジェクトが破棄され、繰り返されます。
static int mult = 0; を配置して、これをテストしました。MainActivity で。onReceive を実行するたびに、mult を 1 ずつ増やしました。ボタンのクリックごとに 2 回インクリメントします。
2回実行される原因がわかりません。ハードウェアはクリックごとに 2 つの信号を送信していますか、OS は信号ごとに複数のメディア ボタン インテントを送信していますか、それともブロードキャスト レシーバーはインテントごとに 2 回実行されていますか?
私の 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();
}
}
}
このレシーバーのフィルターは、次のようにマニフェストに登録されます。
<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 インテントで最優先される確実な方法です。静的変数を使用することで、broadcastReceiver の偶数呼び出しをすべて無視できることを知っています。しかし、この問題の原因を知りたいです。
PS 再生/一時停止/前/次のボタンは、デフォルトの Android 音楽プレーヤーで正常に機能します。