其他分享
首页 > 其他分享> > android – 如何在清单中注册* inner * MEDIA_BUTTON BroadcastReceiver?

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

作者:互联网

我按下时,我的应用程序可以识别我的耳机按钮,但其中一个按钮需要调用MyCustomActivity中的方法.问题是onReceive的第一个参数是一个无法转换为Activity的Context,因此我被迫将我的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) {
         // ...
        }
  }

解决方法:

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

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

或者,要使按钮无论如何响应,请考虑制作服务,然后注册接收器.

标签:android-audiomanager,android,broadcastreceiver
来源: https://codeday.me/bug/20190929/1832895.html