相对完美的后台Service实现播放音乐功能

对于用Context.startService()启动的service生命周期为onCreate()-onStartCommand()-onDestroy();如果多次用context.startService启动service只会多次执行onStartCommand()方法。根据音乐播放器的特性使用Context.startService()调用在合适不过了。

public class MyMusicPlayer extends Service implements

MediaPlayer.OnCompletionListener {

public static final String TAG = "MyMusicPlayer";

public static final String ACTION_ADD_TO_QUEUE = "com.example.musicmedia.ADD_TO_QUEUE";//指定action

private ConcurrentLinkedQueue<Uri> mTrackQueue;//它是一个基于链接节点的无界线程安全队列。该队列的元素遵循先进先出的原则。头是最先加入的,尾是最近加入的。插入元素是追加到尾上。提取一个元素是从头提取。

private MediaPlayer mMediaPlayer;

public IBinder onBind(Intent intent) {

return null;

}

@Override

public void onCreate() {

super.onCreate();

Log.i(TAG, "onCreate");

mTrackQueue = new ConcurrentLinkedQueue<Uri>();//初始化并发队列

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

String action = intent.getAction();

if (ACTION_ADD_TO_QUEUE.equals(action)) {

Uri trackUri = intent.getData();//获取音乐的资源

Log.i("MyMusicPlayer", trackUri.toString());

this.addTrackToQueue(trackUri);//添加资源

}

return START_NOT_STICKY;//返回值确定了该Service不会在系统关闭它后重新启动,执行一次性操作经常用这个。

}

@Override

public void onDestroy() {

super.onDestroy();

Log.i(TAG, "onDestroy");

if (mMediaPlayer != null) {//当service销毁的时候释放mMediaPlayer资源

mMediaPlayer.release();

mMediaPlayer = null;

}

}

//如果已经开始播放就往队尾添加新音乐资源,否则创建MediaPlayer并开始播放

private void addTrackToQueue(Uri trackUri) {

if (mMediaPlayer == null) {

try {

Log.i("MyMusicPlayer", "addTrackQueue:" + trackUri);

mMediaPlayer = MediaPlayer.create(this, trackUri);//初始化mMediaPlayer,因为用MediaPlayer.create初始化所以不用调用prepare()方法准备。该初始化自动完成

mMediaPlayer.setOnCompletionListener(this);//注册一个回调函数,音频播放完成后调用

mMediaPlayer.start();//开始播放

} catch (Exception e) {

stopSelf();//停止service

}

} else {

mTrackQueue.offer(trackUri);//向队列添加元素

}

}

//曲目播放完毕,开始播放下一首或者停止Service

@Override

public void onCompletion(MediaPlayer mediaPlayer) {

mediaPlayer.reset();//重用MediaPlayer对象

Uri nextTrackUri = mTrackQueue.poll();//从队列里面取出元素

if (nextTrackUri != null) {

try {

mMediaPlayer.setDataSource(this, nextTrackUri);//初始化mMediaPlayer

mMediaPlayer.prepare();//准备

mMediaPlayer.start();//播放

} catch (IOException e) {

stopSelf();

}

} else {

stopSelf();//停止service

}

}

}

时间: 2024-11-18 14:59:24

相对完美的后台Service实现播放音乐功能的相关文章

在service中播放音乐

MainActivity: public class MainActivity extends Activity { private MyReceiver receiver; private Button btnStartOrPause; private String receiverAction = "com.pepelu.musicplayer"; @Override protected void onCreate(Bundle savedInstanceState) { supe

手机影音第十五天,利用service实现后台播放音乐,在通知栏显示当前音乐信息等

代码已经托管到码云上,有兴趣的小伙伴可以下载看看 https://git.oschina.net/joy_yuan/MobilePlayer 先来一张目前的音乐播放器的效果图,当播放时,手机的状态通知栏也会有音乐信息显示. 这里可以看到有歌名.演唱者,还有歌曲的总时间,当前播放时间,当前播放进度,音乐暂停.下一首,上一首,音乐循环模式(单曲循环,顺序播放.循环播放)功能的实现.下一步就是把中间空白的部分填充歌词,然后做成根据进度显示歌词. 由于这次的内容有点多,是写了一天半的代码,讲的没那么细,

Android(java)学习笔记234: 服务(service)之音乐播放器

1.我们播放音乐,希望在后台长期运行,不希望因为内存不足等等原因,从而导致被gc回收,音乐播放终止,所以我们这里使用服务Service创建一个音乐播放器. 2.创建一个音乐播放器项目(使用服务) (1)首先新建一个Android项目,命名为"Mp3音乐播放器",如下: (2)创建服务MusicService,如下: 1 package com.himi.Mp3player; 2 3 import android.app.Service; 4 import android.content

IOS 后台运行 播放音乐

iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了.如果音频操作是用苹果官方的AVFoundation.framework实现,像用AvAudioPlayer,AvPlayer播放的话,要实现完美的后台音频播放,依据app的功能需要,可能需要实现几个关键的功能. 首先,播放音频之前先要设置AVAudioSession模式,通常只用来播放的App可以设为AVAudioSessionCategoryPlayback即可.模式意义及其他模式请参考文档. 1 //后台

后台播放音乐

iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了.如果音频操作是用苹果官方的AVFoundation.framework实现,像用AvAudioPlayer,AvPlayer播放的话,要实现完美的后台音频播放,依据app的功能需要,可能需要实现几个关键的功能. 首先,播放音频之前先要设置AVAudioSession模式,通常只用来播放的App可以设为AVAudioSessionCategoryPlayback即可.模式意义及其他模式请参考文档. //后台播放

Android使用Service播放音乐

像音乐这种耗时的和适合后台操作的应当放在Service中进行操作,而不是放在Activity,下面就介绍使用Service的音乐播放器 先创建一个MusicService 配置清单中会自动生成 改Service的声明 在MusicService中的Java代码,里面包含了音乐的相关操作 public class MusicService extends Service { private String path = "mnt/sdcard/123.mp3"; private Media

IOS后台运行 之 后台播放音乐

iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了.如果音频操作是用苹果官方的AVFoundation.framework实现,像用AvAudioPlayer,AvPlayer播放的话,要实现完美的后台音频播放,依据app的功能需要,可能需要实现几个关键的功能. 首先,播放音频之前先要设置AVAudioSession模式,通常只用来播放的App可以设为AVAudioSessionCategoryPlayback即可.模式意义及其他模式请参考文档. //后台播放

使用 AVAudioSession 实现后台播放音乐

1. 前言 AVAudioSession是一个单例,无需实例化即可直接使用.AVAudioSession在各种音频环境中起着非常重要的作用 针对不同的音频应用场景,需要设置不同的音频会话分类 1.1 ?AVAudioSession的类别 AVAudioSessionCategoryAmbient –混音播放,例如雨声.汽车引擎等,可与其他音乐一起播放 AVAudioSessionCategorySoloAmbient –后台播放,其他音乐将被停止 AVAudioSessionCategoryPl

IOS后台播放音乐

IOS后台播放音乐 博客分类: IOS http://www.apple.com.cn/developer/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/AudioandVideoTechnologies/AudioandVideoTechnologies.html#//apple_ref/doc/uid/TP40007072-CH19-SW32 1.首先在工程中导入播放音乐所使用的框架:AV Fo