2013-04-12 18 views
5

Tôi có ứng dụng Android đơn giản nhưng có thể bị cấu trúc kém. Nó bao gồm hai lớp java: MainActivity mở rộng Activity và RemoteControlReceiver mở rộng BroadcastReceiver.BroadcastReceiver cho mục đích ACTION_MEDIA_BUTTON kích hoạt TWICE trên mỗi MediaButton nhấp

Tôi đã theo các hướng dẫn trong hai liên kết sau để thiết lập người nhận Mediabutton: http://android-developers.blogspot.com/2010/06/allowing-applications-to-play-nicer.html http://developer.android.com/training/managing-audio/volume-playback.html

Vấn đề là bất cứ khi nào tôi bấm một nút phương tiện truyền thông (chơi/tạm dừng, tiếp theo, trước đó) trên của tôi bluetooth từ xa, phương thức onReceive() của BroadcastReceiver chạy hai lần. Hoặc cụ thể hơn toàn bộ RemoteControlReceiver được khởi tạo vào đối tượng, phương thức onReceive() của đối tượng sẽ chạy, đối tượng sẽ bị loại bỏ và lặp lại.

Tôi đã thử nghiệm điều này bằng cách đặt một static int mult = 0; trong MainActivity. Tôi tăng bội số 1 lên mỗi lần chạy onReceive. Và nó tăng gấp hai lần cho mỗi lần nhấp nút.

Tôi không chắc chắn điều gì khiến nó chạy hai lần. Phần cứng có gửi tín hiệu kép cho mỗi nhấp chuột hay hệ điều hành gửi nhiều ý định nút đa phương tiện cho mỗi tín hiệu hoặc bộ phát quảng cáo của tôi chạy hai lần cho mỗi mục đích không?

đang MediaButtonReceiver của tôi:

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(); 

     } 

    } 
} 

lọc của máy thu này được đăng ký trong Manifest như sau:

<application> 
... 
    <receiver android:name=".RemoteControlReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.MEDIA_BUTTON"/> 
     </intent-filter> 
    </receiver> 
... 
</application> 

Các Broadcastreceiver là tự động đăng ký các đối tượng AudioManager trong onResume của MainActivity() . Và nó chưa được đăng ký trong onPause(). Như các liên kết cho biết đây là một cách chắc chắn để có được ưu tiên hàng đầu trên ý định media_button. Tôi biết tôi có thể bỏ qua mọi cuộc gọi của BroadcastReceiver bằng cách sử dụng biến tĩnh. Nhưng tôi muốn biết nguyên nhân của vấn đề này.

PS Nút phát/tạm dừng/trước/tiếp theo hoạt động tốt cho trình phát nhạc mặc định của Android.

Trả lời

12

Theo tôi, vấn đề là, OnReceive phản ứng khi nhấn và nhả nút bluetooth. Đó là lý do tại sao mã của bạn chạy 2 lần. Hãy thử làm như thế này:

if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { 
    KeyEvent Xevent = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);  
    if ((KeyEvent.KEYCODE_MEDIA_PLAY == Xevent.getKeyCode()) && (Xevent.getAction() == KeyEvent.ACTION_DOWN)) { //MainActivity.mult++; ... 

Hoặc bạn có thể sử dụng ACTION_UP bất chấp những gì bạn muốn làm. Tôi không chắc chắn, nhưng tôi hy vọng điều này sẽ giúp bạn.

+0

* doh * Yup! Tôi bị chậm lại>. <;; Cảm ơn bạn – user2275463

Các vấn đề liên quan