一步步解析用绑定的方式开启Service(二)

By | 2014/08/09

如同上篇博客中提到的一般我们在类的内部是不会实现一个公共类的。

如果这个内部类是私有的但是我们又有这样的需求,想想在其他类中使用这个内部类中的方法,

我们就可以把这些要用到方法抽象到接口中。然后让这个内部类实现这个接口。因为接口是公共的所以这个内部类中的这些方法就可以被调用了。

同样还是先来写Activity类:


package com.comcons.activity;

import com.comcons.myinterface.IBinderMethodInterface;
import com.comcons.service.MyService;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;

public class MainActivity extends Activity {

	
	private MyServiceConnection myServiceConnection;
	
	/**
	 * 因为这个接口的存在
	 * 我们只把MyBinder中的部分方法暴漏出来了,
	 * 也就是说只把即在这个接口,又在MyBinder中的方法暴露出来了
	 */
	private IBinderMethodInterface iMethod ;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		/**
		 * 初始化MyServiceConnection
		 * 以便于在绑定和解绑Service时使用
		 */
		myServiceConnection = new MyServiceConnection() ;
	}
	
	/**
	 * 绑定服务的Button的事件
	 * @param view
	 */
	public void bindMyService(View view){
		Intent intent = new Intent(MainActivity.this, MyService.class);
		bindService(intent, myServiceConnection, BIND_AUTO_CREATE);
	}

	/**
	 * 调用服务中的方法的事件
	 * @param view
	 */
	public void callMyServiceMethod(View view){
		iMethod.callServiceMethod01();
	}
	
	
	private class MyServiceConnection implements ServiceConnection{

		/**
		 * 当绑定成功后会调用这个方法
		 */
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			System.out.println("====连接成功====");
			//对接收到IBinder对象进行强制类型转换
			iMethod = (IBinderMethodInterface)service;    
		}

		/**
		 * 服务异常终止,也就是在没用调用unbindService(myServiceConnection);
		 * 方法时。比如内存清理,或者退出Service
		 * 只service的宿主进程崩溃或者被杀掉也可能是Service本身死掉了(此处感觉没解释清楚)
		 * 而且我也没发现,如何才能调用这个方法
		 */
		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			System.out.println("dis connect");
		}
		
	}
}

然后是Service类:

package com.comcons.service;

import com.comcons.myinterface.IBinderMethodInterface;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class MyService extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		System.out.println("MyService onBind()方法调用----> 服务成功绑定");
		return new MyBinder();
	}
	
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		System.out.println("MyService onCreate()方法调用---->服务被创建");
	}
	
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		System.out.println("MyService onDestroy()方法调用---->服务被销毁");
	}
	
	@Override
	public boolean onUnbind(Intent intent) {
		// TODO Auto-generated method stub
		System.out.println("MyService onUnbind()方法调用---->服务被解绑");
		return super.onUnbind(intent);
	}
	
	/**
	 * 模拟Service中的方法被调用
	 */
	private void letsCallMe_01(){
		System.out.println("成功发送消息到MyService第一个方法");
	}
	/**
	 * 模拟Service中的方法被调用
	 */
	private void letsCallMe_02(){
		System.out.println("成功发送消息到MyService第二个方法");
	}
	
	
	/**
	 * 在这里我们就可以把这个内部类声明成私有的了
	 * 然后向外仅仅暴漏IBinderMethodInterface接口,就能调用方法了
	 * @author LiuQiang
	 *
	 */
	private class MyBinder extends Binder implements IBinderMethodInterface{

		/**
		 * 现在这个方法是实现的IBinderMethodInterface接口中方法
		 * 这个是真正暴露出去的方法,通过这个方法可以调用
		 * 外部类的letsCallMe_01();
		 */
		@Override
		public void callServiceMethod01() {
			// TODO Auto-generated method stub
			letsCallMe_01();
		}

		@Override
		public void callServiceMethod02() {
			// TODO Auto-generated method stub
			letsCallMe_02();
		}
		
	}
}

接下来是一个接口我把它命名为IBinderMethodInterface:

package com.comcons.myinterface;

public interface IBinderMethodInterface {

	public void  callServiceMethod01() ;
	
	public void  callServiceMethod02() ;
}

其实已经没有什么好解释的了,如果前一篇博客的实现方式能够理解的话,这个也很容易就理解了,其实是一样的,只不过,完成了更好的封装
进一步只把该暴漏的暴露不该暴露的设置成了private。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.