寫作背景:最近在做視頻播放器啼止,客戶提出兩項(xiàng)新需求:
- 插耳機(jī)看視頻道逗,拔出耳機(jī),視頻需要暫停献烦。
- 視頻播放時(shí)滓窍,按耳機(jī)按鈕,視頻暫停播放巩那;再按耳機(jī)按鈕吏夯,視頻暫停。
第一個(gè)問(wèn)題拢操,插耳機(jī)看視頻時(shí)锦亦,如何監(jiān)聽(tīng)到耳機(jī)拔出事件然后讓視頻暫停呢?
------ 在視頻播放界面令境,注冊(cè)并建立一個(gè)BroadcastReceiver杠园,并監(jiān)聽(tīng)拔除耳機(jī)的事件。當(dāng)接收到耳機(jī)拔出事件后舔庶,將視頻暫停播放即可抛蚁。
BroadcastReceiver機(jī)制介紹
-
廣播發(fā)送
Normal broadcasts(普通廣播):通過(guò)Context.sendBroadcast(intent)
方式發(fā)送廣播。
廣播發(fā)出后惕橙,幾乎同時(shí)到達(dá)多個(gè)廣播接收者處瞧甩,廣播接收者無(wú)法終止廣播繼續(xù)傳播。核心代碼Example:
Intent intent = new Intent();
intent.setAction("com.action.changestatues");
context.sendBroadcast(intent);
Ordered broadcasts(有序廣播):
通過(guò)Context.sendOrderedBroadcast(intent弥鹦,null)
發(fā)送廣播肚逸;
通過(guò)abortBroadcast()
終止廣播;
廣播接收者通過(guò)設(shè)置優(yōu)先級(jí)來(lái)決定誰(shuí)可以先接收到廣播彬坏,優(yōu)先級(jí)數(shù)值范圍為-1000~1000朦促。優(yōu)先級(jí)通過(guò)在AndroidManifest.xml中<intent-filter android:priority="number">
設(shè)置。優(yōu)先級(jí)高的接收者在接收到廣播后栓始,可以對(duì)廣播進(jìn)行處理务冕,比如:終止廣播繼續(xù)傳遞,或向廣播中添加數(shù)據(jù)繼續(xù)傳遞給下一個(gè)接收者等幻赚。核心代碼Example:
Intent intent = new Intent();
intent.setAction("com.action.changestatues");
context.sendOrderedBroadcast(intent,null);
** 廣播接收**
廣播接收者禀忆,就是負(fù)責(zé)接收和處理廣播的類,該類繼承BroadcastReceiver類落恼,并重寫
public void onReceive(Context context,Intent intent)
方法箩退,其中intent可以獲得廣播傳遞的數(shù)據(jù);通過(guò)intent.getAction()
可以得到廣播intent設(shè)置的Action佳谦。比如戴涝,某個(gè)廣播發(fā)送的Action為"android.intent.action.MEDIA_BUTTON"
,則所有在AndroidManifest.xml中設(shè)置過(guò)<action android:name="android.intent.action.MEDIA_BUTTON"/>
的廣播接收者都能夠接收到該廣播。廣播注冊(cè)和廣播注銷
如果需要在某個(gè)類中實(shí)現(xiàn)廣播的接收喊括,就有需要用到廣播的注冊(cè)和注銷。這里需要注意的是矢棚,注冊(cè)的廣播要在不使用的情況下注銷掉郑什。如果在Activity.onResume()
方法中進(jìn)行了注冊(cè),需要在Activity.onPause()
方法中進(jìn)行注銷蒲肋。為了節(jié)省系統(tǒng)開銷蘑拯,當(dāng)Activity處于暫停狀態(tài)時(shí),不會(huì)接收到廣播兜粘。廣播注冊(cè)和接收的位置視具體情況而定申窘。
核心代碼Example:
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if ( action.equals(ALARM_ALERT)) {
//鬧鈴想起時(shí),可以暫停視頻或做其他事情
doFirstthing();
} else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
//屏幕鎖定時(shí)孔轴,可以暫停視頻播放或做其他事情
doSecondthing();
}else if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
//耳機(jī)拔出時(shí)剃法,可以暫停視頻播放或做其他事情
doOtherthing();
}
}
};
@Override
public void onResume() {
super.onResume();
//注冊(cè)廣播接收器,給廣播接收器添加可以接收的廣播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路鹰,提示應(yīng)用程序音頻信號(hào)由于音頻輸出的變化將變得“嘈雜”贷洲。
例如,當(dāng)拔出一個(gè)有線耳機(jī)晋柱,或斷開一個(gè)支持A2DP的音頻接收器优构,這個(gè)intent就會(huì)被發(fā)送,且音頻系統(tǒng)將自動(dòng)切換音頻線路到揚(yáng)聲器雁竞。收到這個(gè)intent后钦椭,控制音頻流的應(yīng)用程序會(huì)考慮暫停,減小音量或其他措施碑诉,以免揚(yáng)聲器的聲音使用戶驚奇彪腔。
至此,第一個(gè)需求已經(jīng)完成联贩,感謝收看漫仆!
END
如果你一不小心,已經(jīng)看完了泪幌,恭喜你盲厌,并沒(méi)有彩蛋。
我只能祝福你成為
一個(gè)年輕的夢(mèng)想者祸泪,
熱愛(ài)代碼吗浩,
不受束縛!