android进程间通信ipc Messenger (一)
2017-10-26 22:33
106 查看
Messenger跨进程通信底部的实现采用了Binder
看Messenger的构造函数
**
结合例子来帮助理解
**
先创建个服务进程 MService.class
配置文件里注册下服务 android:process=”:MService” 创建一个进程
MainActivity.class 模拟客户端给服务器发消息
29443-29443/com.yw.messengerdemo:MService D/yw: jackyang
服务端进程打印的log
注意事项
服务器进程MService要回消息的话,客户端进程要给传一个Messager
源码下载地址
看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
源码下载地址
相关文章推荐
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
- android 进程间通信
- android进程与线程详解三:线程安全和进程间通信
- Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
- android 使用socket完成进程间通信
- Android 进程间通信之Binder & AIDL
- Android 基于Message的进程间通信 Messenger完全解析
- Android进程间通信机制详解-AIDL
- Android进程间通信(IPC)机制Binder简要介绍和学习计划
- android进程间通信机制讲解
- Android中的进程间通信(二)
- Android服务之Service(其二)关于AIDL进程间通信
- Android进程间通信之——ContentProvider
- Android 基于Message的进程间通信 Messenger完全解析
- 饿了么开源项目Hermes:新颖巧妙易用的Android进程间通信IPC框架
- Android 进程间通信AIDL讲解 二
- Android服务之Service(其二)关于AIDL进程间通信
- android进程间通信:使用AIDL
- Android进程间通信--消息机制及IPC机制实现