目前,在鎖屏界面控制音樂播放有兩種常用方式。
第一種方式:原生Android系統及自帶音樂播放器。
鎖屏界面端:
原生Android中,鎖屏界面相關的UI由KeyguardHostView提供,KeyguardHostView向KeyguardUpdateMonitor注冊一個類型為 KeyguardUpdateMonitorCallback的回調, KeyguardUpdateMonitort向AudioManager.registerRemoteControlDisplay向AudioManager(AudioService)注冊一個 IRemoteControlDisplay,最后注冊到MediaFocusControl,當音樂播放狀態變化時,將狀態傳上來。
KeyguardHostView根據音樂是否在播放來顯示KeyguardTransportControlView。這個view提供了具體的UI,如按鈕等,並且監聽onClick事件,將click事件轉換成keyCode, 並由RemoteController通過PendingIntent發送給注冊的RemoteControlClient(創建時指定了一個PendingIntent). 在KeyguardTransportControlView中,使用RemoteController.MetadataEditor就可以獲得音樂的相關信息,比如歌名等,這些信息是在音樂播放狀態變化時通過回調更新的。
參考源碼:
KeyguardTransportControlView.java
KeyguardHostView.java
Music APP端:
在MediaPlaybackService中,創建RemoteControlClient, 並通過AudioManager.registerRemoteControlClient(RemoteControlClient)進行注冊,在注冊之前,通過AudioManager.registerMediaButtonEventReceiver(ComponentName)注冊事件廣播接收器,就可以對按鍵事件進行響應處理了(具體在MediaButtonIntentReceiver中實現),比如播放下一首等。
參考源碼:MediaPlaybackService.java
第二種方式:第三方APP
這種方式是有APP自身提供鎖屏界面,即自己監聽屏幕的關或開,從而顯示帶有音樂控制的鎖屏界面。這種方式優勢在於使控制播放的UI有更大的靈活性,而且不依賴於具體的rom。不足之處在於,在解鎖時,APP自帶的鎖屏界面先解鎖,再到系統鎖屏界面,操作繁瑣。