Android实现后台播放音乐(Service方式)
实现:
在res文件夹下添加raw文件夹,添加mp3/4格式的音乐文件
注意命名规则只能是a-z,0-9,和下划线_ 不能大写字母和-
中
android:exported="false" >
android:exported是否支持其它应用调用当前组件
新建一个MusicService类继承Service并且implements 监听播放完成事件
重写service的onCreate()方法
private MediaPlayer mediaPlayer;
//Service初始化时调用
public void onCreate(){
();
//初始化时就创建一个MediaPlayer进行资源链接
mediaPlayer = (this, .floating_clound);
(this);
}
若只是想简单的进行后台播放
重写onStartCommand 方法
@Override
public int onStartCommand (Intent intent,int flag, int startId) {
// TODO Auto-generated method stub
(intent,flag,startId);
if(!()){
// 开始播放
();
// 允许循环播放
(true);
}
return START_STICKY;
}
若想进行绑定
@Override
public IBinder onBind(Intent intent) {
if(!()){
// 开始播放
();
// 允许循环播放
(true);
}
return binder;
}
解除绑定
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
//松绑Service,会触发onDestroy()
if(()){
();
}
return (intent);
}
重写Ondestroy方法
@Override
public void onDestroy() {
// TODO Auto-generated method stub
();
//先停止 再释放
if(()){
();
}
();
}
当Audio播放完的时候触发该动作
/**
* 当Audio播放完的时候触发该动作
*/
@Override
public void onCompletion(MediaPlayer player) {
// TODO Auto-generated method stub
// 结束Service
stopSelf();
}
并且写一个类继承Binder
class MyMusicBinder extends Binder{
//返回Service对象
MusicService getService(){
return ;
}
}
在Activity中:
// 创建自定义的音乐Service对象
private MusicService musicService;
在Activity中创建一个private connector类 (连接服务的Client)监听Service状态的变化
private class MusicConnector implements ServiceConnection {
//成功绑定时调用 即bindService()执行成功同时返回非空Ibinder对象
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
musicService = (() iBinder).getService();
}
//不成功绑定时调用
@Override
public void onServiceDisconnected(ComponentName componentName) {
musicService = null;
("binding is fail", "binding is fail");
}
}
在点击事件中:(点击播放和暂停按钮)
private listener = new () {
@Override
public void onClick(View v) {
Button btn = (Button) v;
try {
Intent intent = new Intent();
(, );
switch (()) {
case : {
conn= new MusicConnector();
bindService(intent, conn, Context.BIND_AUTO_CREATE);
break;
}
case : {
//结束Service
unbindService(conn);
break;
}
}
} catch (Exception e) {
}
}
};
音量相关:
通过AudioManager
AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
1 获取最大媒体音量
int maxVolume = (AudioManager.STREAM_MUSIC);
2 获取当前音量
int currentVolume = (AudioManager.STREAM_MUSIC);
3 渐进式调节音量
adjustStreamVolume (int streamType, int direction, int flags)
4 步进式调节:(直接调到那个音量):
setStreamVolume (int streamType, int index, int flags)
int streamType 需要调整的音量类型
(以下常量定义于AudioManager类中)
STREAM_ALARM 警报
STREAM_MUSIC 音乐回放即媒体音量
STREAM_NOTIFICATION 窗口顶部状态栏Notification,
STREAM_RING 铃声
STREAM_SYSTEM 系统
STREAM_VOICE_CALL 通话
int direction 调整的方向,加或者减。(以下常量定义于AudioManager类中)
ADJUST_LOWER 降低音量
ADJUST_RAISE 升高音量
ADJUST_SAME 保持不变,这个主要用于向用户展示当前的音量
int flags 附加的一些参数
FLAG_PLAY_SOUND 调整音量时播放声音
FLAG_SHOW_UI 调整时显示音量条,就是按音量键出现的那个
0表示什么也没有
int index:
把音量调整到index值
报错:leaked ServiceConnection
在Activity关闭的时候,没有去关闭Service
解决: 在onDestroy() 方法中解除service的绑定(binding模式)或者stopService(非binding模式)
@Override
public void onDestroy(){
();
unbindService(conn);
}
问题: 暂停音乐再重新播放会重头开始
因为调用onbind又执行了onDestroy
具体的启动情况有下:
1.当启动时,单独调用bindService方法,在unbindService后,会执行service的onUnbind,再执行onDestroy方法。
2.当启动时,先调用startService,再调用bindService方法后,在unbindService后,会执行service的onUnbind,不会执行onDestroy方法。除非你在执行stopService.
3. 先调用startService,在调用stopService,会执行service的onDestroy方法