第18天Service-Messager实现进程间通信
Messager
一.Messager介绍
Messager,故名思义信使的意思,能够完成跨进程通信。
二.Messager的原理
Messager的2个构造方法:分别以handler和Ibinder为参数
public Messenger(Handler target) {
mTarget = target.getIMessenger();
}
public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}
我们可以在客户端发送一个Message给服务端,在服务端的handler中会接收到客户端的消息,然后进行对应的处理,处理完成后,再将结果等数据封装成Message,发送给客户端,客户端的handler中会接收到处理的结果。
特点:
- 客户端和服务端发送的都是message
- 使用handler接受消息(客户端和服务端都是)
- 不需要编写aidl文件
三 .使用步骤
服务端moudle:messager_server
(1)创建服务:MyService.java
public class MyService extends Service {
//TODO 创建信使对象:参数是handler处理客户端发送来的消息
Messenger server_messager=new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//接受客户端消息
Bundle bundle=msg.getData();
String message=bundle.getString("client_message");
Toast.makeText(MyService.this, "服务器发来的消息:"+message, Toast.LENGTH_SHORT).show();
//向客户端发送消息
Messenger clientMessager = msg.replyTo;//用于获取客户端的信使
Message messenge= new Message();
Bundle bundle1=new Bundle();
bundle1.putString("server_message","客户端你是不是傻啊");
messenge.setData(bundle1);
try {
clientMessager.send(messenge);
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
//TODO 返回server_messager的代理人,便于客户端获取服务端信使
@Nullable
@Override
public IBinder onBind(Intent intent) {
return server_messager.getBinder();
}
}
(2)清单文件注册服务
<service android:name=".MyService" android:exported="true">
<intent-filter>
<action android:name="com.bawei.1609A"></action>
</intent-filter>
</service>
OK,服务端的服务已经配置完毕
客户端moudle:messager_client
public class MainActivity extends AppCompatActivity {
//3.客户端的信使:负责接受服务器发来的消息
private Messenger Clientmesssager=new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle bundle=msg.getData();
String message=bundle.getString("server_message");
Toast.makeText(MainActivity.this, "接受到服务器发来的消息"+message, Toast.LENGTH_SHORT).show();
}
});
// 4. 客户端发送消息给服务端
private Messenger Servermessenger;
private ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Servermessenger=new Messenger(service);//获取服务端信使
Message message=new Message();
message.replyTo= Servermessenger;
Bundle bundle=new Bundle();
bundle.putString("client_message","你好啊服务器");
message.setData(bundle);
try {
Servermessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.绑定服务
Intent intent=new Intent();
intent.setAction("com.bawei.1609A");
intent.setPackage("com.example.messager_server");
bindService(intent,connection, Service.BIND_AUTO_CREATE);
}
//2.解除绑定
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(connection);
}
}
> 注意: 1.先启动服务端,在启动客户端
2.Message携带数据必须使用bundle不然报错
总结:
- 服务端:
- 接受消息: 创建Messager信使对象,参数为handler
- 发送消息:获得客户端的信使对象
Messenger clientMessager = msg.replyTo;
- 客户端
- 接受消息: 创建Messager信使对象,参数为handler
- 发送消息:绑定服务成功创建Server端的Messager,参数为binder