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 :
String temp = msg.getData().getString("test");
Log.d("yw", temp);
//給用戶端回複消息
Messenger m = msg.replyTo;
//建立一個消息Message
Message message = Message.obtain(null, );
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 = ;
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 :
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
源碼下載下傳位址