既然是音乐播放器就自然免不了MediaPlayer了,MediaPlayer原生的方法就有好几个常用的:
MediaPlayer.reset();重置播放器数据
MediaPlayer.setDataSource();设置播放的源文件
MediaPlayer.prepare();正式加载源文件
MediaPlayer.start();
MediaPlayer.pause();
MediaPlayer.seekTo();
MediaPlayer.getCurrentPosition();
MediaPlayer.getDuration();
MediaPlayer.release();
MediaPlayer.setOnCompletionListener();
用上面的方法足以实现播放器的大部分功能了,但是有2个问题。
1. MediaPlayer实例一个APP应该只能有一个,否则一点播放列表中的歌曲就生成一个MediaPlayer放歌,那不岂变成多首歌同时播放了么。所有我们需要一个APP全局实例,做到这一点就要用到Application组件,位于Activity高一层的组件,把Manifest.xml中的Application标签换成我们自己写的Application类。
2. 放歌的时候我们退出APP并不能真正的退出,MediaPlayer应该还要在后台播放,所以MediaPlayer肯定是与Service一起使用的。
3. 在长时间把APP放在后台,一段时间之后,又或者当系统内存紧张的时候会杀死这些后台程序的,所以为了避免Service被杀死,要把Service设为前台服务,提升优先级。
创建Service
- 编写AIDL : IMediaService.aidl
- 自动生成IMediaService.java
- 编写Service类,在OnBind函数返回继承了IMediaService.Stub类的真正服务端
private ServiceConnection connection=new ServiceConnection()
{
@Override
public void onServiceDisconnected(ComponentName arg0)
{
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1)
{
// TODO Auto-generated method stub
server=IMediaService.Stub.asInterface(arg1);
}
};
把Service设置成前台服务:用的就是Service.startForeground(id,notification);和Service.stopForeground(boolean);
public void updateNotification(String musicname,String artist)
{
Notification notification=new Notification();
//设置Notification的status的内容
notification.icon=R.drawable.ic_launcher;
notification.tickerText=musicname;
//设置Notification的下拉下来展示的内容
RemoteViews rv=new RemoteViews(getPackageName(), R.layout.notification);
rv.setTextViewText(R.id.notification_musicname_tv, "正在播放: "+musicname);
rv.setTextViewText(R.id.notification_artist_tv, artist);
notification.contentView=rv;
//设置按Notification时的跳转
Intent intent=new Intent(getApplicationContext(), MainActivity.class);
PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
notification.contentIntent=pendingIntent;
startForeground(1, notification);
}
public void cancelNotification()
{
stopForeground(true);
}
Parcelable的实现:
http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html