作者:主持人谷佳霓期_426 | 来源:互联网 | 2023-10-12 18:02
通过Messenger可以在不同进程之间通过传递Message对象实现进程间数据的传递;Messenger是一种轻量级的IPC方案,低层使用AIDL实现。由于Messenger一次处理
通过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{
private Handler messengerHandler=new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case MessengerActivity.MESSENGER:
Toast.makeText(MessengerService.this, msg.getData().getString("content"), 0).show();
Messenger messenger=msg.replyTo;
Message replyMessage=Message.obtain(null, MessengerActivity.MESSENGER);
Bundle bundle=new Bundle();
bundle.putString("reply", "我已经收到消息!");
replyMessage.setData(bundle);
try {
messenger.send(replyMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
break;
}
};
};
private Messenger messenger=new Messenger(messengerHandler);
@Override
public IBinder onBind(Intent intent) {
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) {
Messenger messenger=new Messenger(service);
Message message=new Message();
message.what=MESSENGER;
Bundle bundle=new Bundle();
bundle.putString("content", "通过Messenger进行跨进程通信");
message.setData(bundle);
message.replyTo=replyMessenger;
try {
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.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对象不能进行传输。