3

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

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

对于独立类,这很简单:

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

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

  private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context ctx, Intent intent) {
         // ...
        }
  }
4

2 回答 2

5

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

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

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

@Override
protected void onPause()
{ 
  try{
    unregisterReceiver (receiver);
  }
  catch (IllegalStateException e)
  {
    e.printStackTrace();
  }
  super.onPause();
}

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

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

于 2013-02-25T01:22:36.970 回答
1

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

你不能。不过,您可以通过调用registerReceiver()活动来动态注册它。

于 2013-02-25T01:21:15.260 回答