Messenger的使用和
messenger可以看作是通道。。。。
多说无益,上代码,这里实现的是Activity和service的跨进程通信
首先是service代码:
public class MyService extends Service {
private static final String TAG= "MessengerService";
private Messenger messenger ;
private static class Messengerhandler extends Handler {
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what) {
case 1:{
Log.d(TAG,"从客户端来的消息:"+msg.getData().getString("msg"));
Messenger messenger_reply = msg.replyTo;
Message message_reply = new Message();
message_reply.what = 2;
Bundle bundle_reply = new Bundle();
bundle_reply.putString("reply","这是来自MyService的回信");
message_reply.setData(bundle_reply);
try {
messenger_reply.send(message_reply);
}catch (Exception e){
e.printStackTrace();
}
break;
}
}
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
messenger = new Messenger(new Messengerhandler());
return messenger.getBinder();
}
}
- 代码解析
messenger发挥作用还得看handler。。。handler里要处理从activity发送过来的信息。通过getData().getString()就可以得到想要的数据。。这里的代码还实现了回复功能,关键在于msg.replyTo。。。这个replyTo是在MainActivity那里设定的。通过他我们可以确定返回message的目的地。。。
MainActivity代码
public class MainActivity extends AppCompatActivity {
private Button button;
private static String TAG = "MainActivity";
private Messenger messenger;
private Messenger messenger_getReply;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
messenger = new Messenger(service);
Message msg = Message.obtain(null,1);
Bundle data = new Bundle();
data.putString("msg","这是客户端发送的message");
msg.setData(data);
msg.replyTo = messenger_getReply;
try {
messenger.send(msg);
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
messenger_getReply = new Messenger(new MessengergetReplyHandler());
button = findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,MyService.class);
bindService(intent,connection,BIND_AUTO_CREATE);
}
});
}
}
MessengergetReplyHandler代码
class MessengergetReplyHandler extends Handler {
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what){
case 2:{
Log.d("ReplyMessenger","这是从service返回的msg:"+msg.getData().getString("reply"));
break;
}
}
}
}
- 总结:
Messenger传输的是message数据,对msg起反应的是Handler,使用很方便。。而且messenger处理数据是串行的,不用担心并行可能带来的错误。