プロセス間通信のmessenger
9343 ワード
Messengerを使用してプロセス間通信を完了
Messengerはメッセージングに訳すことができるので、彼はプロセス間でmessageを伝達することができることを不思議に思って、私達はmessageの中でデータをカプセル化してmessengerを通じてプロセス間で伝達を完成することができて、messengerは1種の軽量級のIPC(プロセス間通信、プロセス間通信)方案で、AIDLの上層パッケージです
利点:使用が簡単で、呼び出しが便利で、同時が存在しない.彼はシリアル方式でクライアントデータを処理する弊害があるからだ.シリアル方式でクライアントデータを処理すると、一度に1つの要求しか処理できない.大量の同時要求があれば、彼も1つの処理しかできない.基本的にはメッセージの伝達にしか使用できない.プロセスをまたいでサービス側を呼び出す方法では使用できない.一般的にメッセージの伝達に使用される
使用:サービス側とクライアントに分けて使用します.次にDemoを使用して説明します.1.サービス側はまず、クライアントに接続するためのサービスを作成し、handlerとMessengerの関連付けを作成し、onBindメソッドでこのMessengerの最下位iBinderを返します.ここでMessengerの役割は、クライアントのデータをhandlerに渡して処理することです.注意サービス側は独立したプロセスで実行する、すなわちサービスのサービスはプロセス属性を宣言する.これは2つのアプリケーションを模倣してプロセス間通信を完了することに等しい.2.クライアントはサービス側のサービスをバインドする必要があり、バインドに成功したiBinderオブジェクトを通じてmessengerを作成し、このmessengerを通じてサービス側にデータを送信することができる.サービス側がクライアントにデータを返す必要がある場合は、クライアントにもHandlerとmessengerを作成し、このmessengerをmessageのreplyToパラメータを介してサービス側に渡す必要があります.サービス側はこのreplyToパラメータを通じてクライアントのmessengerを手に入れることができます.次に、コードの一目「鳥」を見てみましょう.
サービス側コード:
サービス側のサービスは独立したプロセスで実行する必要があるので、android:process=":remote"をリストに宣言します.
クライアントコード
最後にクライアントとサービス側のインタラクティブlogを見てみましょう
Messengerはメッセージングに訳すことができるので、彼はプロセス間でmessageを伝達することができることを不思議に思って、私達はmessageの中でデータをカプセル化してmessengerを通じてプロセス間で伝達を完成することができて、messengerは1種の軽量級のIPC(プロセス間通信、プロセス間通信)方案で、AIDLの上層パッケージです
利点:使用が簡単で、呼び出しが便利で、同時が存在しない.彼はシリアル方式でクライアントデータを処理する弊害があるからだ.シリアル方式でクライアントデータを処理すると、一度に1つの要求しか処理できない.大量の同時要求があれば、彼も1つの処理しかできない.基本的にはメッセージの伝達にしか使用できない.プロセスをまたいでサービス側を呼び出す方法では使用できない.一般的にメッセージの伝達に使用される
使用:サービス側とクライアントに分けて使用します.次にDemoを使用して説明します.1.サービス側はまず、クライアントに接続するためのサービスを作成し、handlerとMessengerの関連付けを作成し、onBindメソッドでこのMessengerの最下位iBinderを返します.ここでMessengerの役割は、クライアントのデータをhandlerに渡して処理することです.注意サービス側は独立したプロセスで実行する、すなわちサービスのサービスはプロセス属性を宣言する.これは2つのアプリケーションを模倣してプロセス間通信を完了することに等しい.2.クライアントはサービス側のサービスをバインドする必要があり、バインドに成功したiBinderオブジェクトを通じてmessengerを作成し、このmessengerを通じてサービス側にデータを送信することができる.サービス側がクライアントにデータを返す必要がある場合は、クライアントにもHandlerとmessengerを作成し、このmessengerをmessageのreplyToパラメータを介してサービス側に渡す必要があります.サービス側はこのreplyToパラメータを通じてクライアントのmessengerを手に入れることができます.次に、コードの一目「鳥」を見てみましょう.
サービス側コード:
/*ipc messenger */
public class MessengerService extends Service {
private static final String TAG = "MessengerService";
private static class messengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case Constants.MSG_FROM_CLIENT:
Log.d(TAG, "handleMessage : " + msg.getData().getString("msg"));
//replyTo message messenger, messenger handler
Messenger client = msg.replyTo;
//messenger message Parcelable
Message replyMessage = Message.obtain(null, Constants.MSG_FROM_SERVICE);
//bundle Parcelable message object Parcelable Object ,
Bundle data = new Bundle();
data.putString("msg", " ");
replyMessage.setData(data);
try {
client.send(replyMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
super.handleMessage(msg);
break;
}
}
}
// mseeengerHandler Messenger mMessenger
private final Messenger mMessenger = new Messenger(new messengerHandler());
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
}
サービス側のサービスは独立したプロセスで実行する必要があるので、android:process=":remote"をリストに宣言します.
クライアントコード
/*ipc messenger */
public class MessengerActivity extends AppCompatActivity {
private Messenger mGetReplyMessenger = new Messenger(new MessengerHandler());
private static class MessengerHandler extends Handler {
private static final String TAG = "MessengerService";
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case Constants.MSG_FROM_SERVICE:
Log.d(TAG, "handleMessage : " + msg.getData().getString("msg"));
break;
default:
super.handleMessage(msg);
break;
}
}
}
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = new Messenger(service);
Message msg = Message.obtain(null, Constants.MSG_FROM_CLIENT);
Bundle data = new Bundle();
data.putString("msg", " ");
msg.setData(data);
// mGetReplyMessenger replyTo messenger
msg.replyTo = mGetReplyMessenger;
try {
mService.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
private Messenger mService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_messenger);
// service
Intent intent = new Intent(this, MessengerService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(mConnection);
}
}
最後にクライアントとサービス側のインタラクティブlogを見てみましょう
08-22 09:17:01.797 4219-4219/? D/MessengerService: handleMessage :
08-22 09:17:01.897 4206-4206/? D/MessengerService: handleMessage :