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

来源:互联网 发布:基于python的量化投资 编辑:程序博客网 时间:2024/05/18 20:52

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

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

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

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

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

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

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

修改 AndroidManifest.xml

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

[html] view plain copy
  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.   
  7.     <uses-sdk android:minSdkVersion="10" />  
  8.   
  9.     <application  
  10.         android:icon="@drawable/ic_launcher"  
  11.         android:label="@string/app_name" >  
  12.         <activity  
  13.             android:name=".WebTestActivity"  
  14.             android:label="@string/app_name" >  
  15.             <intent-filter>  
  16.                 <action android:name="android.intent.action.MAIN" />  
  17.   
  18.                 <category android:name="android.intent.category.LAUNCHER" />  
  19.             </intent-filter>  
  20.         </activity>  
  21.         <service  
  22.             android:name=".yypService"  
  23.             android:exported="true"  
  24.             android:process=":remote">  
  25.               
  26.         </service>  
  27.           
  28.     </application>  
  29.   
  30. </manifest>  

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

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

[java] view plain copy
  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 plain copy
  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)。至此,一个完整的播放背景音乐功能已经全部完成。
阅读全文
0 0
原创粉丝点击