您的位置:首页 > 移动开发 > Android开发

Android IPC 进程间通信机制之 Messenger

2017-06-17 17:44 417 查看
Messenger 作为一个跨进程通信工具,它可以让你通过互相传递 Message 来进行跨进程数据交互共享。对于Android来说,Messenger是一个轻

量级的 IPC 方案,内部对 AIDL 进行了封装。它的实现较之 AIDL 方式也更为容易。

1、创建我们的服务端 WorkService :

import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;

public class WorkService extends Service {

public static final int MSG_FROM_CLIENT = 101;

private Handler workHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_FROM_CLIENT:

Bundle bundle = msg.getData();
//打印接收到的客户端信息
Log.d("RJie", "WorkService: " + bundle.getString("msg"));
//通过 msg 的 msg.replyTo 得到客户端传来的 Messenger 对象
Messenger workMessenger = msg.replyTo;

Message serviceMsg = Message.obtain(null, WorkService.MSG_FROM_CLIENT);

Bundle serviceBundle = new Bundle();

serviceBundle.putString("rep", "收到,客户端你好,这里是服务端!!!");

serviceMsg.setData(serviceBundle);

try {
//发送消息给客户端
workMessenger.send(serviceMsg);

} catch (RemoteException e) {
e.printStackTrace();
}

break;
}

}
};

@Override
public IBinder onBind(Intent intent) {
//通过接收消息的 Handler 来获取 Binder 对象
return new Messenger(workHandler).getBinder();
}

}

2、在清单文件中注册服务:android:process 必须给值 让服务端与客户端运行在不同的进程 “:” 表示项目包名 后面的值任意
<service android:name=".WorkService"
android:label="@string/app_name"
android:process=":workProcess">

</service>
3、客户端代码:
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.Process;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

//声明一个 Handler 对象来接收服务端发送来的消息
private Handler mainHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case WorkService.MSG_FROM_CLIENT:
Log.d("RJie", "MainActivity: " + msg.getData().getString("rep"));
break;
}
}
};

private Messenger mainMessenger;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//打印出 UI 线程所在进程的id

Log.d("RJie", "MainActivity.pid==" + Process.myPid());

//绑定服务端
Intent workServiceIntent = new Intent(MainActivity.this, WorkService.class);

bindService(workServiceIntent, sc, Context.BIND_AUTO_CREATE);

}
//声明一个 ServiceConnection 来对客户端与服务端的连接后业务进行处理
private ServiceConnection sc = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//通过 IBinder 对象创建一个 Messenger 对象
mainMessenger = new Messenger(service);

Message mainMessage = Message.obtain(mainHandler, WorkService.MSG_FROM_CLIENT);

Bundle mainBundle = new Bundle();

mainBundle.putString("msg", "这里是客户端,听到请回答!!!");

mainMessage.setData(mainBundle);
//将 Messenger 对象传递给服务端
mainMessage.replyTo = new Messenger(mainHandler);

try {
//发送消息给服务端
mainMessenger.send(mainMessage);

} catch (RemoteException e) {
e.printStackTrace();
}

}

@Override
public void onServiceDisconnected(ComponentName name) {

}
};

@Override
protected void onDestroy() {
super.onDestroy();
//解绑服务端
unbindService(sc);
}

}运行结果:
06-16 20:18:54.907 3668-3668/? D/RJie: MainActivity.pid==3668
06-16 20:18:54.987 3688-3688/? D/RJie: WorkService.pid==3688
06-16 20:18:55.057 3688-3688/? D/RJie: WorkService: 这里是客户端,听到请回答!!!
06-16 20:18:55.110 3668-3668/? D/RJie: MainActivity: 收到,客户端你好,这里是服务端!!!
到这,简单的 Messenger 使用就完成了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android messenger IPC