Android Service组件实现后台音乐播放
源码在最后哦!
一、Service组件介绍
1、Service
Service它可以在后台执行长时间运行操作而没有用户界面的应用组件,不依赖任何用户界面,例如后台播放音乐,后台下载文件等。
虽然服务是在后台运行的,但是Service和Activity都是运行在当前APP所在的main thread(UI主线程)中的,而耗时操作(如网络请求、拷贝数据、大文件)会阻塞主线程,给用户带来不好的体验。如果需要在服务中进行耗时操作,可以选择 IntentService,IntentService是Service的子类,用来处理异步请求。
2、Service启动的两种方式
(1)在Acitivity界面通过显式意图(或隐式意图)的方式来启动服务和关闭服务。
Intent intentService = new Intent(MainActivity.this, AudioServiceOnBind.class);startService(intentService);
(2)bindService()绑定服务
当应用组件通过调用 bindService() 绑定到服务时,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果。 仅当与另一个应用组件绑定时,绑定服务才会运行。 多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。
二、实现简单音乐播放器
1、首先创建一个Service
创建Service直接在Android Studio中右键选择Service创建即可。默认我们所创建的Service是继承Service的。同时我们为了实现后台音乐播放的功能,所以我们还要实MediaPlayer.OnCompletionListener的接口。
同时还要在AndroidManifest.xml文件中对已经创建的Service进行注册,这一点Android Studio已经帮我们自动创建好了。
<serviceandroid:name=".AudioServiceOnBind"android:enabled="true"android:exported="false" />
创建 AudioServiceOnBind服务,在应用时通过绑定的方式进行服务调用。
public class AudioServiceOnBind extends Service implements MediaPlayer.OnCompletionListener{private final IBinder binder = new AudioBinder();public AudioServiceOnBind() {super();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d(AudioServiceOnBind.this.getClass().getName(),"执行onStartCommand()");return 0;}@Overridepublic IBinder onBind(Intent intent) {return binder;}@Overridepublic void onCreate(){super.onCreate();Log.d(AudioServiceOnBind.this.getClass().getName(),"执行onCreate()");}@Overridepublic void onCompletion(MediaPlayer mp) {stopSelf();}@Overridepublic void onDestroy(){super.onDestroy();Log.d(AudioServiceOnBind.this.getClass().getName(),"执行onDestroy()");}//为了和Activity交互,我们需要定义一个Binder对象class AudioBinder extends Binder {//返回Service对象AudioServiceOnBind getService(){return AudioServiceOnBind.this;}}
}
2、实现媒体播放功能
(1)首先准备好需要播放的音乐资源,放在res目录下的raw文件下。
(2)在Service中 重写onCreate()方法实现对媒体资源的加载以及播放。
//用于播放音乐等媒体资源private MediaPlayer mediaPlayer;@Overridepublic void onCreate(){super.onCreate();Log.d(AudioServiceOnBind.this.getClass().getName(),"执行onCreate()");if (mediaPlayer==null){mediaPlayer=MediaPlayer.create(this,R.raw.gumeng);mediaPlayer.setOnCompletionListener(this);}mediaPlayer.start();}
(3)实现播放暂停功能
public void pause() {if (mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.pause();}}
(4)实现继续播放功能
public void play() {if (!mediaPlayer.isPlaying()) {mediaPlayer.start();}}
(5)实现服务销毁时释放资源
@Overridepublic void onDestroy(){if(mediaPlayer.isPlaying()){mediaPlayer.stop();}mediaPlayer.release();stopForeground(true);Log.d(AudioServiceOnBind.this.getClass().getName(),"执行onDestroy()");}
(6)Service完整代码
public class AudioServiceOnBind extends Service implements MediaPlayer.OnCompletionListener{private final IBinder binder = new AudioBinder();//用于播放音乐等媒体资源private MediaPlayer mediaPlayer;public AudioServiceOnBind() {super();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d(AudioServiceOnBind.this.getClass().getName(),"执行onStartCommand()");return 0;}@Overridepublic IBinder onBind(Intent intent) {return binder;}@Overridepublic void onCreate(){super.onCreate();Log.d(AudioServiceOnBind.this.getClass().getName(),"执行onCreate()");if (mediaPlayer==null){mediaPlayer=MediaPlayer.create(this,R.raw.gumeng);mediaPlayer.setOnCompletionListener(this);}mediaPlayer.start();}@Overridepublic void onCompletion(MediaPlayer mp) {stopSelf();}@Overridepublic void onDestroy(){if(mediaPlayer.isPlaying()){mediaPlayer.stop();}mediaPlayer.release();stopForeground(true);Log.d(AudioServiceOnBind.this.getClass().getName(),"执行onDestroy()");}public void pause() {if (mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.pause();}}public void play() {if (!mediaPlayer.isPlaying()) {mediaPlayer.start();}}//为了和Activity交互,我们需要定义一个Binder对象class AudioBinder extends Binder {//返回Service对象AudioServiceOnBind getService(){return AudioServiceOnBind.this;}}
}
3、实现对音乐播放服务的调用
(1)创建一个Activity
public class MainActivity extends AppCompatActivity {private AudioServiceOnBind audioServiceOnBind;//使用ServiceConnection来监听Service状态的变化private ServiceConnection conn = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {audioServiceOnBind = null;}@Overridepublic void onServiceConnected(ComponentName name, IBinder binder) {//这里我们实例化audioService,通过binder来实现audioServiceOnBind = ((AudioServiceOnBind.AudioBinder) binder).getService();}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Objects.requireNonNull(getSupportActionBar()).hide();setContentView(R.layout.activity_main);requestWindowFeature(Window.FEATURE_NO_TITLE); setStatusBarFullTransparent();System.out.println("MainActivity:onCreate()方法执行了,主界面被创建了");}@Overrideprotected void onStart() {super.onStart();System.out.println("MainActivity:onStart()方法执行了,界面可以看到了");}@Overrideprotected void onResume() {super.onResume();System.out.println("MainActivity:onResume()方法执行了,我获得焦点了");}@Overrideprotected void onRestart() {super.onRestart();System.out.println("MainActivity:onRestart()方法执行了,用户重启界面了");}@Overrideprotected void onPause() {super.onPause();System.out.println("MainActivity:onPause()方法执行了,我失去焦点了");}@Overrideprotected void onStop() {super.onStop();System.out.println("MainActivity:onStop()方法执行了,界面看不见了");}@Overrideprotected void onDestroy() {super.onDestroy();System.out.println("MainActivity:onDestroy()方法执行了,界面被销毁了");}//点击播放音乐按钮进行服务绑定public void click_music_open(View view) {Intent intentService = new Intent(MainActivity.this, AudioServiceOnBind.class);bindService(intentService, conn, Context.BIND_AUTO_CREATE);}//暂停播放音乐public void click_music_pause(View view) {audioServiceOnBind.pause();}//继续播放public void music_button_play(View view) {audioServiceOnBind.play();}//停止播放public void click_music_stop(View view) {unbindService(conn);}
}
(2)定义界面布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/fullwhite"android:orientation="vertical"tools:context=".MainActivity"tools:visibility="visible"><TextViewandroid:id="@+id/text_viwe"android:layout_width="match_parent"android:layout_height="50dp"android:layout_marginTop="40dp"android:gravity="center_horizontal"android:text="@string/activity"android:textSize="20sp"tools:ignore="MissingConstraints" /><Buttonandroid:id="@+id/music_button_open"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="50dp"android:layout_marginTop="30dp"android:layout_marginRight="50dp"android:onClick="click_music_open"android:text="播放音乐"tools:ignore="MissingConstraints" /><Buttonandroid:id="@+id/music_button_pause"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="50dp"android:layout_marginTop="30dp"android:layout_marginRight="50dp"android:onClick="click_music_pause"android:text="暂停播放"tools:ignore="MissingConstraints" /><Buttonandroid:id="@+id/music_button_play"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="50dp"android:layout_marginTop="30dp"android:layout_marginRight="50dp"android:onClick="music_button_play"android:text="继续播放"tools:ignore="MissingConstraints" /><Buttonandroid:id="@+id/music_button_stop"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="50dp"android:layout_marginTop="20dp"android:layout_marginRight="50dp"android:onClick="click_music_stop"android:text="停止播放"tools:ignore="MissingConstraints" /></LinearLayout>
源码资源连接:AndroidService组件实现后台音乐播放项目源码-Java文档类资源-CSDN下载
Android Service组件实现后台音乐播放相关推荐
- Android Service的使用方法 音乐播放器实例
Service翻译成中文是服务,熟悉Windows 系统的同学一定知道很熟悉了.Android里的Service跟Windows里的Service功能差不多,就是一个不可见的进程在后台执行,避免被用户 ...
- Android Service使用方法--简单音乐播放实例
Service翻译成中文是服务,熟悉Windows 系统的同学一定很熟悉了.Android里的Service跟Windows里的Service功能差不多,就是一个不可见的进程在后台执行. Androi ...
- Android学习之路4——音乐播放器后台播放
Android学习之路4--音乐播放器后台播放 一.实验题目 简单音乐播放器 二.实现内容 实现一个简单的播放器,要求功能有: 播放.暂停.停止.退出功能,按停止键会重置封面转角,进度条和播放按钮:按 ...
- Android Studio实现简单的音乐播放(播放、暂停、停止、上一首、下一首)
Android Studio实现简单的音乐播放(播放.暂停.停止.上一首.下一首) 简要介绍 采用Service组件实现后台播放,BroadcastReceiver实现消息传递.BroadcastRe ...
- Android课程设计大作业-音乐播放器
Android课程设计大作业-音乐播放器 一.**主要实现界面效果** 1)登录界面 2)音乐列表界面 3)音乐播放界面 二.**系统设计** 1)使用Service播放音乐 2) 前台界面(Acti ...
- Android应用--简、美音乐播放器原型放送(作者:小巫)
Android应用--简.美音乐播放器原型放送 2013年7月5日简.美音乐播放器开发 前言:小巫的简.美音乐播放器从5月7号开始开发,之前以为时间很充足,也没有估量整个软件的需求,如果简单实现基本的 ...
- Android应用--简、美音乐播放器获取专辑图片(自定义列表适配器)
Android应用--简.美音乐播放器获取专辑图片(自定义列表适配器) 2013年7月3日简.美音乐播放器开发 第二阶段已增加功能: 1.歌词滚动显示 2.来电监听 3.音量控制 4.左右滑动切换歌词 ...
- 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能...
原文:与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 [源码下载] 与众不同 windows phone (40 ...
- Android应用--简、美音乐播放器增加音量控制
Android应用--简.美音乐播放器增加音量控制 2013年6月26日简.美音乐播放器继续完善中.. 题外话:上一篇博客是在6月11号发的,那篇博客似乎有点问题,可能是因为代码结构有点乱的原因,很难 ...
最新文章
- GitHub上7000+ Star的Python常用代码合集
- 快速失败Vs安全失败(Java迭代器附示例)
- 常见的排序算法(1)
- android与php使用base64加密的字符串结果不一样解决方法
- python docx 表格打印不显示_python-docx 设置 word 文档中表格格式
- Android Framework 全面分析 SystemServer
- Windows Phone笔记(5)加速计和位置服务(转)
- 医疗病案首页网上直报编码汇总
- Cannot execute binary file 之原因
- 关于爬网易云音乐时使用fiddler调试JS遇到的问题?
- heapdump file must have .hprof extention
- 引进国外SD-WAN技术,凌锐蓝信为企业提供跨境网络连接服务
- lol网通区服务器的位置,LOL英雄联盟转区系统地址在哪?
- 2019 HZNU Winter Training Day 13 Comprehensive Training
- linux发行版中的i386/i686/x86-64/有什么区别?
- 提交form表单方法
- 郭彦甫Matlab第五节笔记——进阶绘图
- python爬虫遇到验证码、输入验证码后提醒验证码错误_爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别...
- 大数据入门(Hadoop生态系统)
- Alook搭配JS脚本完美食用