1、Service 音乐播放器实例Android 的服务组件继承于 android.app.Service 类,实现一个服务,只要继承android.app.Service 类,实现其生命周期中的关键方法并添加相应的服务功能就可以。像Activity 等组件一样,Service 也必须在 AndroidManifest.xml 中注册才能使用。下面通过实现一个音乐播放服务来说明 Service 的实现及其生命周期,该播放服务可以使用启动方式调用也可以使用绑定方式调用。音乐播放功能使用 android.media.MediaPlayer类来实现,该类提供了丰富的 API 接口用于实现音频、视频的播放
2、功能,下面先简单介绍用到的几个 MediaPlayer 类方法。 create(Context context, Uri uri) :通过 Uri 创建一个 MediaPlayer 对象 create(Context context, int resid):通过资源 ID 创建一个 MediaPlayer 对象 isPlaying():判断播放器是否正在播放 ,返回 boolean pause():控制播放器暂停 prepare() :准备同步数据 reset() :重置 MediaPlayer 对象 setLooping(boolean looping) :设置是否循环播放 start():
3、控制播放器开始播放 stop(): 控制播放器停止播放实现音乐播放 Service 功能的步骤如下:1)新建一个 Android 工程,创建一个继承于 android.app.Service 类的 PlayerService 类。代码如下:11 public class PlayerService extends Service 2 private final String TAG = “MusicService“;3 private MediaPlayer player; 4 private final IBinder binder = new MyBinder();5 Override6
4、public void onCreate() 7 Log.i(TAG, “onCreate.“);8 9 Override10 public int onStartCommand(Intent intent, int flags, int sId) 11 Log.i(TAG, “onStartCommand.“);12 String state = intent.getStringExtra(“PlayerState“);13 if(state!=null)/判断客户端发送过来的指令参数14 15 if (state.equals(“START“) /播放16 start();17 if (s
5、tate.equals(“PAUSE“) /暂停18 pause();19 if (state.equals(“STOP“) /停止20 stop(); 21 if (state.equals(“STOPSERVICE“) /停止服务22 /调用stopSelf()关闭服务23 stopSelf();24 25 26 return super.onStartCommand(intent, flags, sId);27 28 Override29/绑定方式调用时使用此函数30 public IBinder onBind(Intent intent) 31 Log.i(TAG, “onBind.“
6、);32 return binder; 33 34 /自定义类实现使用绑定方式调用时获得服务接口35 public class MyBinder extends Binder 36 PlayerService getService() 37 return PlayerService.this; 38 39 40 public void start() 41 if (player = null) 42 player = MediaPlayer.create(this, R.raw.hen_egg);43 player.setLooping(false);44 /防止prepareAsync ca
7、lled in state 8 错误45 if(player!=null)46 player.stop();47 player.prepare(); 48 49 if (!player.isPlaying() 50 Log.i(TAG, “player start.“);51 player.start();52 53 54 public void pause() 55 if (player != null 57 player.pause();58 59 60 public void stop() 61 Log.i(TAG, “player Stoped.“);62 player.stop();
8、63 player.prepare();64 65 Override66 public boolean onUnbind(Intent intent) 67 Log.i(TAG, “Service onUnbind.“);68 stop();69 return super.onUnbind(intent);70 71 Override72 public void onDestroy() 73 Log.i(TAG, “Service onDestroy.“);74 player.stop();75 player.release();76 77 服务运行时首先运行 onCreate()方法。当用启
9、动方式调用时, 之后运行的 onStartCommand()方法,该方法使用Intent 接收调用端传递的参数,根据参数要求执行不同的功能:播放音乐 start() 、暂停播放 pause()和停止播放 stop() ,如行 12-20 所示 ,行 42 的 R.raw.hen_egg是一个音频文件,创建方法为,在 res 目录中建立一个 raw 文件夹,然后将一个名为hen_egg 的音频文件拷贝到其中即可;当用绑定绑定方式调用时,之后运行的是 onBind()方法,该方法返回一个可以被客户端调用的服务接口,如行 32 所示,返回值 binder 的定义在行 4,MyBinder 类是为了使
10、客户端能够获得服务接口,定义的一个可以实现远程调 用的类,如行 35-39 所示,当客户端解除绑定时会调用 onUnbind()方法。服务生命结束时,最后要调用 onDestroy()方法来释放资源。2)注册服务打开 AndroidManifest.xml,在 标签中注册服务,该过程可以在 Manifest编辑器中,点击 选项卡,类似注册 Activity 来注册 Service。3)实现界面布局 Layout在 MainActivity 的 Layout 中添加 9 个按钮并设置其 onClick 事件,分别用于实现startService()方式调用时的四个功能和绑定方式调用时的五个功能:
11、开始播放(playerStart) 、暂停播放(playerPause) 、停止播放(playerStop) 、停止服务(stopService) 、绑定服务(startBindService) 、bind 播放( playerBindStart) 、bind 暂停( playerBindPause) 、bind 停止(playerBindStop)和解除绑定(unbindService ) 。4)启动方式访问音乐服务,各个功能实现代码如下:startService()方式访问服务比较简单,只要将数据封装在 Intent 中,然后调用startService()函数启动服务就可以,如果服务已经
12、运行,服务不会再重新创建,而是从生命周期的 onStartCommand()开始运行。服务的终止可以使用 stopService(),如行24 所示,也可以向服务传递一个参数,控制服务在服务类内部使用 stopSelf()终止服务。5)绑定方式访问音乐服务该访问方式需要先建立与服务的连接并获得服务的访问接口。功能实现代码如下:1 /*使用Intent向服务传递数据,数据值“START“、“PAUSE“、“STOP“ 分别代表调用2 服务的播放、暂停和停止播放*/3 public void playerStart(View v)4 5 Intent service=new Intent(Main
13、Activity.this,PlayerService.class);6 service.putExtra(“PlayerState“, “START“);7 startService(service);8 9 public void playerPause(View v)10 11 Intent service=new Intent(MainActivity.this,PlayerService.class);12 service.putExtra(“PlayerState“, “PAUSE“);13 startService(service);14 15 public void playe
14、rStop(View v)16 17 Intent service=new Intent(MainActivity.this,PlayerService.class);18 service.putExtra(“PlayerState“, “STOP“);19 startService(service);20 21 public void stopService(View v)22 23 Intent service=new Intent(MainActivity.this,PlayerService.class);24 stopService(service);25 获得服务接口对象后,可以利
15、用服务接口对象,直接访问服务中的方法,下面是利用服务接口对象实现播放器的代码。1/首先在 Activity 中声明类成员 pservice 为服务对象2 private PlayerService pservice=null ;3 /建立与服务的连接,用于监视服务状态4 private ServiceConnection conn=new ServiceConnection() 5 Override6 public void onServiceDisconnected(ComponentName arg0) 7 Log.i(TAG, “disConnected.“);8 9 Override1
16、0 public void onServiceConnected(ComponentName name, IBinder 11 service) 12 /获得服务接口13 pservice=(PlayerService.MyBinder)service).getService();14 /建立连接成功后,可以马上使用获得的服务接口开始播放15 pservice.start();16 Log.i(TAG, “connect success.“);17 18 ; 1 public void startBindService(View v)/启动服务2 3 Intent service=new In
17、tent(MainActivity.this,PlayerService.class);4 bindService(service, conn, Context.BIND_AUTO_CREATE);5 6 public void playerBindStart(View v)/播放7 8 if(pservice!=null11 12 13 public void playerBindPause(View v)/暂停14 15 if(pservice!=null)16 17 pservice.pause();18 19 20 public void playerBindStop(View v)/停止播放21 22 if(pservice!=null)23 24 pservice.stop();25 26 27 public void unbindService(View v)/解除服务绑定28 29 try30 31 unbindService(conn);32 pservice=null;33 34 catch (Exception ex)35 36 37