在Activity中重写onKeyDown、onKeyUp这些方法只适用于APP在前台的情况,如果将APP切换到后台就失效了。
经过网上一番摸索、读源码,终于把这个功能整出来了,说一下我的实现过程。 1.后台要获取到事件第一事件想到的肯定是广播,于是就找到了“android.intent.action.MEDIA_BUTTON”这个广播
2.注册监听这个广播后发现…这个广播压根接收不到啊,网上找了半天,有很多叫添加优先级(priority)的,可根本没用。。。
3.但功夫不负有心人,找到一篇10年前的文章,有兴趣可以看一下 https://blog.csdn.net/qinjuning/article/details/6938436 文章里说需要使用AudioManager对象注册一个MediaoButtonRecevie,让这个监听器成为MEDIA_BUTTON的唯一接收器(顾名思义就是只有你的APP可以收到这个广播)
AudioManager mAudioManager =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
ComponentName mbCN = new ComponentName(getPackageName(),MediaButtonReceiver.class.getName());
mAudioManager.registerMediaButtonEventReceiver(mbCN);
mAudioManager.unregisterMediaButtonEventReceiver(mbCN);
4.但是这个方法已经过时了(毕竟是10年前的文章),通过源码得知registerMediaButtonEventReceiver这个方法被 MediaSession.setMediaButtonReceiver替代了
@deprecated Use {@link MediaSession#setMediaButtonReceiver(PendingIntent)} instead.
5.又一番摸索后,找到了MediaSessionCompat这个类,具体的实现方法如下(注意要在Service中注册监听哦)
private MediaSessionCompat mMediaSession;
@Override
public void onCreate() {
super.onCreate();
ComponentName mbr = new ComponentName(getPackageName(), MusicIntentReceiver.class.getName());
mMediaSession = new MediaSessionCompat(this, "mbr", mbr, null);
mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
mMediaSession.setCallback(new MediaSessionCompat.Callback() {
@Override
public boolean onMediaButtonEvent(Intent intent) {
return true;
}
});
if (!mMediaSession.isActive()) {
mMediaSession.setActive(true);
}
}
@Override
public void onDestroy() {
mMediaSession.release();
super.onDestroy();
}
|