在用MediaPlayer类来写播放器的过程中,我们能够发现,新建的MediaPlayer对象在调用start方法后,关闭了所在的activity,Meadia播放并没有停止,那是引起mediaplayer调用的事底层JNI的本地方法_native _start(),的过程中已经开了一个服务。
在退出界面的情况下去关闭歌曲播放服务,我一直在查找官方类中是否能够找到有关所开服务的相关说明,或者通过ActivityManager 的getsysytemService查找,都未能成功(或者本人未发现)。
private boolean isServiceRunning() {
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if ("com.example.MyService".equals(service.service.getClassName())) {
return true;
}
}
return false;
}
解决关闭后台播放服务有两种方法,比较正式的一种方法是将MeadiaPlayer的所有操作放在新的Service中,这个网上有好多教程,此处不讲,另一种比较方便的方式。便是:将播放页面不销毁,移到后台,通过改写她的返回键方法将其移至后台,
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
然后再在ondestory的方法中写入将线程关闭,MeadiaPlayer释放。
@Override
protected void onDestroy() {
if(thread1.isAlive()) {
stopThread = true;
}
if(mMediaPlayer.isPlaying()){
mMediaPlayer.release();
}
super.onDestroy();
}
注线程:线程的关闭不要使用thread的任何关闭方法,这样都会导致不可预测的错误。如stop等,最好的方式在thread 的run方法中添加一个if语句判断,通过设置条件,结束掉run,那样thread会自然销毁。)
Runnable mRunnable = new Runnable() {
public void run() {
while (!stopThread){
int progress = getProcess(mMediaPlayer.getCurrentPosition(), mMediaPlayer.getDuration());
String Timeshow = getDurition(mMediaPlayer.getCurrentPosition());
if(Timeshow.equals(SongDurition)){
playNextMusic();
}
handler2SendMessage(CHANGE_TIME,progress,Timeshow);
}
}
};
这样就可以通过关闭activity来释放Meadiaplayer的资源了,通过在另一个Activity中关闭播放界面的activity,这个网上太多,就不必赘述了。
播放器完整托管代码下载:
http://git.oschina.net/Lansus/Lansus_MusicPlayer