通過Messenger可以在不同進程之間通過傳遞Message對象實現進程間數據的傳遞;Messenger是一種輕量級的IPC方案,低層使用AIDL實現。由於Messenger一次處理一個請求,因此在不存在併發執行的情況下,不再考慮線程同步問題。
下面我們來看具體的實現
我們這裏首先在一個應用中創建不同的兩個進程,創建MessengerActivity與MessengerService這兩個處於不同進程的類,在MessengerService註冊時指定它所對應的進程
<activity android:name="com.example.ipcstudy.MessengerActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.example.ipcstudy.MessengerService"
android:process=":MessengerService"/>"
android:process=”:MessengerService” 指定MessengerService在com.example.ipcstudy:MessengerService進程中;MessengerActivity默認在com.example.ipcstudy進程中。
MessengerService類的實現:
package com.example.ipcstudy;
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.widget.Toast;
public class MessengerService extends Service{
//創建Handler用於MessengerActivity中傳遞的Message對象
private Handler messengerHandler=new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case MessengerActivity.MESSENGER:
//獲取信息內容並Toast
Toast.makeText(MessengerService.this, msg.getData().getString("content"), 0).show();
//獲取MessengerActivity中replyMessenger對象
Messenger messenger=msg.replyTo;
//創建傳遞的消息對象
Message replyMessage=Message.obtain(null, MessengerActivity.MESSENGER);
Bundle bundle=new Bundle();
bundle.putString("reply", "我已經收到消息!");
replyMessage.setData(bundle);
try {
//給MessengerActivity發送消息
messenger.send(replyMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
break;
}
};
};
private Messenger messenger=new Messenger(messengerHandler);
@Override
public IBinder onBind(Intent intent) {
//返回IBinder對象
return messenger.getBinder();
}
}
MessengerActivity類的實現
package com.example.ipcstudy;
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.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.widget.Toast;
public class MessengerActivity extends Activity{
public static final int MESSENGER=111;
private ServiceConnection conn=new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//通過服務返回的IBinder對象創建Messenger對象
Messenger messenger=new Messenger(service);
//創建Message對象
Message message=new Message();
message.what=MESSENGER;
Bundle bundle=new Bundle();
bundle.putString("content", "通過Messenger進行跨進程通信");
message.setData(bundle);
//將接收消息的replyMessenger傳遞給MessengerService
message.replyTo=replyMessenger;
try {
//向MessengerService發送消息
messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
/**
* 用於接收MessengerService傳遞過來的數據Message對象
*/
private Messenger replyMessenger=new Messenger(new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSENGER:
//獲取信息內容並Toast
Toast.makeText(MessengerActivity.this, msg.getData().getString("reply"), 0).show();
break;
default:
break;
}
};
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//綁定服務
Intent intent=new Intent(this,MessengerService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}
}
注意:
Messenger中進行數據傳遞必須將數據放入Message中,而Messenger與Message都實現了Parcelable接口,因此可以跨進程傳輸。
Message只能使用what,arg1,arg2,Bundle,replyto傳遞信息,Message中object字段僅支持系統提供的實現了Parcelable接口的對象傳遞信息,我們自己定義Parcelable對象不能進行傳輸。