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;
}
}
};
好了就到这里,不理解的请留言!谢谢