Android(安卓)Service的思考(2)
16lz
2021-01-26
第二种是通过绑定的方式来启动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] Download zuiniuwang.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;
- }
本文出自 “最牛傻蛋的博客” 博客,转载请与作者联系!
更多相关文章
- uni-app提交表单到后端,接收表单数据
- android PhoneGap源码详解
- Android中显示动画的GIF-Movie类解决方案
- Android(安卓)Adapter 源码笔记(3)
- API Demos 2.2 研读笔记(12)——Intents Chooser
- 使用响应式编程(RxJava)开发Android(安卓)App
- Android(安卓)4.2 Ethernet启动流程
- [Android]ActivityUnitTestCase解释
- android wifiservice enable流程