1. 在android应用程序里,有一种没有UI的类(android.app.Service)——Service。简单来说,Service是一个 background process(背景程序),通过背景程序,可以实现一些不需要UI的功能,比如播放背景音乐。

下面是一个实现播放背景音乐的例程:

在上个工程的基础上,在Activity中添加音乐播放功能。

在工程中添加一个新类 VoiceService (File->New->Class):

import android.app.Service;
import android.content.Intent;
import android.os.IBinder; public class MyService extends Service { @Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
} }

MyService 类继承 android.app.Service,几个有关Service 的重要概念如下:

1)Service 对象以 separated process (单独的线程)的方式执行,这表示 Service 与 UI(Activity)并不在同一个 process 里执行,而是各自在不同的 process 执行。

2)Android应用程序是在 Activity 启动与停止 Service。

3)重载(override)onStart() 方法(method)在 Service 被启动,执行我们想要的背景功能。

4)重载 onDestroy() 方法在 Service 被停止时,停止执行中的背景功能。

下面是Service的具体实现:

package com.himi.game2048;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.os.IBinder; public class VoiceService extends Service {
private MediaPlayer mp; @Override
public void onCreate() {
// 初始化音乐资源
try {
mp = MediaPlayer.create(this, R.raw.play_music);
mp.prepare();
} catch (IllegalStateException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
super.onCreate(); } @Override
public void onStart(Intent intent, int startId) {
// TODO 自动生成的方法存根
//开始播放音乐
if(mp != null) {
mp.start();
//注册回调函数,音乐播放完毕之后,音乐播放完毕的事件处理
mp.setOnCompletionListener(new OnCompletionListener() { public void onCompletion(MediaPlayer mp) {
try {
mp.start();
} catch (IllegalStateException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} }
}); mp.setOnErrorListener(new OnErrorListener() { public boolean onError(MediaPlayer mp, int what, int extra) {
try {
mp.release();
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return false;
}
}); } super.onStart(intent, startId);
} @Override
public void onDestroy() {
// 服务停止时停止播放器并且释放资源
if (mp != null) {
mp.stop();
mp.release();
}
super.onDestroy();
} @Override
public IBinder onBind(Intent intent) {
// TODO 自动生成的方法存根
return null;
} }

至此,一个完整的服务生成,接下来是在Activity中启动服务。

 

2. 修改 AndroidManifest.xml

在 Package Explorer 视窗里找到目前 Android 项目的资讯描述档,名称为 AndroidManifest.xml。这是一个用來描述 Android 应用程序「整体资讯」的文件,每个 Android 应用程序项目都会有一个。在这里修改 Androidmanifest.xml 的目的是为了「 Android 应用程序加入一个 Service 类别」,这样才有办法驱动 Service。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.himi.game2048"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="17" /> <application
android:allowBackup="true"
android:icon="@drawable/pciture"
android:label="@string/app_name"
android:theme="@style/AppTheme" > <!-- android:screenOrientation="portrait"手机屏幕是直立的,不会水平放置 -->
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <service
android:name="com.himi.game2048.VoiceService"
android:exported="true"
android:process=":remote" >
</service>
</application> </manifest>

android:exported:

这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。

如果设置为true,则能够被调用或交互,否则不能。

如果设置为false,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。

android:process:

(1)如果不设置android:process,则activity和service属于同一进程。

(2)如果设置android:process=":remote" 表示在当前应用里,创建一个进程。

(3)如果设置android:process=".remote"   表示创建一个全局的独立进程。不同的应用程序共享该进程。

3. 配置好之后,接下来就是在Activity中添加启动服务代码 Service - startService()。

在OnCreate()中添加如下代码:

 Intent intent = new Intent(WebTestActivity.this,yypService.class);
startService(intent);

Activity 类里有一个 method 叫做 startService:

startService(Intent service)

调用 startService() 即可启动一个 Service ,只是,startService() 的参数是一个「Intent」型,并不是所要启动的类名。「Intent」是一个很像「Event」的类,暂时还没对Intent做深入研究,就先把它当作一个"Event"看吧?

现在,其实已经可以在Activity中播放背景音乐了,但有一个小问题,就是Activity已经被挂起或是被销毁时,背景音乐还是在继续播放的,这也说明Service与Activity是两个不同的进程,我们收下尾,让Activity在OnStop时把背景音乐也停止播放,重载Activity的OnStop:

    @Override
protected void onStop() {
// TODO Auto-generated method stub
Intent intent = new Intent(GameActivity.this,VoiceService.class);
stopService(intent);
super.onStop();
}

Android(java)学习笔记181:利用Service在后台播放背景音乐的更多相关文章

  1. Android(java)学习笔记124:利用Service在后台播放背景音乐

    1. 在android应用程序里,有一种没有UI的类(android.app.Service)——Service.简单来说,Service是一个 background process(背景程序),通过 ...

  2. Android多媒体学习六:利用Service实现背景音乐的播放

    Android同意我们使用Service组件来完毕后台任务.这些任务的同意不会影响到用户其它的交互. 1.Activity类 [java] view plaincopy package demo.ca ...

  3. Java学习笔记之[ 利用扫描仪Scanner进行数据输入 ]

    /*********数据的输入********//**利用扫描仪Scanner进行数据输入 怎么使用扫描仪Scanner *1.放在类声明之前,引入扫描仪 import java.util.Scann ...

  4. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  5. 20145330第九周《Java学习笔记》

    20145330第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JD ...

  6. Android 数字签名学习笔记

    Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...

  7. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  8. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  9. 20155234 2610-2017-2第九周《Java学习笔记》学习总结

    20155234第九周<Java学习笔记>学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC(Ja ...

随机推荐

  1. 【HDU 4372】 Count the Buildings (第一类斯特林数)

    Count the Buildings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  2. 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)

    dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...

  3. 在使用Ibatis查询数据返回时,报如下错误:java ibatis The error happened while setting a property on the result object

    问题: 在使用Ibatis查询数据返回时,报如下错误: [com.show.add.proxy.SqlMapClientTemplateProxy]com.ibatis.common.jdbc.exc ...

  4. Multiplication Puzzle

    题目大致意思是:一个整数序列包含N个1~100的整数(3<=N<=100),从中取出一个数并和相邻两边的整数相乘,依次进行下去直到只剩下首尾两个数为止,求最终的得到的和的最小值.两边的数不 ...

  5. mysql 区间锁 对于没有索引 非唯一索引 唯一索引 各种情况

    The locks are normally next-key locks that also block inserts into the "gap" immediately b ...

  6. oracle core04_undo

    undo信息 oracle中undo的信息主要完成下面的功能: 1,构建块一致性读 2,回滚事务 UBA:undo block address 1,块中的事务槽ITL中的UBA表示这个ITL所在的bl ...

  7. POJ_1631_Bridging_Signals_(动态规划,LIS)

    描述 http://poj.org/problem?id=1631 铁路左右相连,要求去掉一些边,使得剩下的边不交叉,求剩余边数的最大值. Bridging signals Time Limit: 1 ...

  8. 杨佩昌:中国官员去德国考察看什么两眼发光 z

    令中国人诧异的德国物价 只要是花费大量人工的行业,就很贵 □杨佩昌 德国是欧洲商品价格的洼地,连精明的瑞士人也开车到德国加油购物 一 2012年凤凰网组织十大著名博主前往澳洲考察并与前总理陆克文对话, ...

  9. [LeetCode] 3. Longest Substring Without Repeating Characters 解题思路

    Given a string, find the length of the longest substring without repeating characters. For example, ...

  10. 一段SQL代码的压缩:从974行到96行,十倍压缩

    涉及到数据库拆分,需要将相关表的JOIN SQL剥离. 剥离过程中,发现了这么个SQL XML.整个SQL 974 行,分为6个函数.读起来费劲无比. <?xml version="1 ...