大家好!今天写音乐播放器的1.4版本,这个版本的功能是解决在上个版本中如果不先选择播放列表中的歌曲就直接按播放按钮(其他按钮也会)会报错的Bug。
先分析:
按下播放按钮会传入一个Intent给MusicService,这个Intent里面包括了Action和URI,Action作用是MusicService判断Intent是哪个按钮传递的,URI是初始化MediaPlayer的参数。而这个URI是SongList这个Activity传递给MusicActivity的歌曲路径,第一次运行程序按下播放键时因为没有在SongList这个Activity上选择歌曲所以SongList就没有传递任何东西到MusicActivity中,所以MusicActivity在获取SongList传递来的Intent的信息时就会报空指针异常。没选择歌曲或没有按下播放按钮就按下其他按钮报错的原因是MediaPlayer没有初始化。只有按下了播放按钮一切正常才会初始化MediaPlayer!
再解决:
我的想法是刚开始运行时,按下按钮(除播放列表按钮)时MusicPlayer先判断是否有SongList传递过来的Intent,没有则提示用户,有就一切按原计划执行。
在MusicPlayer这个Activity的按钮事件,重写的方法onClick中加入判断传过来的Bundle是否为空,为空则提示用户没有选择歌曲并返回,不为空则继续执行。
在解决这个问题时我也发现了其他的一些问题:
我利用MusicPlayer这个Activity的Menu按钮的退出功能加上了退出Service的功能,发现退出后还是在播放
先分析:
退出了Service,但是MediaPlayer的播放进程并没有关闭。
再解决:
在Service退出时会调用onDestroty()这个方法,在这个方法里加入关闭播放进程的代码即可。
MusicService.java:
Service是退出啦,可是发现MusicPlayer这个Activity要退两次才能退
先分析:
开始运行程序时我们启动了一个MusicPlayer,而我们在SongList得到歌曲路径时又启动了一个MusicPlayer,所有我们有两个Activity在运行,Activity不像Service一样不管用了多少次startService只要一次stopService就可以了!
再解决:
在我们在MusicPlayer启动SongList这个Activity时关闭自己
MusicPlayer.java:
//按钮显示文字与功能的互换
if(button_loop.getText()=="取消重复") {
button_loop.setText("重复");
Intent intent_notLoop= new Intent(MusicService.NOTLOOP_ACTION);
intent_notLoop.setClass(MusicPlayer.this, MusicService.class);
startService(intent_notLoop);
Toast.makeText(MusicPlayer.this, "重复已关闭", Toast.LENGTH_SHORT).show();
}else {
button_loop.setText("取消重复");
Toast.makeText(MusicPlayer.this, "重复已开启", Toast.LENGTH_SHORT).show();
}
break;
case 3:
Intent intent_songlist = new Intent(MusicPlayer.this, SongList.class);
startActivity(intent_songlist);
//当前这个MusicPlayer利用finish结束掉
finish();
}
}
}; Ok,这样就把旧的一个关闭掉了!
SongList在传递歌曲路径给MusicPlayer时也finish掉自己,然后在SongList的Menu按钮事件加入代码如下:
这里就实现了Service关闭、Activity关闭!
后总结:
1.4版本的功能基本实现了,下一个版本将会是2.1版本,因为下个版本的变化会大一些,从1.1到1.4自己确实学到了不少东西,Android的知识,像Activity、Service的生命周期,Activity启动另一个Activity,Activity启动Service等等,还有编程之外的东西,像是改变了自己解决困难的态度,增加了自己的毅力等等,总之每天都进步一点点!将来一定会成为大牛的,呵呵!好了今天就到这里啦!
后总结: