Android 3.0+中的ACTION_MEDIA_BUTTON静态广播接收器

时间:2013-06-09 16:37:47

标签: android class android-activity static broadcastreceiver

我正在尝试使用Android 3.0 +中的broadcastreceiver捕获ACTION_MEDIA_BUTTON意图。

我的接收器是MainActivity类的静态内部类。它是静态的,因为它是在我的AndroidManifest.xml中注册的,它必须找到该类。但是,这意味着当按下播放/暂停按钮时,我的BroadcastReceiver无法返回我的活动。调用onReceive方法,但由于该类是静态的,我无法通知我的活动。

使用对我的活动或Handler对象的引用也不起作用,因为我无法获取Android系统正在调用的BroadcastReceiver对象。

动态声明接收器也应该可以工作,但由于某些奇怪的原因,这在Android 3.0+上不起作用。它有以下几点:

AudioManager.registerMediaButtonEventReceiver(ComponentName)

需要调用哪个。

我班上的一些例子:

   public class MainActivity extends Activity {

        public static class MicReceiver extends BroadcastReceiver {
            // onReceive is called
                // How do I inform MainActivity of the press?
        }
    }

您对修复有任何想法吗?

谢谢!

[编辑] 请参阅下面的代码,动态注册我的接收器:(目前无效)

mReceiver = new RemoteControlReceiver();

IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
filter.setPriority(2147483647);
registerReceiver(mReceiver, filter);

AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
am.registerMediaButtonEventReceiver(new ComponentName(getPackageName(), RemoteControlReceiver.class.getName()));

3 个答案:

答案 0 :(得分:2)

AFAIK,registerMediaButtonEventReceiver()是您想要在后台接收媒体按钮事件。前台活动可以使用the standard onKeyDown() callback找到有关媒体按钮事件的信息。

答案 1 :(得分:0)

在Manifest中声明接收器将尝试实例化接收器并调用onRecieve(),即使活动不在。

要使其成为活动绑定接收器,请将其设为非静态类,并在onCreate()中对其进行实例化。然后,分别在onResume()onPause()中注册和注销它。由于class是非静态的,并且仅在活动处于活动状态时才注册,因此您可以安全地从内部接收器类调用父活动方法。

答案 2 :(得分:0)

如果您想在BroadcastReceiver

中处理某些内容,代码应该如下所示
public class MainActivity extends Activity {

        public static class MicReceiver extends BroadcastReceiver {

    public MicReceiver() {
        // TODO Auto-generated constructor stub
        super();
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        String intentAction = intent.getAction();
        if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
            return;
        }
        KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
        if (event == null) {
            return;
        }
        int action = event.getAction();
        if (action == KeyEvent.ACTION_DOWN) {

          Toast.makeText(context, "BUTTON PRESSED! ", Toast.LENGTH_SHORT).show(); 
        }
        abortBroadcast();
    }



        }
    }