如何在清单中注册 *inner* MEDIA_BUTTON BroadcastReceiver?

an0*_*00b 3 android broadcastreceiver android-audiomanager

设法让我的耳机按钮在按下时被我的应用程序识别,但其中一个按钮需要调用 MyCustomActivity 中的方法。问题是 onReceive 的第一个参数是一个无法转换为 Activity 的上下文,因此我被迫将 BroadcastReceiver 实现为 MyCustomActivity 中的内部类。

到目前为止一切顺利,但如何在清单中注册这个内部 MediaButtonEventReceiver?

对于独立类,这很简单:

<receiver android:name=".RemoteControlReceiver">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

对 MyCustomActivity 的 mReceiver 执行相同操作的技巧/语法是什么?

  private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context ctx, Intent intent) {
         // ...
        }
  }
Run Code Online (Sandbox Code Playgroud)

A--*_*--C 5

你不,如果它是活动的一部分,你动态注册它:

BroadcastReceiver receiver;

@Override
protected void onCreate (Bundle b)
{
  super.onCreate (b);
  IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);    
  filter.setPriority(10000);  
  receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context ctx, Intent intent) {
      // ...
    }
  };
  registerReceiver (receiver, filter);
}
Run Code Online (Sandbox Code Playgroud)

然后不要忘记注销onPause()(以避免泄漏)。

@Override
protected void onPause()
{ 
  try{
    unregisterReceiver (receiver);
  }
  catch (IllegalStateException e)
  {
    e.printStackTrace();
  }
  super.onPause();
}
Run Code Online (Sandbox Code Playgroud)

但是,这种动态注册确实意味着,如果您的 Activity 不在前台,则该按钮将不起作用。您可以尝试取消注册onDestroy(),但避免泄漏的最可靠方法是onPause().

或者,要使按钮无论如何都响应,请考虑创建一个服务,并注册您的接收器。

  • @A--C 我猜为什么要订购它是说接听/结束电话优先于开始/暂停音乐。 (2认同)
  • @an00b 可能会很浪费,但是让 **this** Receiver 为您的 Activity 实现的 *another* BroadCastReceiver 制作一个 *custom* 广播。 (2认同)
  • 如果这是解决这个问题的唯一方法,那也不算浪费。:) 为什么 Google 选择消除 Android 2.x 中可用的好东西,让我们的生活变得如此悲惨? (2认同)