1. 程式人生 > >Android使用Service播放音樂

Android使用Service播放音樂

connect stat 生成 bin intent style protected state 最大值

像音樂這種耗時的和適合後臺操作的應當放在Service中進行操作,而不是放在Activity,下面就介紹使用Service的音樂播放器

先創建一個MusicService

技術分享

配置清單中會自動生成 改Service的聲明

技術分享

在MusicService中的Java代碼,裏面包含了音樂的相關操作

public class MusicService extends Service {
    private String path = "mnt/sdcard/123.mp3";
    private MediaPlayer player;

    @Override
    public IBinder onBind(Intent intent) {
        
//當執行完了onCreate後,就會執行onBind把操作歌曲的方法返回 return new MyBinder(); } @Override public void onCreate() { super.onCreate(); //這裏只執行一次,用於準備播放器 player = new MediaPlayer(); try { player.setDataSource(path); //準備資源 player.prepare(); }
catch (IOException e) { e.printStackTrace(); } Log.e("服務", "準備播放音樂"); } //該方法包含關於歌曲的操作 public class MyBinder extends Binder { //判斷是否處於播放狀態 public boolean isPlaying(){ return player.isPlaying(); } //播放或暫停歌曲 public
void play() { if (player.isPlaying()) { player.pause(); } else { player.start(); } Log.e("服務", "播放音樂"); } //返回歌曲的長度,單位為毫秒 public int getDuration(){ return player.getDuration(); } //返回歌曲目前的進度,單位為毫秒 public int getCurrenPostion(){ return player.getCurrentPosition(); } //設置歌曲播放的進度,單位為毫秒 public void seekTo(int mesc){ player.seekTo(mesc); } } }

布局中只添加一個按鈕和進度條

    <Button
        android:id="@+id/play"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="play"
        android:text="播放" />

    <SeekBar
        android:id="@+id/sb"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

在MainActivity中的Java代碼

public class MainActivity extends AppCompatActivity {

    private MyConnection conn;
    private MusicService.MyBinder musicControl;

    private Button playBtn;
    private SeekBar seekBar;
    private static final int UPDATE_PROGRESS = 0;

    //使用handler定時更新進度條
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case UPDATE_PROGRESS:
                    updateProgress();
                    break;
            }
        }
    };

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

        playBtn = (Button) findViewById(R.id.play);
        seekBar = (SeekBar) findViewById(R.id.sb);

        Intent intent3 = new Intent(this, MusicService.class);
        conn = new MyConnection();
        //使用混合的方法開啟服務,
        startService(intent3);
        bindService(intent3, conn, BIND_AUTO_CREATE);

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                //進度條改變
                if (fromUser){
                    musicControl.seekTo(progress);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                //開始觸摸進度條
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                //停止觸摸進度條
            }
        });
    }

    private class MyConnection implements ServiceConnection {

        //服務啟動完成後會進入到這個方法
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //獲得service中的MyBinder
            musicControl = (MusicService.MyBinder) service;
            //更新按鈕的文字
            updatePlayText();
            //設置進度條的最大值
            seekBar.setMax(musicControl.getDuration());
            //設置進度條的進度
            seekBar.setProgress(musicControl.getCurrenPostion());
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        //進入到界面後開始更新進度條
        if (musicControl != null){
            handler.sendEmptyMessage(UPDATE_PROGRESS);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //退出應用後與service解除綁定
        unbindService(conn);
    }

    @Override
    protected void onStop() {
        super.onStop();
        //停止更新進度條的進度
        handler.removeCallbacksAndMessages(null);
    }

    //更新進度條
    private void updateProgress() {
        int currenPostion = musicControl.getCurrenPostion();
        seekBar.setProgress(currenPostion);
        //使用Handler每500毫秒更新一次進度條
        handler.sendEmptyMessageDelayed(UPDATE_PROGRESS, 500);
    }


    //更新按鈕的文字
    public void updatePlayText() {
        if (musicControl.isPlaying()) {
            playBtn.setText("暫停");
            handler.sendEmptyMessage(UPDATE_PROGRESS);
        } else {
            playBtn.setText("播放");
        }
    }

    //調用MyBinder中的play()方法
    public void play(View view) {
        musicControl.play();
        updatePlayText();
    }
}

效果圖

技術分享

Android使用Service播放音樂