Android 服务与多线程——编写简单的音乐播放器程序
一、实验目的
1) 学会使用MediaPlayer;
2) 学会简单的多线程编程,使用Handler更新UI;
3) 学会使用Service进行后台工作;
4) 学会使用Service与Activity进行通信。
二、实验要求
1) 实现音乐文件的播放控制(仅需要播放,暂停和停止)
2) 利用Handler更新播放进度
3) 利用Service开启(停止)后台服务进行后台播放
三、使用环境
Eclipse,Android 2.3
四、调试过程、代码解析及运行截图
1.向sdcard中添加音乐:
1)启动模拟器,打开DDMS视图;
2)选择FileExplorer标签页;
3)选择sdcard目录后点击右上角的push按钮即可。如下图:
2.创建MediaPlayer的对象,并利用控制条更新播放进度:
1)创建MediaPlayer及Handler:
MediaPlayermPlayer = new MediaPlayer();
Handler handler = new Handler();
RunnableupdateThread = new Runnable(){
public void run() {
//获得歌曲现在播放位置并设置成播放进度条的值
seekbar.setProgress(mPlayer.getCurrentPosition());
//每次延迟100毫秒再启动线程
handler.postDelayed(updateThread, 100);
}
2)初始化音乐:
try {
mPlayer.setDataSource("/sdcard/test.mp3"); //选择资源
mPlayer.prepare(); //准备就绪
text.setText("初始化歌曲...");
} catch (IOException e){
text.setText("初始异常");
e.printStackTrace();
}
//获取音乐的总长度以设置进度条的最大长度
seekbar.setMax(mPlayer.getDuration());
mPlayer.setOnCompletionListener(complete);
3)对开始/暂停键事件触发:
privateImageButton.OnClickListenerbtn_play = new ImageButton.OnClickListener(){
@Override
public void onClick(View arg0) {
//TODOAuto-generated method stub
try {
if(mPlayer !=null) {
if(mPlayer.isPlaying()) { //判断是否正在播放
mPlayer.pause(); //暂停播放器
handler.post(updateThread); //使用handler的post方法用于更新
bn_play.setImageDrawable(getResources().getDrawable(R.drawable.play));
text.setText("已暂停"); //更新图标
}
else if(!mPlayer.isPlaying()) {
mPlayer.start(); //继续播放音乐
handler.post(updateThread);
bn_play.setImageDrawable(getResources().getDrawable(R.drawable.pause));
text.setText("播放中");
}
}
} catch (Exception e) {
text.setText("播放/暂停异常");
e.printStackTrace();
}
}
};
4)对停止键的事件触发:
private ImageButton.OnClickListenerbtn_stop = new ImageButton.OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated methodstub
try{
if(mPlayer.isPlaying()){
text.setText("已停止"); //更新文字提示
}
else {
text.setText("初始化歌曲...");
}
mPlayer.stop(); //停止播放音乐
handler.removeCallbacks(updateThread);
bn_play.setImageDrawable(getResources().getDrawable(R.drawable.play));
mPlayer.reset(); //恢复至初始状态
mPlayer.setDataSource("/sdcard/test.mp3");
mPlayer.prepare();
} catch (Exception e){
text.setText("停止异常");
e.printStackTrace();
}
}
};
5)退出的事件触发
private Button.OnClickListenerbtn_exit = new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated methodstub
onDestroy();
}
};
@Override