绑定服务&调用服务里面的方法

一个继承Service的TestService类,里面有一个changeTest(String name)方法,要在activity中调用这个方法改变服务中的一些状态,进行一下设计。


public class TestService extends Service {

	//服务被成功绑定的时候会调用该方法
	@Override
	public IBinder onBind(Intent arg0) {
		System.out.println("服务被成功的绑定了");
		//返回自定义的代理人
		//步骤2.服务成功绑定的时候,调用onBind方法,返回一个IBinder对象
		return new MyBinder();
	}
	
	private class MyBinder extends Binder implements IService{
		public void bindChange(String name){
			changeTest(name);
		}
	}
	
	public void changeTest(String name){
		System.out.println("这是服务里面的方法"+name);
	}
	
	@Override
	public void onCreate() {
		super.onCreate();
		System.out.println("服务被创建");
	}
	
	@Override
	public void onDestroy() {
		super.onDestroy();
		System.out.println("服务被销毁");
	}

}

public class MainActivity extends Activity {

	//步骤4:在activity里面得到服务Ibinder对象的引用
	private IService myBinder;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public void startService(View view){
		Intent intent = new Intent(this, TestService.class);
		startService(intent);
	}
	
	public void stopService(View view){
		Intent intent = new Intent(this, TestService.class);
		stopService(intent);
	}
	
	/**
	 * 采用绑定的方式开启服务,在TestService中会自动调用onBind方法,该方法返回一个IBinder对象
	 * 在MainActivity里面实现onServiceConnected()方法,传递进来IBinder参数,这样
	 * IBinder对象就充当service和activity之间的代理人的角色
	 * @param view
	 */
	public void bindService(View view){
		//intent激活服务的意图
		//conn 代理人,中间人对象用来跟服务建立联系,不能为空
		Intent intent = new Intent(this, TestService.class);
		
		//步骤1.采用绑定服务的方法开启服务
		bindService(intent, new MyConn(), 0);
	}
	
	
	private class MyConn implements ServiceConnection{

		//Called when a connection to the Service has been established
		@Override
		public void onServiceConnected(ComponentName arg0, IBinder service) {
			System.out.println("service的代理人被返回回来了");
			//步骤3:服务返回的IBinder对象会传递个MyConn的回调方法onServiceConnected方法
			myBinder = (IService)service;
		}

		//Called when a connection to the Service has been lost
		//只有在程序异常终止的时候会自动调用
		@Override
		public void onServiceDisconnected(ComponentName arg0) {
			// TODO Auto-generated method stub
			
		}
		
	}
	
	//步骤5:利用IBinder对象间接的调用了服务里面的方法
	public void changeService(View view){
		myBinder.bindChange("仁者无敌");
	}
	
}

public interface IService {
	public void bindChange(String name);
}
服务里面的MyBinder类需受到保护,不可以随便让外部代码访问,所以需为private,但是activity中要拿到MyBinder类,故此处定义一个接口IService,MyBinder类实现了这个接口,在activity中

private IService myBinder;
myBinder = (IService)service;
通过接口拿到MyBinder的对象,这样通过这个对象调用的bindChange方法就是实现IService接口的MyBinder类里面实现的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值