代碼片段對應邏輯
// 紅框上半部分
播放();
是否第一次播放 → 否
是否正在播放 → 是
是否暫停 → 否
// 紅框下半部分
if (當前狀態 == 暫停) {
調用 MusicService 發送「繼續播放」消息
}
狀態機模型
| 狀態 | isFirstPlay | isPlaying | isPaused | 處理邏輯 |
| 初始 | true | false | false | 創建 Service、prepare、start |
| 播放中 | false | true | false | 響應暫停/停止/下一首 |
| 暫停 | false | false | true | 響應繼續 → send MSG_RESUME |
| 停止/完成 | false | false | false | 釋放資源、重置標誌 |
關鍵點
- 三標誌位互斥:同一時刻僅一個為 true,避免邏輯衝突。
- Service 與 Activity 通過
Handler/Messenger/Broadcast 傳遞命令(PLAY、PAUSE、RESUME、STOP、NEXT、PREV)。
- 播放完成回調
OnCompletionListener 中自動切歌並重置標誌。
優化建議
- 用
enum State {IDLE, PREPARING, PLAYING, PAUSED, COMPLETED, ERROR} 替代多 boolean,狀態轉移更清晰。
- 採用
MediaSessionCompat + MediaControllerCompat 符合 Android 現代媒體架構,自動處理鎖屏、耳機鍵、Assistant 整合。