Messenger可以翻译为信使,通过它可以在不同进程中传递Message对象,底层是AIDL,一次处理一个请求,不存在并发执行的情形
MessagerActivity位于默认进程中,默认进程名为包名:com.zhoujian.android
MessagerService位于私有进程:com.zhoujian.android:romote
android:process=":romote"
利用Messenger实现跨进程间通信
MessagerActivity.java
package com.zhoujian.android.activity;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import com.zhoujian.android.R;
import com.zhoujian.android.service.MessagerService;
/**
* Created by zhoujian on 2016/11/16.
*/
public class MessagerActivity extends Activity
{
public static final String TAG="MessagerActivity";
public static final int MSG_FROM_CLIENT=1;
//创建接受服务端消息的Messenger和Handler
Handler handler = new Handler()
{
private String mReply;
@Override
public void handleMessage(Message msg) {
switch (msg.what)
{
case 2:
mReply = msg.getData().getString("reply");
Log.e(TAG,"接受的消息来自服务端:"+mReply);
break;
}
}
};
Messenger replyMessenger = new Messenger(handler);
ServiceConnection conn = new ServiceConnection()
{
private Messenger mMessenger;
@Override
public void onServiceConnected(ComponentName name, IBinder binder)
{
//创建信使
mMessenger = new Messenger(binder);
//创建Message
Message msg = Message.obtain(null,MSG_FROM_CLIENT);
//创建Bundle
Bundle bundle = new Bundle();
//把消息放入binder
bundle.putString("messager","你好!我来自客户端");
//设置数据
msg.setData(bundle);
//需要把接受服务端回复的Messenger通过Message的replyTo参数传递给服务端
msg.replyTo = replyMessenger;
try
{
//用信使发送Mesage
mMessenger.send(msg);
}
catch (Exception e)
{
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name)
{
}
};
//option+command+k 对生命周期方法进行排序
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_messager);
Intent intent = new Intent(MessagerActivity.this, MessagerService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
@Override
protected void onRestart()
{
super.onRestart();
}
@Override
protected void onStart()
{
super.onStart();
}
@Override
protected void onResume()
{
super.onResume();
}
@Override
protected void onPause()
{
super.onPause();
}
@Override
protected void onStop()
{
super.onStop();
}
@Override
protected void onDestroy()
{
unbindService(conn);
super.onDestroy();
}
}
MessagerService.java
package com.zhoujian.android.service;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.util.Log;
/**
* Created by zhoujian on 2016/11/28.
*/
public class MessagerService extends Service
{
public static final String TAG = "MessagerService";
public static final int MSG_FROM_CLIENT=1;
Handler handler = new Handler()
{
private String messager;
@Override
public void handleMessage(Message msg)
{
switch (msg.what)
{
case MSG_FROM_CLIENT:
messager = msg.getData().getString("messager");
Log.e(TAG,"接受的消息来自客户端:"+messager);
//服务端收到客户端的消息后,在发送一条消息到客户端
mTo = msg.replyTo;
//创建Message
Message mMessae = Message.obtain(null,2);
Bundle bundle = new Bundle();
bundle.putString("reply","您的消息已经收到,稍后给您回复!");
mMessae.setData(bundle);
try
{
mTo.send(mMessae);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
};
Messenger mMessenger = new Messenger(handler);
@Override
public IBinder onBind(Intent intent)
{
return mMessenger.getBinder();
}
}
使用Messenger实现进程间通信
最新推荐文章于 2021-08-26 17:30:16 发布