本文通过播放背景音乐的简单示例,演示startService的基本使用流程,具体内容如下

系统界面如下:

界面上面就两个按钮,”播放音乐并退出Activity” 和 “停止播放音乐”。我们在该示例中,通过操纵Activity的按钮控制MusicService播放或停止播放音乐。

我将一个名为music.mp3的放到资源目录/res/raw文件夹下面,这样我们在程序中就可以通过R.raw.music引用该音乐文件,放入/res/raw文件夹中的资源文件会保持原来的面貌不会被编译成二进制。

MusicService是用于播放背景音乐的Service,其代码如下所示:

package com.ispring.startservicedemo;

import android.app.Service;

import android.content.Intent;

import android.media.MediaPlayer;

import android.os.IBinder;

import android.widget.Toast;

import java.io.IOException;

public class MusicService extends Service {

private MediaPlayer mediaPlayer = null;

private boolean isReady = false;

@Override

public void onCreate() {

//onCreate在Service的生命周期中只会调用一次

super.onCreate();

//初始化媒体播放器

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

if(mediaPlayer == null){

return;

}

mediaPlayer.stop();

mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {

@Override

public boolean onError(MediaPlayer mp, int what, int extra) {

mp.release();

stopSelf();

return false;

}

});

try{

mediaPlayer.prepare();

isReady = true;

} catch (IOException e) {

e.printStackTrace();

isReady = false;

}

if(isReady){

//将背景音乐设置为循环播放

mediaPlayer.setLooping(true);

}

}

@Override

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

//每次调用Context的startService都会触发onStartCommand回调方法

//所以onStartCommand在Service的生命周期中可能会被调用多次

if(isReady && !mediaPlayer.isPlaying()){

//播放背景音乐

mediaPlayer.start();

Toast.makeText(this, "开始播放背景音乐", Toast.LENGTH_LONG).show();

}

return START_STICKY;

}

@Override

public IBinder onBind(Intent intent) {

//该Service中不支持bindService方法,所以此处直接返回null

return null;

}

@Override

public void onDestroy() {

//当调用Context的stopService或Service内部执行stopSelf方法时就会触发onDestroy回调方法

super.onDestroy();

if(mediaPlayer != null){

if(mediaPlayer.isPlaying()){

//停止播放音乐

mediaPlayer.stop();

}

//释放媒体播放器资源

mediaPlayer.release();

Toast.makeText(this, "停止播放背景音乐", Toast.LENGTH_LONG).show();

}

}

}

MusicActivity的代码如下所示:

package com.ispring.startservicedemo;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

public class MusicActivity extends Activity implements Button.OnClickListener {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_music);

}

@Override

public void onClick(View v) {

if(v.getId() == R.id.btnStart){

//播放背景音乐

Intent intent = new Intent(this, MusicService.class);

startService(intent);

//退出当前Activity

this.finish();

}else if(v.getId() == R.id.btnStop){

//停止播放音乐

Intent intent = new Intent(this, MusicService.class);

stopService(intent);

}

}

}

当我们单击了按钮”播放音乐并退出Activity”之后,我们首先通过Activity的startService启动MusicService,然后我们立即调用了Activity的finish方法销毁了当前的Activity。可能大家会问为什么要销毁当前的Activity?我们此处之所以调用Activity的finish方法不是从功能的角度出发的,而是从理解代码运行的角度故意这么写的: 执行完Activity的finish方法之后,当前的Activity就销毁了, 在界面上看起来就是当前UI消失了,应用程序退出了,但稍等片刻你会听到背景音乐响起。这从侧面印证了Service的一个特性: Service与Activity等一样,也是一种基本的应用程序组件,Service无需依赖任何的Activity便可独自在没有任何UI界面的情况下悠闲地在Android后台默默运行。

调用了startService之后,Android Framework接收到了intent信息,第一次会先创建MusicService的实例,执行MusicService的onCreate回调方法,onCreate在Service的生命周期中只会调用一次,我们在其onCreate方法中将R.raw.music初始化为媒体播放器,并调用媒体播放器的prepare方法。然后我们将播放器设置为循环播放状态。需要注意的是,在实际生产环境中,我们应该注册播放器的setOnPreparedListener并调用prepareAsync()方法,为了简化代码起见,我们只调用了播放器的同步方法prepare()。

调用了onCreate方法后,Android会自动回调其onStartCommand方法,其实每次调用Context的startService都会触发onStartCommand回调方法,所以onStartCommand在Service的生命周期中可能会被调用多次。所以我们在MusicService的onStartCommand中做了判断,判断播放器是否是在播放中,如果当前播放器没有播放我们才调用播放器的start方法播放背景音乐。

当我们单击了按钮”播放音乐并退出Activity”之后,MusicService启动起来,播放背景音乐,但是Activity却销毁了,程序的UI界面不见了。为了能够停止播放背景音乐,我们需要再次单击应用程序图标,重新打开MusicActivity,然后单击界面上的”停止播放音乐”按钮,此时我们会调用Activity的stopService方法,Android Framework接收到要停止服务的intent之后会回调MusicService的onDestroy方法,在该方法中我们停止播放音乐并释放媒体播放器资源。

本文只是通过播放背景音乐这一简单示例演示通过startService启动Service基本使用流程,代码没有进行优化,希望对大家学习Service有所帮助。

android播放背景音乐,Android通过startService播放背景音乐相关推荐

  1. MusicPlayer音乐播放器Android

    MusicPlayer音乐播放器Android [音频采集] 你可以使用手机进行现场录音,实现步骤如下: 第一步:在功能清单文件AndroidManifest.xml中添加音频刻录权限: <us ...

  2. Android生日礼物(含拼图游戏,背景音乐,自动拨号等功能实现)--根据代码规范修改注释以及定义

    公司培训了编码规范,回头过来看看我以前写过的代码,着实比较烂,缺少必要的注释,以及对于变量名的定义也不甚规范,故借着此次学习,我重新整理下一篇安卓项目的文章,规范下代码,可以用doxygen生成htm ...

  3. android中服务播放音乐,android中用Service播放音乐

    一般的Android应用程序的音乐可以分为背景音乐和点击各种控件时的音效,前者一般为比较大的音乐文件,后者一般为比较小的音乐.在Android中一般用MediaPlayer类处理比较大的音频文件,用S ...

  4. Android Service的使用方法 音乐播放器实例

    Service翻译成中文是服务,熟悉Windows 系统的同学一定知道很熟悉了.Android里的Service跟Windows里的Service功能差不多,就是一个不可见的进程在后台执行,避免被用户 ...

  5. Android Service使用方法--简单音乐播放实例

    Service翻译成中文是服务,熟悉Windows 系统的同学一定很熟悉了.Android里的Service跟Windows里的Service功能差不多,就是一个不可见的进程在后台执行. Androi ...

  6. android后台自播放音乐,Android实现后台播放音乐(Service方式)

    Android实现后台播放音乐(Service方式) 实现: 在res文件夹下添加raw文件夹,添加mp3/4格式的音乐文件 注意命名规则只能是a-z,0-9,和下划线_ 不能大写字母和- Andro ...

  7. Android应用--简、美音乐播放器原型放送(作者:小巫)

    Android应用--简.美音乐播放器原型放送 2013年7月5日简.美音乐播放器开发 前言:小巫的简.美音乐播放器从5月7号开始开发,之前以为时间很充足,也没有估量整个软件的需求,如果简单实现基本的 ...

  8. 【Android】利用WindowsManager悬浮窗播放本地视频以及下载线上视频保存在本地

    基于目前又重新拾起了分屏的项目需求,对之前研究的分屏播放视频做了更深入的研究.在之前的基础上做了改进和用户优化上的处理,实现了原生的VideoView加载本地视频.并使用FileDownLoader下 ...

  9. Android Service组件实现后台音乐播放

    源码在最后哦! 一.Service组件介绍 1.Service Service它可以在后台执行长时间运行操作而没有用户界面的应用组件,不依赖任何用户界面,例如后台播放音乐,后台下载文件等. 虽然服务是 ...

最新文章

  1. python-冒泡排序
  2. python常用单词下载_python编程词汇
  3. ubuntu修改mysql root密码_Ubuntu 下修改mysqlroot密码
  4. Java-File-文件操作
  5. doctor mysql数据导入_线上环境mysql主从同步的搭建过程
  6. abaqus失效单元删除_[转载]abaqus单元删除的一般方法
  7. 洛谷 P3373 【模板】线段树 2 解题报告
  8. ngRoute (angular-route.js) 和 ui-router (angular-ui-router.js) 模块有什么不同呢?
  9. Eclipse切换IDE界面语言
  10. symantec BESR 异机恢复
  11. 把live2D模型放上网页
  12. 怎么用计算机画画图片,电脑的画图工具怎么用
  13. 超声波模块工作原理分析及程序
  14. 如何寻找logo创意灵感?推荐这8个设计灵感网站
  15. stc12c5a60s2单片机c语言,STC12C5A60S2单片机的DS18B20的C程序
  16. 九种linux查询日志命令总结
  17. Unity 代码修改宏名并一键打包
  18. 带有反斜杠的字符串如何转json对象
  19. ERP期末复习知识点
  20. 云网融合与算力网络系列文章

热门文章

  1. 201412-1-门禁系统
  2. 计算机的视觉应用研究,计算机视觉技术应用研究.doc
  3. 【数据结构笔记29】最小生成树问题:Prim算法与Kruskal算法
  4. java中反复使用代码_Java代码复用规则
  5. php二叉排序树,二叉排序树(建树)
  6. assert.h库学习
  7. storyboard用代码跳转
  8. java处理pdf文件——iText的使用
  9. 求杨辉三角的前n行数据_两道简单的套公式算法题:杨辉三角
  10. 易混单词 expect VS except