Handler实现Service和Activity通信(比广播更有性能上的优势,广播使用起来比较方便看个人爱好)

Handler实现Service和Activity通信

1、使用Messenger实现跨进程通信
2、Messenger包含handler的引用

实现步骤(有点绕不要急)

1、在Service中创建Messenger包含handler引用
2、在onBind()方法中返回Messenger

@Override
public IBinder onBind(Intent intent){
	Messenger mMessenger = new Messenger(mHandler);
	return mMessenger.getBinder();
}

3、Activity绑定Service,获得Service的Messenger
4、Activity中创建Messenger包含Handler引用

5、使用Service的Messenger发送信息给Service的Handler,信息包括Activity的Messenger(重点理解这句话)

Activity中示例代码

//3、Activity绑定Service,获得Service的Messenger
Intent intent = new Intent(this,DowloadService.class);
bindService(intent,mConnection,Service.BIND_AUTO_CREATE);
//服务连接对象(写在方法外面,如果写在方法里面的话就写在上面两行代码的前面)
ServiceConnection mConnection = new ServiceConnection(){
	@Override
	public void onServiceConnected(ComponentName name, IBinder service) {
		//3、获取Service中的Messenger
		Messenger mServiceMessenger = new Messenger(service);
		//4、创建ActviityMessenger包含Handler的引用
		Messenger messenger = new Messenger(mHandler);
		//创建一个消息
		Message msg = new Message();
		msg.what = 0x1;			//自己定义标识,我这里直接写死了
		msg.replyTo = messenger;
		//使用Service的Messenger发送信息给Service的Handler,
		//信息包括Activity的Messenger	
		//通俗来讲就是Service中Messenger给自己的Handler发送了一条消息
		//理解这里这知识你也掌握了,反过来就可以实现双向通信
			try {
  			  mServiceMessenger.send(msg);
		} catch (RemoteException e) {
  		  e.printStackTrace();
		}
	}
	
	@Override
	public void onServiceDisconnected(ComponentName name) {
 	   //解除绑定调用
	}
};

在服务中获取Activity中的Messenger对象

很简单直接在handler中去判断msg传过来的值
假如我这里定义一个handler:

Handler handler = new Handler(){
	@Override
	public void handlerMessage(Message msg){
		super.handlerMessage(msg);
		switch(msg.what){
		    case 0x1:	
			//获取到Activity中的Messenger包含Handler的引用
			Messenger mActivityMessenger = msg.relyTo;
			break;
			default:
			break;
		}
	}
};

好了就到这里,不理解的请留言!谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xpq_lrh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值