Mam prostą, ale prawdopodobnie źle zorganizowaną aplikację dla systemu Android. Składa się z dwóch klas java: MainActivity extending Activity i RemoteControlReceiver, który rozszerza BroadcastReceiver.Program BroadcastReceiver dla intencji ACTION_MEDIA_BUTTON wysyła DWUŚ na jeden przycisk Media kliknięcie
Śledzę dyspozycję w dwóch poniższych linków, aby ustawić słuchawkę Mediabutton: http://android-developers.blogspot.com/2010/06/allowing-applications-to-play-nicer.html http://developer.android.com/training/managing-audio/volume-playback.html
Problem jest, że gdy naciskam przycisk multimedialny (odtwarzanie/pauza, następny, poprzedni) na mój pilot bluetooth, metoda onReceive() broadcastReceiver działa dwukrotnie. A dokładniej cały RemoteControlReceiver zostaje zainicjalizowany w obiekcie, uruchamiana jest metoda onReceive() obiektu, obiekt jest złomowany i powtarzany.
Przetestowałem to, umieszczając statyczny int mult = 0; w MainActivity. Zwiększyłem licznik o 1 przy każdym uruchomieniu onReceive. I zwiększa się dwukrotnie na kliknięcie przycisku.
Nie jestem pewien, co powoduje, że uruchamia się dwa razy. Czy sprzęt wysyła podwójny sygnał za kliknięcie, czy system operacyjny wysyła wiele intencji przycisku multimedialnego na sygnał, czy mój odbiornik działa dwa razy w ciągu jednej operacji?
Mój kod 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();
}
}
}
filtr ten odbiornik jest zarejestrowany w manifeście następująco:
<application> ... <receiver android:name=".RemoteControlReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON"/> </intent-filter> </receiver> ... </application>
Broadcastreceiver dynamicznie przypisywać do obiektu Audiomanager w główną działalność za onResume() . I jest niezarejestrowany w onPause(). Zgodnie z linkiem, jest to pewny sposób na uzyskanie pierwszego priorytetu w intencjach media_button. Wiem, że mogę zignorować każde nawet wywołanie broadcastReceiver przy użyciu zmiennej statycznej. Chciałbym jednak poznać przyczynę tego problemu.
PS Przyciski odtwarzania/pauzy/poprzedniego/następnego działają dobrze dla domyślnego odtwarzacza muzyki z systemem Android.
* doh * Tak, to było !! Jestem opóźniony>. <;; Dziękuję Ci – user2275463