Service音乐播放器实例Android的服务组件继承于android.app.Service类,实现一个服务,只要继承android.app.Service类,实现其生命周期中的关键方法并添加相应的服务功能就可以。像Activity等组件一样,Service也必须在AndroidManifest.xml中注册才能使用。下面通过实现一个音乐播放服务来说明Service的实现及其生命周期,该播放服务可以使用启动方式调用也可以使用绑定方式调用。音乐播放功能使用android.media.MediaPlayer类来实现,该类提供了丰富的API接口用于实现音频、视频的播放功能,下面先简单介绍用到的几个MediaPlayer类方法。create(Contextcontext,Uriuri):通过Uri创建一个MediaPlayer对象create(Contextcontext,intresid):通过资源ID创建一个MediaPlayer对象isPlaying():判断播放器是否正在播放,返回booleanpause():控制播放器暂停prepare():准备同步数据reset():重置MediaPlayer对象setLooping(booleanlooping):设置是否循环播放start():控制播放器开始播放stop():控制播放器停止播放实现音乐播放Service功能的步骤如下:1)新建一个Android工程,创建一个继承于android.app.Service类的PlayerService类。代码如下:11publicclassPlayerServiceextendsService{2privatefinalStringTAG=MusicService;3privateMediaPlayerplayer;4privatefinalIBinderbinder=newMyBinder();5@Override6publicvoidonCreate(){7Log.i(TAG,onCreate...);8}9@Override10publicintonStartCommand(Intentintent,intflags,intsId){11Log.i(TAG,onStartCommand...);12Stringstate=intent.getStringExtra(PlayerState);13if(state!=null)//判断客户端发送过来的指令参数14{15if(state.equals(START))//播放16{start();}17if(state.equals(PAUSE))//暂停18{pause();}19if(state.equals(STOP))//停止20{stop();}21if(state.equals(STOPSERVICE))//停止服务22{//调用stopSelf()关闭服务23stopSelf();24}25}26returnsuper.onStartCommand(intent,flags,sId);27}28@Override29//绑定方式调用时使用此函数30publicIBinderonBind(Intentintent){31Log.i(TAG,onBind...);32returnbinder;33}34//自定义类实现使用绑定方式调用时获得服务接口35publicclassMyBinderextendsBinder{36PlayerServicegetService(){37returnPlayerService.this;38}39}40publicvoidstart(){41if(player==null){42player=MediaPlayer.create(this,R.raw.hen_egg);43player.setLooping(false);44//防止prepareAsynccalledinstate8错误45if(player!=null)46{player.stop();}47player.prepare();48}49if(!player.isPlaying()){50Log.i(TAG,playerstart...);51player.start();52}53}54publicvoidpause(){55if(player!=null&&player.isPlaying()){56Log.i(TAG,playerPaused...);57player.pause();58}59}60publicvoidstop(){61Log.i(TAG,playerStoped...);62player.stop();63player.prepare();64}65@Override66publicbooleanonUnbind(Intentintent){67Log.i(TAG,ServiceonUnbind.....);68stop();69returnsuper.onUnbind(intent);70}71@Override72publicvoidonDestroy(){73Log.i(TAG,ServiceonDestroy.....);74player.stop();75player.release();76}77}服务运行时首先运行onCreate()方法。当用启动方式调用时,之后运行的onStartCommand()方法,该方法使用Intent接收调用端传递的参数,根据参数要求执行不同的功能:播放音乐start()、暂停播放pause()和停止播放stop(),如行12-20所示,行42的R.raw.hen_egg是一个音频文件,创建方法为,在res目录中建立一个raw文件夹,然后将一个名为hen_egg的音频文件拷贝到其中即可;当用绑定绑定方式调用时,之后运行的是onBind()方法,该方法返回一个可以被客户端调用的服务接口,如行32所示,返回值binder的定义在行4,MyBinder类是为了使客户端能够获得服务接口,定义的一个可以实现远程调用的类,如行35-39所示,当客户端解除绑定时会调用onUnbind()方法。服务生命结束时,最后要调用onDestroy()方法来释放资源。2)注册服务打开AndroidManifest.xml,在application标签中注册服务,该过程可以在Manifest编辑器中,点击选项卡,类似注册Activity来注册Service。3)实现界面布局Layout在MainActivity的Layout中添加9个按钮并设置其onClick事件,分别用于实现startService()方式调用时的四个功能和绑定方式调用时的五个功能:开始播放(playerStart)、暂停播放(playerPause)、停止播放(playerStop)、停止服务(stopService)、绑定服务(startBindService)、bind播放(playerBindStart)、bind暂停(playerBindPause)、bind停止(playerBindStop)和解除绑定(unbindService)。4)启动方式访问音乐服务,各个功能实现代码如下:serviceandroid:name=PlayerServiceintent-filteractionandroid:name=dzu.edu.cn.MP3_PLAYER//intent-filter/servicestartService()方式访问服务比较简单,只要将数据封装在Intent中,然后调用startService()函数启动服务就可以,如果服务已经运行,服务不会再重新创建,而是从生命周期的onStartCommand()开始运行。服务的终止可以使用stopService(),如行24所示,也可以向服务传递一个参数,控制服务在服务类内部使用stopSelf()终止服务。5)绑定方式访问音乐服务该访问方式需要先建立与服务的连接并获得服务的访问接口。功能实现代码如下:1/*使用Intent向服务传递数据,数据值START、PAUSE、STOP分别代表调用2服务的播放、暂停和停止播放*/3publicvoidplayerStart(Viewv)4{5Intentservice=newIntent(MainActivity.this,PlayerService.class);6service.putExtra(PlayerState,START);7startService(service);8}9publicvoidplayerPause(Viewv)10{11Intentservice=newIntent(MainActivity.this,PlayerService.class);12service.putExtra(PlayerState,PAUSE);13startService(service);14}15publicvoidplayerStop(Viewv)16{17Intentservice=newIntent(MainActivity.this,PlayerService.class);18service.putExtra(PlayerState,STOP);19startService(service);20}21publicvoidstopService(Viewv)22{23Intentservice=newIntent(MainActivity.this,PlayerService.class);24stopService(service);25}获得服务接口对象后,可以利用服务接口对象,直接访问服务中的方法,下面是利用服务接口对象实现播放器的代码。1//首先在Activity中声明类成员pservice为服务对象2privatePlayerServicepservice=null;3//建立与服务的连接,用于监视服务状态4privateServiceConnectionconn=newServiceConnection(){5@Override6publicvoidonServiceDisconnected(ComponentNamearg0){7Log.i(TAG,disConnected...);8}9@Override10publicvoidonServiceConnected(ComponentNamename,IBinder11service){12//获得服务接口13pservice=((PlayerService.MyBinder)service).getService();14//建立连接成功后,可以马上使用获得的服务接口开始播放15pservice.start();16Log.i(TAG,connectsuccess...);17}18};1publicvoidstartBindService(Viewv)//启动服务2{3Intentservice=newIntent(MainActivity.this,PlayerService.class);4bindService(service,conn,Context.BIND_AUTO_CREATE);5}6publicvoidplayerBindStart(Viewv)//播放7{8if(pservice!=null&&conn!=null)9{10pservice.start();11}12}13publicvoidplayerBindPause(Viewv)//暂停14{15if(pservice!=null)16{17pservice.pause();18}19}20publicvoidplayerBindStop(Viewv)//停止播放21{22if(pservice!=null)23{24pservic