Android实现后台播放音乐(Service方式)

实现:

在res文件夹下添加raw文件夹,添加mp3/4格式的音乐文件

注意命名规则只能是a-z,0-9,和下划线_ 不能大写字母和-

AndroidManifest.xml中

android:exported="false" >

android:exported是否支持其它应用调用当前组件

新建一个MusicService类继承Service并且implements MediaPlayer.OnCompletionListener监听播放完成事件

重写service的onCreate()方法

private MediaPlayer mediaPlayer;

//Service初始化时调用

public void onCreate(){

super.onCreate();

//初始化时就创建一个MediaPlayer进行资源链接

mediaPlayer = MediaPlayer.create(this, R.raw.floating_clound);

mediaPlayer.setOnCompletionListener(this);

}

若只是想简单的进行后台播放

重写onStartCommand 方法

@Override

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

// TODO Auto-generated method stub

super.onStartCommand(intent,flag,startId);

if(!mediaPlayer.isPlaying()){

// 开始播放

mediaPlayer.start();

// 允许循环播放

mediaPlayer.setLooping(true);

}

return START_STICKY;

}

若想进行绑定

@Override

public IBinder onBind(Intent intent) {

if(!mediaPlayer.isPlaying()){

// 开始播放

mediaPlayer.start();

// 允许循环播放

mediaPlayer.setLooping(true);

}

return binder;

}

解除绑定

@Override

public boolean onUnbind(Intent intent) {

// TODO Auto-generated method stub

//松绑Service,会触发onDestroy()

if(mediaPlayer.isPlaying()){

mediaPlayer.stop();

}

return super.onUnbind(intent);

}

重写Ondestroy方法

@Override

public void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

//先停止 再释放

if(mediaPlayer.isPlaying()){

mediaPlayer.stop();

}

mediaPlayer.release();

}

当Audio播放完的时候触发该动作

/**

* 当Audio播放完的时候触发该动作

*/

@Override

public void onCompletion(MediaPlayer player) {

// TODO Auto-generated method stub

// 结束Service

stopSelf();

}

并且写一个类继承Binder

class MyMusicBinder extends Binder{

//返回Service对象

MusicService getService(){

return MusicService.this;

}

}

在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 = ((MusicService.MyMusicBinder) iBinder).getService();

}

//不成功绑定时调用

@Override

public void onServiceDisconnected(ComponentName componentName) {

musicService = null;

Log.i("binding is fail", "binding is fail");

}

}

在点击事件中:(点击播放和暂停按钮)

private View.OnClickListener listener = new View.OnClickListener() {

@Override

public void onClick(View v) {

Button btn = (Button) v;

try {

Intent intent = new Intent();

intent.setClass(MainActivity.this, MusicService.class);

switch (btn.getId()) {

case R.id.play: {

conn= new MusicConnector();

bindService(intent, conn, Context.BIND_AUTO_CREATE);

break;

}

case R.id.pause: {

//结束Service

unbindService(conn);

break;

}

}

} catch (Exception e) {

}

}

};

音量相关:

通过AudioManager

AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);

1 获取最大媒体音量

int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

2 获取当前音量

int currentVolume = mAudioManager.getStreamVolume(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(){

super.onDestroy();

unbindService(conn);

}

问题: 暂停音乐再重新播放会重头开始

因为调用onbind又执行了onDestroy

具体的启动情况有下:

1.当启动时,单独调用bindService方法,在unbindService后,会执行service的onUnbind,再执行onDestroy方法。

2.当启动时,先调用startService,再调用bindService方法后,在unbindService后,会执行service的onUnbind,不会执行onDestroy方法。除非你在执行stopService.

3. 先调用startService,在调用stopService,会执行service的onDestroy方法

android后台自播放音乐,Android实现后台播放音乐(Service方式)相关推荐

  1. android 带记忆功能的播放器源码,【全开源可二开】带后台管理面板的在线音乐播放器Android应用APP源码...

    这是一款带后台管理面板的在线音乐播放器Android应用APP源码,可让您更快地构建在线和离线android音频播放器,代码全开源适合二次开发.该源码自带2个紫色和橙色主题(允许您添加更多主题),多语 ...

  2. Android 音乐APP(五)音乐通知栏、后台播放音乐

    Android 音乐通知栏 前言 正文 ① 通知栏按钮点击监听 ② 通知栏点击监听 ③ 通知栏业务处理 ④ 运行效果图 结语 前言   这篇文章的标题有些言简意赅了,也突出了这篇文章的核心,那就是通知 ...

  3. android服务绑定音乐播放器,Android开发【04-21求助贴】使用后台服务的音乐播放器...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import android.Manifest; import android.content.pm.PackageManager; import and ...

  4. android ios av tv,iOS AVPlayer 实现后台连续播放视频

    最近接到一个需求,需要做一个在后台播放视频的功能.折腾了一下,最后总算完成了.因此写一篇文章,介绍下具体的实现步骤,也说说自己遇到的坑,算是总结和记录. 前言 当 App 退到后台时,会进入 susp ...

  5. android异步线程未执行,关于多线程:当服务在后台运行时,Android异步任务无法正常运行(doInBackground未执行)...

    我注意到有时Async任务无法正常运行,实际上它的doInBackground()方法没有被调用,这种情况主要发生在该活动在后台运行任何服务时. 例如,当音乐在带有服务的后台运行时,Async任务不会 ...

  6. Android 系统(73)---Android判断你的应用在前台还是在后台

    Android判断你的应用在前台还是在后台 /*** 判断应用是否是在后台*/public static boolean isBackground(Context context) {Activity ...

  7. Android 音乐播放器的开发教程(六)service的运用及音乐列表点击播放 ----- 小达

    service的运用及音乐列表点击播放 按照前几篇博客的步骤,应该能看到自己手机里的音乐列表了,但是现在还只能看,不能点,还需要再给ListView添加点击事件的监听,接着启动一个Service来播放 ...

  8. ios和android操作收拾,iOS和Android后台机制的比较

    发件人: 首先,让我们了解ios中所谓的"后台进程"是怎么回事吗? 让我尽可能的清楚: iOS多任务栏不包含"所有正在运行的应用程序的列表". 它包含" ...

  9. android开发音乐播放器,Android开发简易音乐播放器

    这里介绍一个简易的音乐播放器,供大家参考,具体内容如下 效果图如下: 但是,由于这是一个简易版的音乐播放器,所播放的音乐只有一首,且被写死,但,操作却十分简单,方便理解! 这是代码的主要设计: 音乐主 ...

最新文章

  1. Nginx与php的整合
  2. 华为服务器MLC硬盘ID号,RH2288H RH5885H V3 3.5寸 SAS SATA华为服务器硬盘架子 支架
  3. 阿里云实时计算,前世功,今生能!
  4. CSS3笔记之定位篇(二)z-index
  5. 浅谈传统企业网络运营那些事儿
  6. 图像处理理论-颜色模式
  7. 更多特征变量却未能带来随机森林分类效果的提升
  8. UVA10934 Dropping water balloons【DP】
  9. 建造者模式 php,PHP设计模式之建造者模式定义与用法简单示例
  10. MySpace:.Net架构网站的王者
  11. 集成maven和Spring boot的profile 专题
  12. 罪恶都市联机器无法显示服务器,《GTA:罪恶都市》多人联机!你的童年又回来了,梦想成真了!...
  13. 27 | 风控系统:如何从海量业务数据中,挖掘黑灰产?
  14. Java实现微信公众号模板消息管理群发和单发
  15. Java多线程系列--【JUC锁04】-公平锁(二)
  16. 微信公众号中,怎么插入代码块?(微信公众号中,代码块怎么排版?)
  17. 隐函数存在定理3的证明Jacobi_20160503
  18. Python:1020 月饼
  19. 机器学习 深度学习技术区别_体育技术机器学习金钱和灵感的圣杯
  20. Android Preference详解

热门文章

  1. map怎么转化dto_阿里面试题:为什么Map桶中个数超过8才转为红黑树
  2. Buildroot构建指南——根文件系统(Rootfs)
  3. java厨房_Java多线程基础
  4. linux 创建组,创建用户
  5. 查找数组是否有重复元素
  6. vscode使用php调试
  7. Ubuntu 16.04上安装SkyEye及测试
  8. [Hyper-V]在Windows 8.1 操作系统中启用Hyper-V功能
  9. 利用shell脚本监控网站状态
  10. Cocoa Touch国际化