Android多媒体--利用Service实现背景音乐的播放

From:http://blog.csdn.net/chenjie19891104/article/details/6330720

 

Android允许我们使用Service组件来完成后台任务,这些任务的允许不会影响到用户其他的交互。

 

1、Activity类

[java] view plain copy print ?
  1. package demo.camera;  
  2. import android.app.Activity;  
  3. import android.content.ComponentName;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.content.ServiceConnection;  
  7. import android.os.Bundle;  
  8. import android.os.IBinder;  
  9. import android.view.View;  
  10. /** 
  11.  * 演示Activity如何利用Service来完成后台Audio的播放功能 
  12.  * 同时如何将Service和Activity进行绑定 
  13.  * @author Administrator 
  14.  * 
  15.  */  
  16. public class BackgroundAudioDemo extends Activity {  
  17.       
  18.     private AudioService audioService;  
  19.       
  20.     //使用ServiceConnection来监听Service状态的变化   
  21.     private ServiceConnection conn = new ServiceConnection() {  
  22.           
  23.         @Override  
  24.         public void onServiceDisconnected(ComponentName name) {  
  25.             // TODO Auto-generated method stub   
  26.             audioService = null;  
  27.         }  
  28.           
  29.         @Override  
  30.         public void onServiceConnected(ComponentName name, IBinder binder) {  
  31.             //这里我们实例化audioService,通过binder来实现   
  32.             audioService = ((AudioService.AudioBinder)binder).getService();  
  33.               
  34.         }  
  35.     };  
  36.       
  37.     public void onCreate(Bundle savedInstanceState){  
  38.         super.onCreate(savedInstanceState);  
  39.         setContentView(R.layout.back_audio);  
  40.     }  
  41.       
  42.       
  43.     public void onClick(View v){  
  44.         int id = v.getId();  
  45.         Intent intent = new Intent();  
  46.         intent.setClass(this, AudioService.class);        
  47.         if(id == R.id.btn_start){  
  48.             //启动Service,然后绑定该Service,这样我们可以在同时销毁该Activity,看看歌曲是否还在播放   
  49.             startService(intent);  
  50.             bindService(intent, conn, Context.BIND_AUTO_CREATE);  
  51.             finish();  
  52.         }else if(id == R.id.btn_end){  
  53.             //结束Service   
  54.             unbindService(conn);  
  55.             stopService(intent);  
  56.             finish();  
  57.         }else if(id == R.id.btn_fun){  
  58.             audioService.haveFun();  
  59.         }  
  60.     }  
  61. }  

package demo.camera; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.view.View; /** * 演示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(); } } }

2、Service类

[java] view plain copy print ?
  1. package demo.camera;  
  2. import android.app.Service;  
  3. import android.content.Intent;  
  4. import android.media.MediaPlayer;  
  5. import android.os.Binder;  
  6. import android.os.IBinder;  
  7. import android.widget.MediaController.MediaPlayerControl;  
  8. /** 
  9.  * 为了可以使得在后台播放音乐,我们需要Service 
  10.  * Service就是用来在后台完成一些不需要和用户交互的动作 
  11.  * @author Administrator 
  12.  * 
  13.  */  
  14. public class AudioService extends Service implements MediaPlayer.OnCompletionListener{  
  15.       
  16.     MediaPlayer player;  
  17.       
  18.     private final IBinder binder = new AudioBinder();  
  19.     @Override  
  20.     public IBinder onBind(Intent arg0) {  
  21.         // TODO Auto-generated method stub   
  22.         return binder;  
  23.     }  
  24.     /** 
  25.      * 当Audio播放完的时候触发该动作 
  26.      */  
  27.     @Override  
  28.     public void onCompletion(MediaPlayer player) {  
  29.         // TODO Auto-generated method stub   
  30.         stopSelf();//结束了,则结束Service   
  31.     }  
  32.       
  33.     //在这里我们需要实例化MediaPlayer对象   
  34.     public void onCreate(){  
  35.         super.onCreate();  
  36.         //我们从raw文件夹中获取一个应用自带的mp3文件   
  37.         player = MediaPlayer.create(this, R.raw.tt);  
  38.         player.setOnCompletionListener(this);  
  39.     }  
  40.       
  41.     /** 
  42.      * 该方法在SDK2.0才开始有的,替代原来的onStart方法 
  43.      */  
  44.     public int onStartCommand(Intent intent, int flags, int startId){  
  45.         if(!player.isPlaying()){  
  46.             player.start();  
  47.         }  
  48.         return START_STICKY;  
  49.     }  
  50.       
  51.     public void onDestroy(){  
  52.         //super.onDestroy();   
  53.         if(player.isPlaying()){  
  54.             player.stop();  
  55.         }  
  56.         player.release();  
  57.     }  
  58.       
  59.     //为了和Activity交互,我们需要定义一个Binder对象   
  60.     class AudioBinder extends Binder{  
  61.           
  62.         //返回Service对象   
  63.         AudioService getService(){  
  64.             return AudioService.this;  
  65.         }  
  66.     }  
  67.       
  68.     //后退播放进度   
  69.     public void haveFun(){  
  70.         if(player.isPlaying() && player.getCurrentPosition()>2500){  
  71.             player.seekTo(player.getCurrentPosition()-2500);  
  72.         }  
  73.     }  
  74. }  

package demo.camera; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.Binder; import android.os.IBinder; import android.widget.MediaController.MediaPlayerControl; /** * 为了可以使得在后台播放音乐,我们需要Service * Service就是用来在后台完成一些不需要和用户交互的动作 * @author Administrator * */ public class AudioService extends Service implements MediaPlayer.OnCompletionListener{ MediaPlayer player; private final IBinder binder = new AudioBinder(); @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return binder; } /** * 当Audio播放完的时候触发该动作 */ @Override public void onCompletion(MediaPlayer player) { // TODO Auto-generated method stub stopSelf();//结束了,则结束Service } //在这里我们需要实例化MediaPlayer对象 public void onCreate(){ super.onCreate(); //我们从raw文件夹中获取一个应用自带的mp3文件 player = MediaPlayer.create(this, R.raw.tt); player.setOnCompletionListener(this); } /** * 该方法在SDK2.0才开始有的,替代原来的onStart方法 */ public int onStartCommand(Intent intent, int flags, int startId){ if(!player.isPlaying()){ player.start(); } return START_STICKY; } public void onDestroy(){ //super.onDestroy(); if(player.isPlaying()){ player.stop(); } player.release(); } //为了和Activity交互,我们需要定义一个Binder对象 class AudioBinder extends Binder{ //返回Service对象 AudioService getService(){ return AudioService.this; } } //后退播放进度 public void haveFun(){ if(player.isPlaying() && player.getCurrentPosition()>2500){ player.seekTo(player.getCurrentPosition()-2500); } } }

3、在清单文件AndroidManifest.xml中配置Service

 

        <service
            android:name=".AudioService" />

 

你可能感兴趣的:(android,android,media,Android开发,音乐,多媒体)