我正在尝试使用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()));
答案 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();
}
}
}