1. 程式人生 > 其它 >本地Service方法控制音樂播放

本地Service方法控制音樂播放

技術標籤:Android開發

問題現象描述:在Activity中控制播放時,按返回鍵退出應用後,音樂可在後臺繼續播放。重新進入app,音樂無法停止,重新點選開始播放音樂,出現重複的音樂同時播放的現象(多個同時播放)。如何解決?

解決方法:使用本地Service的方式來控制音樂的播放,app返回退出了,重新進入App也可以正常終止。

1、主Activity控制音樂 的開始、暫停、停止、退出空能,(具體實現在下面MusicService.java中實現)

/**
 * Activity播放廣播,返回鍵返回後,重新進入無法停止
 *
 * 通過start啟動服務的方式 控制音樂播放
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button btn_main_play;
    private Button btn_main_stop;
    private Button btn_main_pause;
    private Button btn_main_exit;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_main_play = findViewById(R.id.btn_main_play);
        btn_main_stop = findViewById(R.id.btn_main_stop);
        btn_main_pause = findViewById(R.id.btn_main_pause);
        btn_main_exit = findViewById(R.id.btn_main_exit);

        btn_main_play.setOnClickListener(this);
        btn_main_stop.setOnClickListener(this);
        btn_main_pause.setOnClickListener(this);
        btn_main_exit.setOnClickListener(this);
    }

    /**
     * 按鈕點選監聽事件 將點選的型別傳給服務進行判斷
     * @param v
     */
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(this,MusicService.class);
       switch ( v.getId()){
           case R.id.btn_main_play://播放
               intent.putExtra("action","play");
               startService(intent);
               break;
           case R.id.btn_main_stop://停止
               intent.putExtra("action","stop");
               startService(intent);
               break;
           case R.id.btn_main_pause://暫停
               intent.putExtra("action","pause");
               startService(intent);
               break;
           case R.id.btn_main_exit://退出並關閉音樂
                //停止服務
               stopService(intent);
               finish();
               break;
           default:

       }
    }
}

2、activity_main.xml佈局程式碼省略,效果圖如下

3、建立音樂播放器處理流程的服務 MusicService.java:

/**
 * 通過服務控制音樂的播放
 */
public class MusicService extends Service {
    public MusicService() {
    }

    //建立播放器物件
    private MediaPlayer player;

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //獲取MainActivity中 按鈕的點選型別:根據不同型別處理不同事件
        String action = intent.getStringExtra("action");
        if ("play".equals(action)) {
            //播放
            playMusic();
        } else if ("stop".equals(action)) {
            //停止
            stopMusic();
        } else if ("pause".equals(action)) {
            //暫停
            pauseMusic();
        }
        return super.onStartCommand(intent, flags, startId);
    }

    /**
     * 播放音樂
     */
    public void playMusic() {
        if (player == null ) {
            player= MediaPlayer.create(this,R.raw.kkth_myr);
        }
        player.start();
    }

    /**
     * 暫停播放
     */
    public void pauseMusic() {
        if (player != null && player.isPlaying()) {
            player.pause();
        }
    }

    /**
     * 停止播放
     */
    public void stopMusic() {
        if (player != null) {
            player.stop();
            player.reset();//重置
            player.release();//釋放
            player = null;
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //在服務死亡之前停止音樂
        stopMusic();
    }
}

建立服務看一下配置檔案AndroidManifest.xml中是否添加了對應的<Service>標籤