Android四大组件如何通信,android 四大组件之Service(8) 通过信使进行远程通信(示例代码)...

服务使用绑定式:

有两个定义一个服务端的信使,sMessenger = new Messenger(new Handler() {});

在这个信使中获取客户端的信息,在接收的Message中获取客户端的信使cMessenger,

向客户端发送消息是通过客户端信使cMessenger来发送消息。

cMessenger.send(Message);

注意在onBind() 中返回一个IBinder对象,sMessenger.getBinder();

这个是为了客户端能够获取服务端信使sMessenger.

在ServiceConnection接口中sMessenger = new Messenger(IBinder);

这处获取的IBinder就是onBind() 中获取的IBinder对象,

在客户端就是通过获取的服务信使sMessenger来向服务端发送消息

sMessenger.send(msg);发送消息。

(1)在客户和服务端都创建一个自己的信使,

客户创建一个cMessenger  , 服务创建一个sMessenger

(2)通过方法获取一个对方的信使,

在客户端通过ServiceConnection中获取sMessenger

在服务端通过获取的cMessenger = Message.reply

(3)通过对方信使向对方发送消息

客户端:sMessenger.send(msg);

服务端:cMessenger.send(msg);

public class MyService extendsService {

public Messenger sMessenger = new Messenger(newHandler(){public voidhandleMessage(android.os.Message msg) {if(msg.what == 1){int age =msg.arg1 ;

String name=(String)msg.obj;//获取客户端信使

cMessenger =msg.replyTo;//通过消息获取客户信息

Log.i("tag", name+"--->"+age);

Message reply=Message.obtain();

reply.arg1= 1234;

reply.obj= name+">>>>"+"roise";try {//通过客户端信使向客户发送消息

cMessenger.send(reply);

}catch(RemoteException e) {

e.printStackTrace();

}

}

};

});public voidonCreate() {

Log.i("tag", "ServiceonCreate()");

};

@OverridepublicIBinder onBind(Intent intent) {

Log.i("tag", "onBind()");//通过服务的信使获取IBinder

returnsMessenger.getBinder();

}

@Overridepublic booleanonUnbind(Intent intent) {

Log.i("tag", "onUnbind()");return super.onUnbind(intent);

}

@Overridepublic voidonDestroy() {

Log.i("tag", "Serviceondestroy");super.onDestroy();

}

}

public class MainActivity extendsActivity {

Messenger sMessenger;

Messenger cMessenger= new Messenger(newHandler(){public voidhandleMessage(android.os.Message msg) {//获取服务短消息

String info =(String)msg.obj;int age =msg.arg1;

Log.i("tag", "客户端接收到的消息"+info+age);

};

});

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}protected voidonStart() {super.onStart();

Log.i("tag", "ActivityonStart()");

Intent intent= new Intent(MainActivity.this, MyService.class);

bindService(intent, conn, BIND_AUTO_CREATE);

};protected voidonDestroy() {

Log.i("tag", "ActivityunbindService()");super.onDestroy();

unbindService(conn);

};public voidonSend(View v) {

Message msg=Message.obtain();

msg.arg1= 12;

msg.obj= "client";

//为了双向通信,将客户端信使发送给对方

msg.replyTo=cMessenger;

msg.what= 1;try{

sMessenger.send(msg);

}catch(RemoteException e) {

e.printStackTrace();

}

}

ServiceConnection conn= newServiceConnection() {

@Overridepublic voidonServiceDisconnected(ComponentName name) {

}

@Overridepublic voidonServiceConnected(ComponentName name, IBinder service) {

//通过ServiceConnection获取服务信使

sMessenger= newMessenger(service);

}

};

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值