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

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

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

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

[java] view plaincopy
[java] view plaincopy
  1. import android.app.Service;
  2. import android.content.Intent;
  3. import android.os.IBinder;
  4. public class yypService extends Service {
  5. @Override
  6. public IBinder onBind(Intent intent) {
  7. // TODO Auto-generated method stub
  8. return null;
  9. }
  10. }

yypService 类继承 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的具体实现:

[java] view plaincopy
  1. package com.android;
  2. import java.io.IOException;
  3. import android.app.Service;
  4. import android.content.Intent;
  5. import android.media.MediaPlayer;
  6. import android.os.IBinder;
  7. public class yypService extends Service {
  8. private MediaPlayer mp;
  9. @Override
  10. public void onStart(Intent intent, int startId) {
  11. // TODO Auto-generated method stub
  12. // 开始播放音乐
  13. mp.start();
  14. // 音乐播放完毕的事件处理
  15. mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
  16. public void onCompletion(MediaPlayer mp) {
  17. // TODO Auto-generated method stub
  18. // 循环播放
  19. try {
  20. mp.start();
  21. } catch (IllegalStateException e) {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. }
  25. }
  26. });
  27. // 播放音乐时发生错误的事件处理
  28. mp.setOnErrorListener(new MediaPlayer.OnErrorListener() {
  29. public boolean onError(MediaPlayer mp, int what, int extra) {
  30. // TODO Auto-generated method stub
  31. // 释放资源
  32. try {
  33. mp.release();
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. return false;
  38. }
  39. });
  40. super.onStart(intent, startId);
  41. }
  42. @Override
  43. public void onCreate() {
  44. // TODO Auto-generated method stub
  45. // 初始化音乐资源
  46. try {
  47. // 创建MediaPlayer对象
  48. mp = new MediaPlayer();
  49. // 将音乐保存在res/raw/xingshu.mp3,R.java中自动生成{public static final int xingshu=0x7f040000;}
  50. mp = MediaPlayer.create(yypService.this, R.raw.xingshu);
  51. // 在MediaPlayer取得播放资源与stop()之后要准备PlayBack的状态前一定要使用MediaPlayer.prepeare()
  52. mp.prepare();
  53. } catch (IllegalStateException e) {
  54. // TODO Auto-generated catch block
  55. e.printStackTrace();
  56. } catch (IOException e) {
  57. // TODO Auto-generated catch block
  58. e.printStackTrace();
  59. }
  60. super.onCreate();
  61. }
  62. @Override
  63. public void onDestroy() {
  64. // TODO Auto-generated method stub
  65. // 服务停止时停止播放音乐并释放资源
  66. mp.stop();
  67. mp.release();
  68. super.onDestroy();
  69. }
  70. @Override
  71. public IBinder onBind(Intent intent) {
  72. // TODO Auto-generated method stub
  73. return null;
  74. }
  75. }

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

修改 AndroidManifest.xml

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

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.android"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk android:minSdkVersion="10" />
  7. <application
  8. android:icon="@drawable/ic_launcher"
  9. android:label="@string/app_name" >
  10. <activity
  11. android:name=".WebTestActivity"
  12. android:label="@string/app_name" >
  13. <intent-filter>
  14. <action android:name="android.intent.action.MAIN" />
  15. <category android:name="android.intent.category.LAUNCHER" />
  16. </intent-filter>
  17. </activity>
  18. <service
  19. android:name=".yypService"
  20. android:exported="true"
  21. android:process=":remote">
  22. </service>
  23. </application>
  24. </manifest>

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

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

[java] view plaincopy
  1. Intent intent = new Intent(WebTestActivity.this,yypService.class);
  2. startService(intent);

Activity 类里有一个 method 叫做 startService:

startService(Intent service)

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

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

[java] view plaincopy
  1. @Override
  2. protected void onStop() {
  3. // TODO Auto-generated method stub
  4. Intent intent = new Intent(WebTestActivity.this,yypService.class);
  5. stopService(intent);
  6. super.onStop();
  7. }

备注:eclipse的使用小技巧,快速补全重载代码(快捷键Alt+Shift+s ->  Override/implement Mothods)。至此,一个完整的播放背景音乐功能已经全部完成。

android 服务的应用,在Activity中实现背景音乐播放相关推荐

  1. android adapter点击事件,Activity中响应Adapter的点击回调事件

    假设一个场景,在ListView的Item中,点击"+"按钮加入该item的商品到购物车中.给予的解决方案是: 在Adapter中定义一个回调接口,在Activity中实现该接口, ...

  2. android服务下载,android服务之bindService和unService中下载任务中的应用

    通过bindService方法来调用服务final Down down = data; viewHolder.videoActionBtn.setOnClickListener(new View.On ...

  3. Android之解决在非Activity中使用startActivity

    今天遇到一个问题就是,如何在非activity里面使用startActivity(); 解决办法如下. 需要我们有context intent.addFlags(Intent.FLAG_ACTIVIT ...

  4. Notification使用详解之三:通过服务更新进度通知在Activity中监听服务进度

    为什么80%的码农都做不了架构师?>>>    上次我们讲到如何实现一个可更新的进度通知,实现的方式是启动一个线程模拟一个下载任务,然后根据任务进度向UI线程消息队列发送进度消息,U ...

  5. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

  6. activity中获取fragment布局_安卓开发入门教程Fragment

    什么是Fragment Activity是整个看到的界面,而Activity则可以继续分割出多个Fragment. Fragment最初是为了在平板电脑充分利用空间,但是手机端也经常使用,主要目的是共 ...

  7. Cocos2d-JS 中游戏背景音乐与音效

    游戏中音频的处理也是非常重要的,它分为背景音乐播放与音效播放. 背景音乐是长时间循环播放的,它会长时间占用较大的内存,背景音乐不能多个同时播放. 而音效是短的声音,它占用内存较小,音效能多个同时播放. ...

  8. Android应用程序窗口(Activity)与WindowManagerService服务的连接过程分析

    在前两文中,我们分析了Activity组件的窗口对象和视图对象的创建过程.Activity组件在其窗口对象和视图对象创建完成之后,就会请求与WindowManagerService建立一个连接,即请求 ...

  9. Android筑基——Activity的启动过程之同进程在一个Activity中启动另一个Activity(基于api21)

    目录 1. 前言 2. 正文 2.1 Activity类的startActivity()方法 2.2 Instrumentation类的execStartActivity()方法 2.3 Activi ...

最新文章

  1. 完全理解 Python 迭代对象、迭代器、生成器(转)
  2. kotlin与java对比
  3. python简单可视化聊天界面_如何用Python制作可视化输入界面
  4. 域控 批量导入 用户_kerberos域用户提权分析
  5. nginx 配置笔记
  6. 面向视频原生,火山引擎发布视频云与边缘云软硬一体的新云解决方案
  7. 在Brackets中使用jsHint遇到的问题
  8. 20145318赵一《网络对抗》后门原理与实践
  9. vue 3D旋转木马轮播图
  10. jquery获取元素的索引_如何在jQuery中获取具有特定索引的元素
  11. 响应式Web设计:HTML5和CSS3实战 笔记
  12. 微型计算机硬件认识和拆装,微型计算机系统硬件组成及外设认识.doc
  13. 数据库学生管理系统课程设计
  14. java中的undefined_undefined是什么意思啊?
  15. 定期报告系统服务器出错 1,做好Web服务器的日常维护必备常识
  16. 计算机的硬盘 u盘启动,设置U盘启动和硬盘启动两种差别教程步骤
  17. npm修改全局安装默认路径(C:\Users\Administrator\AppData\Roaming\npm\node_modules)
  18. 圣帕特里克 VoxEdit 大赛
  19. notify()会立刻释放锁么?
  20. uni-app如何让图片高度自适应

热门文章

  1. how can we make them work together efficiently?
  2. 【转】光栅化操作阶段
  3. ETC2 区别于ETC的重要点
  4. UNITY Profiler 真机调试
  5. 阿里云总裁胡晓明:保护客户数据隐私是阿里云第一原则
  6. HTTP referer/HTTP referrer
  7. 51`CTO下载中心——我的新爱
  8. UBOOT 2011-3版本分析(初步感受)
  9. Android2.2 r1 API 中文文档系列(10) —— CheckBox
  10. nyoj904 search