标签:
在android应用程序里,有一种没有UI的类(android.app.Service)——Service。简单来说,Service是一个 background process(背景程序),通过背景程序,可以实现一些不需要UI的功能,比如播放背景音乐。
1 <strong>1、Activity类 2 [java] 3 </strong> <pre name="code" class="html">package demo.camera;
1 /** * 演示Activity如何利用Service来完成后台Audio的播放功能 * 同时如何将Service和Activity进行绑定 * @author Administrator * */
public class BackgroundAudioDemo extends Activity { private AudioService audioService;
//使用ServiceConnection来监听Service状态的变化 private ServiceConnection conn = new ServiceConnection()
{ @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub audioService = null; }
@Override public void onServiceConnected(ComponentName name, IBinder binder)
{ //这里我们实例化audioService,通过binder来实现 audioService = ((AudioService.AudioBinder)binder).getService(); } };
public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.back_audio);
}
public void onClick(View v){ int id = v.getId(); Intent intent = new Intent();
intent.setClass(this, AudioService.class); if(id == R.id.btn_start){
//启动Service,然后绑定该Service,这样我们可以在同时销毁该Activity,看看歌曲是否还在播放 startService(intent);
bindService(intent, conn, Context.BIND_AUTO_CREATE); finish();
}else if(id == R.id.btn_end){ //结束Service unbindService(conn);
stopService(intent); finish(); }else if(id == R.id.btn_fun){ audioService.haveFun(); } } }
1 <strong>新建一个AudioService 类,<span style="font-family: Arial, Helvetica, sans-serif;">AudioService 类</span><span style="font-family: Arial, Helvetica, sans-serif;">继承 android.app.Service,几个有关Service 的重要概念如下:</span> 2 3 1. Service 对象以 separated process 的方式执行,这表示 Service 与 UI(Activity)并不在同一个 process 里执行,而是各自在不同的 process 执行。 4 5 2. Android应用程序是在 Activity 启动与停止 Service。 6 7 3. 重载(override)onStart() 方法(method)在 Service 被启动,执行我们想要的背景功能。 8 9 4. 重载 onDestroy() 方法在 Service 被停止时,停止执行中的背景功能。</strong>
1 <pre name="code" class="html"><strong>2、AudioService类 2 [java] </strong> 3 package demo.camera; 4 import android.app.Service; 5 import android.content.Intent; 6 import android.media.MediaPlayer; 7 import android.os.Binder; 8 import android.os.IBinder; 9 import android.widget.MediaController.MediaPlayerControl; 10 /** 11 * 为了可以使得在后台播放音乐,我们需要Service 12 * Service就是用来在后台完成一些不需要和用户交互的动作 13 * @author Administrator 14 * 15 */ 16 public class AudioService extends Service implements MediaPlayer.OnCompletionListener{ 17 18 MediaPlayer player; 19 20 private final IBinder binder = new AudioBinder(); 21 @Override 22 public IBinder onBind(Intent arg0) { 23 // TODO Auto-generated method stub 24 return binder; 25 } 26 /** 27 * 当Audio播放完的时候触发该动作 28 */ 29 @Override 30 public void onCompletion(MediaPlayer player) { 31 // TODO Auto-generated method stub 32 stopSelf();//结束了,则结束Service 33 } 34 35 //在这里我们需要实例化MediaPlayer对象 36 public void onCreate(){ 37 super.onCreate(); 38 //我们从raw文件夹中获取一个应用自带的mp3文件 39 player = MediaPlayer.create(this, R.raw.eason); 40 player.setOnCompletionListener(this); 41 } 42 43 /** 44 * 该方法在SDK2.0才开始有的,替代原来的onStart方法 45 */ 46 public int onStartCommand(Intent intent, int flags, int startId){ 47 if(!player.isPlaying()){ 48 player.start(); 49 } 50 return START_STICKY; 51 } 52 53 public void onDestroy(){ 54 //super.onDestroy(); 55 if(player.isPlaying()){ 56 player.stop(); 57 } 58 player.release(); 59 } 60 61 //为了和Activity交互,我们需要定义一个Binder对象 62 class AudioBinder extends Binder{ 63 64 //返回Service对象 65 AudioService getService(){ 66 return AudioService.this; 67 } 68 } 69 70 //后退播放进度 71 public void haveFun(){ 72 if(player.isPlaying() && player.getCurrentPosition()>2500){ 73 player.seekTo(player.getCurrentPosition()-2500); 74 } 75 } 76 }
<pre name="code" class="html">至此,一个完整的服务生成,接下来是在Activity中启动服务。 <strong>修改 AndroidManifest.xml:
在 Package Explorer 视窗里找到目前 Android 项目的资讯描述档,名称为 AndroidManifest.xml。这是一个用來描述 Android 应用程序「整体资讯」的文件,每个 Android 应用程序项目都会有一个。在这里修改 Androidmanifest.xml 的目的是为了「 Android 应用程序加入一个 Service 类别」,这样才有办法驱动 Service。</strong> [html]
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 <pre name="code" class="html"> android:name=".AudioService"
标签:
原文地址:http://www.cnblogs.com/zhiai1314/p/4620327.html