android 四大组件之Service 通过信使进行远程通信
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 四大组件之Service 通过信使进行远程通信相关的知识,希望对你有一定的参考价值。
服务使用绑定式:
有两个定义一个服务端的信使,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 extends Service {
public Messenger sMessenger = new Messenger(new Handler(){
public void handleMessage(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 void onCreate() {
Log.i("tag", "ServiceonCreate()");
};
@Override
public IBinder onBind(Intent intent) {
Log.i("tag", "onBind()");
//通过服务的信使获取IBinder
return sMessenger.getBinder();
}
@Override
public boolean onUnbind(Intent intent) {
Log.i("tag", "onUnbind()");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
Log.i("tag", "Serviceondestroy");
super.onDestroy();
}
}
public class MainActivity extends Activity {
Messenger sMessenger;
Messenger cMessenger = new Messenger(new Handler(){
public void handleMessage(android.os.Message msg) {
//获取服务短消息
String info = (String)msg.obj;
int age = msg.arg1;
Log.i("tag", "客户端接收到的消息"+info+age);
};
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
protected void onStart() {
super.onStart();
Log.i("tag", "ActivityonStart()");
Intent intent = new Intent(MainActivity.this, MyService.class);
bindService(intent, conn, BIND_AUTO_CREATE);
};
protected void onDestroy() {
Log.i("tag", "ActivityunbindService()");
super.onDestroy();
unbindService(conn);
};
public void onSend(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 = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//通过ServiceConnection获取服务信使
sMessenger = new Messenger(service);
}
};
}
以上是关于android 四大组件之Service 通过信使进行远程通信的主要内容,如果未能解决你的问题,请参考以下文章