服务启动方式三-使用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);
	}
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (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() {
		
		@Override
		public void onServiceDisconnected(ComponentName arg0) {
			// TODO Auto-generated method stub
			//失去连接的回调方法
			musicService=null;
		}
		
		@Override
		//建立连接的回调方法
		public void onServiceConnected(ComponentName arg0, IBinder arg1) {
			// TODO Auto-generated method stub
			musicService=((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;
		}
	}
	
	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return 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对象进行通信的。

最后注册一下清单文件:

        
            
                
            
        



你可能感兴趣的:(Android学习)