Messenger
Messenger介绍
Messenger是一种轻量级IPC方案,它的底层实现是AIDL,可以在不能进程之间进行数据传输
服务端
创建一个Service,在Handler中处理消息,在onBind中返回Messenger对象的Binder
public class MessengerService extends Service {
private static final String TAG = "MessengerService";
public static final int MESSAGE_FROM_CLIENT = 20;
@Nullable
@Override
//返回Binder
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
private final Messenger messenger = new Messenger(new MessengerHandle());
private static class MessengerHandle extends Handler{
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what){
case MESSAGE_FROM_CLIENT:
//接受来自客户端的消息
Log.d(TAG,"" + msg.getData().getString("msg"));
Messenger client = msg.replyTo;
Message RelpyToMessage = Message.obtain(null,MainActivity.MESSAGE_FROM_SERVICE);
Bundle ServiceBundle = new Bundle();
ServiceBundle.putString("reply","Hi! Client");//返回消息至客户端
RelpyToMessage.setData(ServiceBundle);
try{
client.send(RelpyToMessage);
}catch (RemoteException e){
e.printStackTrace();
}
break;
}
super.handleMessage(msg);
}
}
}
在清单文件中配置Service
<service
android:name=".MessengerService"
android:process=":remote"
android:enabled="true"
android:exported="true"/>
客户端
首先绑定服务端的Service,然后根据IBinder创建一个Messenger对象,然后在绑定名称向客户端发送消息,依旧在Handler处理服务端的消息
public class MainActivity extends AppCompatActivity{
private static final String TAG = "MainActivity";
public static final int MESSAGE_FROM_SERVICE = 10;//客户端发送给服务端
private Messenger messenger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(MainActivity.this,MessengerService.class);
bindService(intent,connection,BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
unbindService(connection);
super.onDestroy();
}
private Messenger myMessenger = new Messenger(new MessengerHandle());
//连接Service并发送消息
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
messenger =new Messenger(service);
Message message = Message.obtain(null, MessengerService.MESSAGE_FROM_CLIENT);
Bundle bundle = new Bundle();
//第一次向Service打招呼
bundle.putString("msg","Hi! Service");
message.setData(bundle);
//接收客户端信息时,需要把服务端的Messenger通过replyTo参数传递给服务端
message.replyTo = myMessenger;
try{
messenger.send(message);
}catch (RemoteException e){
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
//接收Service的消息
private static class MessengerHandle extends Handler{
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what){
case MESSAGE_FROM_SERVICE:
Log.d(TAG,msg.getData().getString("reply"));
break;
}
}
}
}