android 广播事件结束,Android BroadcastReceiver 实时监听耳机拔出事件

写作背景:最近在做视频播放器,客户提出两项新需求:

插耳机看视频,拔出耳机,视频需要暂停。

视频播放时,按耳机按钮,视频暂停播放;再按耳机按钮,视频暂停。

第一个问题,插耳机看视频时,如何监听到耳机拔出事件然后让视频暂停呢?

------ 在视频播放界面,注册并建立一个BroadcastReceiver,并监听拔除耳机的事件。当接收到耳机拔出事件后,将视频暂停播放即可。

BroadcastReceiver机制介绍

广播发送

Normal broadcasts(普通广播):通过Context.sendBroadcast(intent)方式发送广播。

广播发出后,几乎同时到达多个广播接收者处,广播接收者无法终止广播继续传播。核心代码Example:

Intent intent = new Intent();

intent.setAction("com.action.changestatues");

context.sendBroadcast(intent);

Ordered broadcasts(有序广播):

通过Context.sendOrderedBroadcast(intent,null)发送广播;

通过abortBroadcast()终止广播;

广播接收者通过设置优先级来决定谁可以先接收到广播,优先级数值范围为-1000~1000。优先级通过在AndroidManifest.xml中设置。优先级高的接收者在接收到广播后,可以对广播进行处理,比如:终止广播继续传递,或向广播中添加数据继续传递给下一个接收者等。核心代码Example:

Intent intent = new Intent();

intent.setAction("com.action.changestatues");

context.sendOrderedBroadcast(intent,null);

** 广播接收**

广播接收者,就是负责接收和处理广播的类,该类继承BroadcastReceiver类,并重写

public void onReceive(Context context,Intent intent)方法,其中intent可以获得广播传递的数据;通过intent.getAction()可以得到广播intent设置的Action。比如,某个广播发送的Action为"android.intent.action.MEDIA_BUTTON",则所有在AndroidManifest.xml中设置过的广播接收者都能够接收到该广播。

广播注册和广播注销

如果需要在某个类中实现广播的接收,就有需要用到广播的注册和注销。这里需要注意的是,注册的广播要在不使用的情况下注销掉。如果在Activity.onResume()方法中进行了注册,需要在Activity.onPause()方法中进行注销。为了节省系统开销,当Activity处于暂停状态时,不会接收到广播。广播注册和接收的位置视具体情况而定。

核心代码Example:

private BroadcastReceiver mReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if ( action.equals(ALARM_ALERT)) {

//闹铃想起时,可以暂停视频或做其他事情

doFirstthing();

} else if (action.equals(Intent.ACTION_SCREEN_OFF)) {

//屏幕锁定时,可以暂停视频播放或做其他事情

doSecondthing();

}else if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {

//耳机拔出时,可以暂停视频播放或做其他事情

doOtherthing();

}

}

};

@Override

public void onResume() {

super.onResume();

//注册广播接收器,给广播接收器添加可以接收的广播Action

IntentFilter filter = new IntentFilter();

filter.addAction(Intent.ACTION_SCREEN_OFF);

filter.addAction(ALARM_ALERT);

filter.addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY);

registerReceiver(mReceiver, filter);

}

@Override

protected void onPause() {

//注销广播

unregisterReceiver(mReceiver);

super.onStop();

}

AudioManager.ACTION_AUDIO_BECOMING_NOISY介绍

广播intent,提示应用程序音频信号由于音频输出的变化将变得“嘈杂”。

例如,当拔出一个有线耳机,或断开一个支持A2DP的音频接收器,这个intent就会被发送,且音频系统将自动切换音频线路到扬声器。收到这个intent后,控制音频流的应用程序会考虑暂停,减小音量或其他措施,以免扬声器的声音使用户惊奇。

至此,第一个需求已经完成,感谢收看!

END

如果你一不小心,已经看完了,恭喜你,并没有彩蛋。

我只能祝福你成为

一个年轻的梦想者,

热爱代码,

不受束缚!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值