服务启动方式三-使用bindService方式启动服务
第三种:使用bindService方式启动服务
这里的实现方式通过绑定的方式启动服务,该种方法启动Service需要经历的步骤:Context.bindService()->onCreate()->onBind()->Service running->stopService()->onUnbind()->onDestroy()->Service stop.
onBind将返回客户端一个IBind接口实例,这个实例允许客户端回调服务方法,如得到Service的运行状态的操作。这种方法会把调用者(Context、Activity等)与Service绑定在一起,Context退出时,Service也会调用onUnbind()->onDestroy()退出,所以可以理解为服务和所启动该服务的Context是同生共死的。这种方式下,Service的生命周期为:onCreate()->onBind()(onBind只能绑定一次,不可多次绑定)->onUnbind()->onDestroy()。
同样用音乐播放器作为演示
实现代码如下:
首先建立一个用于启动服务的Activity,并创建一个BindMusicService对象,然后直接通过调用bindMusicService对象中的方法的方式来实现事件的处理,相当于Service直接为使用服务者提供了一系列的操作方法作为接口。
package com.lqh.servicetest;import java.sql.Connection;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;
import android.view.View.OnClickListener;
import android.widget.Button;public class PlayBindMusic extends Activity implements OnClickListener{private Button playBtn,stopBtn,pauseBtn,exitBtn;private BindMusicService musicService;public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.bind_music_service);setTitle("Bind Music Service");findView();bindButton();connection();}private void findView(){playBtn=(Button) findViewById(R.id.playBtn);stopBtn=(Button) findViewById(R.id.stopBtn);pauseBtn=(Button) findViewById(R.id.pauseBtn);exitBtn=(Button) findViewById(R.id.exitBtn);}private void bindButton(){playBtn.setOnClickListener(this);stopBtn.setOnClickListener(this);pauseBtn.setOnClickListener(this);exitBtn.setOnClickListener(this);}private void connection(){Intent intent=new Intent("com.android.ServiceDemo.bindService");bindService(intent, sc, Context.BIND_AUTO_CREATE);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.playBtn:musicService.play();break;case R.id.stopBtn: if(musicService!=null){musicService.stop();}break;case R.id.pauseBtn:if(musicService!=null){musicService.pause();}break;case R.id.exitBtn:this.finish();break;}}//用于监视服务连接状态的对象private ServiceConnection sc=new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName arg0) {// TODO Auto-generated method stub//失去连接的回调方法musicService=null;}@Override//建立连接的回调方法public void onServiceConnected(ComponentName arg0, IBinder arg1) {// TODO Auto-generated method stubmusicService=((BindMusicService.MyBinder)(arg1)).getService();}};}
接下来是BindMusicService类:
通过MediaPlayer对象调用方法进行音乐的播放控制即可。
package com.lqh.servicetest;import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.widget.Toast;public class BindMusicService extends Service {private MediaPlayer mediaPlayer;private final IBinder binder =new MyBinder();public class MyBinder extends Binder{BindMusicService getService(){return BindMusicService.this;}}@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn binder;}public void onCreate(){super.onCreate();Toast.makeText(this, "绑定音乐播放器成功", Toast.LENGTH_SHORT).show();if(mediaPlayer==null){mediaPlayer=MediaPlayer.create(this, R.raw.tmp);}}public void onDestroy(){super.onDestroy();Toast.makeText(this, "停止音乐播放器", Toast.LENGTH_SHORT).show();if(mediaPlayer!=null){mediaPlayer.stop();mediaPlayer.release();}}public void play(){if((!mediaPlayer.isPlaying())&&mediaPlayer!=null){mediaPlayer.start();}}public void pause(){if(mediaPlayer!=null&&mediaPlayer.isPlaying()){mediaPlayer.pause();}}public void stop(){if(mediaPlayer!=null){mediaPlayer.pause();mediaPlayer.seekTo(0);}}}
上面的代码中可以发现有个返回IBinder对象的onBind方法,这个方法会在Service被绑定到其他程序上时被调用,其返回的IBinder对象即之前的onServiceConnected()方法中的参数IBinder。应用与Service之间就是依靠这个IBinder对象进行通信的。
最后注册一下清单文件:
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
