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

android进程间通信ipc Messenger (一)

2017-10-26 22:33 106 查看
Messenger跨进程通信底部的实现采用了Binder

看Messenger的构造函数

**public final class Messenger implements Parcelable**

public Messenger(Handler target) {
mTarget = target.getIMessenger();
}

public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}


**

结合例子来帮助理解

**

先创建个服务进程 MService.class

package com.yw.messengerdemo.service;

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;

/**
* Created by yw on 17/10/26.
* author jackyang
* com.yw.messengerdemo.service
*/
public class MService extends Service {
private final static class MHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
String temp = msg.getData().getString("test");
Log.d("yw", temp);

//给客户端回复消息
Messenger m = msg.replyTo;
//创建一个消息Message
Message message = Message.obtain(null, 1);
Bundle  bundle = new Bundle();
bundle.putString("msgByService", "客户端小弟,你少给老子发消息啦,我知道你发的消息是:" + temp);
message.setData(bundle);

try {
//发送消息
m.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
super.handleMessage(msg);
}
}

//实例一个 Messenger
private final static Messenger mMessenger = new Messenger(new MHandler());

@Override
public IBinder onBind(Intent intent) {
//提供给客户端Binder
return mMessenger.getBinder();
}
}


配置文件里注册下服务 android:process=”:MService” 创建一个进程

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yw.messengerdemo" >

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".service.MService"
android:process=":MService" />
</application>

</manifest>


MainActivity.class 模拟客户端给服务器发消息

package com.yw.messengerdemo;

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.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import com.yw.messengerdemo.service.MService;

public class MainActivity extends AppCompatActivity {
private EditText mEt;
private Messenger mMessenger;
private TextView mTv;

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

mEt = (EditText) findViewById(R.id.et);
mTv = (TextView) findViewById(R.id.tv);

Intent intent = new Intent(this, MService.class);
bindService(intent, mServiceConn, Context.BIND_AUTO_CREATE);
}

public void send_msg(View view) {
Message message = Message.obtain();
message.what = 0;
message.replyTo = new Messenger(mHandler);  //给服务器传一个Messager 为了让服务器用这个Messenger回消息
Bundle b = new Bundle();
String msg = mEt.getText().toString();
b.putString("test", msg);
message.setData(b);
try {
mMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}

//接受服务器的消息
private Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case 1:
mTv.setText(msg.getData().getString("msgByService"));
break;
}
return false;
}
});

//创建一个服务连接
private ServiceConnection mServiceConn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mMessenger = new Messenger(service);
}

@Override
public void onServiceDisconnected(ComponentName name) {

}
};

@Override
protected void onDestroy() {
super.onDestroy();
unbindService(mServiceConn);
}
}




29443-29443/com.yw.messengerdemo:MService D/yw: jackyang

服务端进程打印的log

注意事项

服务器进程MService要回消息的话,客户端进程要给传一个Messager

源码下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息