設計大概流程:
①混合方式開啟服務
②在服務的onCreate方法中建立一個mediaplayer 并且準備好
③ 點選播放按鈕開始播放音樂
服務暴露播放暫停方法/ 獲得目前播放狀态的方法
3.1 一個按鈕實作 播放/暫停
3.2 根據播放的狀态修改圖示的狀态
3.3 當activity退出再次進入的時候 根據目前播放狀态更新圖示狀态( onserviceconnected)
④ 進度條展示播放進度
4.1 服務暴露 擷取總時長的方法 擷取目前播放進度的方法
4.2 通過Handler 執行延遲消息 每隔500ms 更新一次進度條進度
4.3 handler執行的延遲消息 當音樂暫停 以及界面退出的時候 要把消息移除掉
⑤拖動進度條跟新播放的進度
5.1 服務暴露 seekTo 移動到某個位置播放的方法
5.2 給seekbar設定拖動的監聽 在onProgressChanged方法中 通過傳入的progress更新播放器的播
放進度
布局檔案:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ImageButton
android:id="@+id/im_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:background="@null"
android:onClick="touch"
android:src="@drawable/btn_audio_play"
/>
<SeekBar
android:id="@+id/sk_progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/im_btn" />
</RelativeLayout>
清單檔案:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itheima.Music"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.itheima.Music.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.itheima.Music.MusicService"></service>
</application>
</manifest>
mainactivity:
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.view.View;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import com.itheima.Music.MusicService.MyBinder;
public class MainActivity extends Activity {
private static final int SUCCESS = 0;
private ImageButton im_button;
private MyConnection conn;
private MyBinder mm;
private SeekBar sb_progress;
//建立一個handler對象
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case SUCCESS:
getPosition();
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
im_button = (ImageButton) findViewById(R.id.im_btn);
sb_progress = (SeekBar) findViewById(R.id.sk_progress);
sb_progress.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//停止觸摸
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
//開始觸摸
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if(fromUser){
mm.seekTo(progress);
}
}
});
Intent service = new Intent(getApplicationContext(), MusicService.class);
conn = new MyConnection();
startService(service);
bindService(service, conn, BIND_AUTO_CREATE);
}
public class MyConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mm = (MyBinder) service;
updateIcon();
//擷取一下總的時長
sb_progress.setMax(mm.getDuration());
sb_progress.setProgress(mm.getPrograss());
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
public void touch(View v){
mm.playPause();
updateIcon();
}
private void updateIcon() {
if(mm.isPlaying()){
im_button.setImageResource(R.drawable.btn_audio_pause);
handler.sendEmptyMessage(SUCCESS);
}else{
im_button.setImageResource(R.drawable.btn_audio_play);
handler.removeMessages(SUCCESS);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}
public void getPosition(){
int prograss = mm.getPrograss();
sb_progress.setProgress(prograss);
handler.sendEmptyMessageDelayed(SUCCESS, 500);
}
@Override
protected void onStop() {
super.onStop();
handler.removeCallbacksAndMessages(null);
}
@Override
protected void onResume() {
super.onResume();
if(mm!=null){
handler.sendEmptyMessageDelayed(SUCCESS, 500);
}
}
}
服務類代碼
public IBinder onBind(Intent intent) {
return new MyBinder();
}
@Override
public void onCreate() {
super.onCreate();
player = new MediaPlayer();
//播放器設定資源路徑
try {
player.setDataSource(path);
player.prepare();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public class MyBinder extends Binder{
public void playPause(){
if(player.isPlaying()){
player.pause();
}else{
player.start();
}
}
public boolean isPlaying(){
return player.isPlaying();
}
//擷取總的時長
public int getDuration(){
return player.getDuration();
}
//擷取進度狀态
public int getPrograss(){
return player.getCurrentPosition();
}
//定義一個方法,傳入要擷取的毫秒值
public void seekTo(int msec){
player.seekTo(msec);
}
}
}