Android Service的思考(2)
第二种是通过绑定的方式来启动Service。先看流程图,点击放大。 在这里我们使用了this.bindService(intent, myServiceConnection, Context.BIND_AUTO_CREATE); 来启动Service,当Service创建了同时绑定了之后,会回调我们定义的ServiceConnection(),从而传回IBinder接口,我们就能够调用Service中的方法了。这时候Activity就和Service实现了绑定,Activity退出了Service就相应的退出了。 <service android:enabled="true" android:name=".service.mediaplayer.BindMusicService"> <intent-filter> <action android:name="com.androidtest.service.mediaplayer.BindMusicService" /> </intent-filter> </service> 主要代码如下: ?[Copy to clipboard] Downloadzuiniuwang.java /** *BinderMusicPlayerActivity.java *com.androidtest.activity.musicplayer * *Function:TODO * *verdateauthor *────────────────────────────────── *2011-5-17Leon * *Copyright(c)2011,TNTAllRightsReserved. */ packagecom.androidtest.activity.musicplayer; importcom.androidtest.R; importcom.androidtest.service.mediaplayer.BindMusicService; importcom.androidtest.service.mediaplayer.MyBinder; importcom.androidtest.service.mediaplayer.MyMediaController; importandroid.app.Activity; importandroid.content.ComponentName; importandroid.content.Context; importandroid.content.Intent; importandroid.content.ServiceConnection; importandroid.os.Bundle; importandroid.os.IBinder; importandroid.util.Log; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; /** *ClassName:BinderMusicPlayerActivityFunction:TODOADDFUNCTIONReason:TODO *ADDREASON * *@authorLeon *@version *@sinceVer1.1 *@Date2011-5-17 */ publicclassBinderMusicPlayerActivityextendsActivityimplements OnClickListener{ privatestaticfinalStringTAG=BinderMusicPlayerActivity.class .getSimpleName(); privateBindMusicServicebindMusicService; privateButtonplayButton,pauseButton,stopButton,closeActivityButton, exitActivityButton; @Override protectedvoidonCreate(BundlesavedInstanceState){ //TODOAuto-generatedmethodstub super.onCreate(savedInstanceState); Log.v(TAG,TAG+"onCreate()"); this.setContentView(R.layout.music_player_layout); findViews(); bindViews(); connection(); } privatevoidfindViews(){ playButton=(Button)this.findViewById(R.id.play); pauseButton=(Button)this.findViewById(R.id.pause); stopButton=(Button)this.findViewById(R.id.stop); closeActivityButton=(Button)this.findViewById(R.id.close); exitActivityButton=(Button)this.findViewById(R.id.exit); } privatevoidbindViews(){ playButton.setOnClickListener(this); pauseButton.setOnClickListener(this); stopButton.setOnClickListener(this); closeActivityButton.setOnClickListener(this); exitActivityButton.setOnClickListener(this); } privatevoidconnection(){ Log.v(TAG,TAG+"connection"); Intentintent=newIntent("com.androidtest.service.mediaplayer.BindMusicService"); this.startService(intent); this.bindService(intent,myServiceConnection,Context.BIND_AUTO_CREATE); } @Override publicvoidonClick(Viewview){ //TODOAuto-generatedmethodstub //TODOAuto-generatedmethodstub switch(view.getId()){ caseR.id.play: Log.d(TAG,"play......."); MyMediaController.play.execute(); break; caseR.id.pause: Log.d(TAG,"pause......."); MyMediaController.pause.execute(); break; caseR.id.stop: Log.d(TAG,"stop......."); MyMediaController.stop.execute(); break; caseR.id.close: Log.d(TAG,"close......."); this.finish(); break; caseR.id.exit: Log.d(TAG,"exit......."); this.finish(); this.stopService(newIntent("com.androidtest.service.mediaplayer.BindMusicService")); } } //调用bindService后Service调用onBind()后回调此函数 privateServiceConnectionmyServiceConnection=newServiceConnection(){ @Override publicvoidonServiceConnected(ComponentNamename,IBinderbinder){ Log.v(TAG,TAG+"onServiceConnected"); //TODOAuto-generatedmethodstub bindMusicService=((MyBinder)binder).getService(); //给Controller设置Service初始化的MediaPlayer MyMediaController.mediaPlayer=bindMusicService.getMyMediaPlayer(); } @Override publicvoidonServiceDisconnected(ComponentNamename){ //TODOAuto-generatedmethodstub bindMusicService=null; Log.v(TAG,"..............onServiceDisconnected"); } }; //当Activityfinish时必须解绑不然会出现溢出 publicvoidfinish(){ //TODOAuto-generatedmethodstub super.finish(); this.unbindService(myServiceConnection); } } /** *BindMusicService.java *com.androidtest.service.mediaplayer * *Function:TODO * *verdateauthor *────────────────────────────────── *2011-5-16Leon * *Copyright(c)2011,TNTAllRightsReserved. */ packagecom.androidtest.service.mediaplayer; importcom.androidtest.R; importandroid.app.Service; importandroid.content.Intent; importandroid.media.MediaPlayer; importandroid.os.IBinder; importandroid.util.Log; /** *ClassName:BindMusicService *Function:TODOADDFUNCTION *Reason:TODOADDREASON * *@authorLeon *@version *@sinceVer1.1 *@Date2011-5-16 */ publicclassBindMusicServiceextendsService{ privatestaticfinalStringTAG=BindMusicService.class.getSimpleName(); privateMediaPlayermyMediaPlayer; privateIBinderbinder=newMyBinder(this); publicMediaPlayergetMyMediaPlayer(){ returnmyMediaPlayer; } publicvoidsetMyMediaPlayer(MediaPlayermyMediaPlayer){ this.myMediaPlayer=myMediaPlayer; } @Override publicIBinderonBind(Intentintent){ Log.v(TAG,TAG+"onBind"); //TODOAuto-generatedmethodstub returnbinder; } @Override publicvoidonCreate(){ //TODOAuto-generatedmethodstub super.onCreate(); if(myMediaPlayer==null){ myMediaPlayer=MediaPlayer.create(this,R.raw.test); myMediaPlayer.setLooping(false); } Log.v(TAG,TAG+"onCreate()"); } @Override publicvoidonDestroy(){ //TODOAuto-generatedmethodstub super.onDestroy(); Log.v(TAG,TAG+"onDestroy()"); if(myMediaPlayer!=null){ myMediaPlayer.stop(); myMediaPlayer.release(); } } //通过bindService的方式,onStart函数不会调用 @Override publicvoidonStart(Intentintent,intstartId){ //TODOAuto-generatedmethodstub super.onStart(intent,startId); Log.v(TAG,TAG+"onStart()"); } @Override publicbooleanonUnbind(Intentintent){ //TODOAuto-generatedmethodstub Log.v(TAG,TAG+"onUnbind,成功没有?"+super.onUnbind(intent)); returntrue; } @Override publicvoidonRebind(Intentintent){ //TODOAuto-generatedmethodstub Log.v(TAG,TAG+"onRebind()----------------------------------->"); super.onRebind(intent); } } /** *MyBinder.java *com.androidtest.service.mediaplayer * *Function:TODO * *verdateauthor *────────────────────────────────── *2011-5-17Leon * *Copyright(c)2011,TNTAllRightsReserved. */ packagecom.androidtest.service.mediaplayer; importandroid.os.Binder; /** *ClassName:MyBinderFunction:TODOADDFUNCTIONReason:TODOADDREASON * *@authorLeon *@version *@sinceVer1.1 *@Date2011-5-17 */ publicclassMyBinderextendsBinder{ privateBindMusicServicebindMusicService; publicMyBinder(BindMusicServicebindMusicService){ this.bindMusicService=bindMusicService; }; publicBindMusicServicegetService(){ returnbindMusicService; } 本文转自 最牛傻蛋 51CTO博客,原文链接:http://blog.51cto.com/zuiniuwang/718313,如需转载请自行联系原作者