Messenger

服务端

创建Service:

public class MessengerService extends Service {private static final int MSG_SUM = 0x110;private Messenger messenger = new Messenger(new Handler() {@Overridepublic void handleMessage(@NonNull Message msg) {Message message = Message.obtain(msg);switch (msg.what) {case MSG_SUM:message.what = MSG_SUM;try {Thread.sleep(2000);message.arg2 = msg.arg1 + msg.arg2;msg.replyTo.send(message);} catch (InterruptedException | RemoteException e) {e.printStackTrace();}break;default:break;}super.handleMessage(msg);}});@Nullable@Overridepublic IBinder onBind(Intent intent) {return messenger.getBinder();}
}

在Service中创建Messenger实例,通过Message消息机制进行操作,Service的onBind中返回messenger实例的Binder对象。

注册service:

<serviceandroid:name=".MessengerService"android:enabled="true"android:exported="true"><intent-filter><action android:name="com.example.messengerserver" /></intent-filter>
</service>

此处action值随意设置,后续和intent的action匹配即可。

客户端

public class MainActivity extends AppCompatActivity {private static final int MSG_SUM = 0x110;private Button button;private LinearLayout layout;private TextView mTvState;private Messenger mService;private boolean isConn;private Messenger mMessenger = new Messenger(new Handler() {@Overridepublic void handleMessage(@NonNull Message msg) {switch (msg.what) {case MSG_SUM:TextView tv = (TextView) layout.findViewById(msg.arg1);tv.setText(tv.getText() + "=>" + msg.arg2);break;}super.handleMessage(msg);}});private ServiceConnection mConn = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {mService = new Messenger(iBinder);isConn = true;mTvState.setText("conn");}@Overridepublic void onServiceDisconnected(ComponentName componentName) {mService = null;isConn = false;mTvState.setText("dis");}};private int mA;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = new Intent();
//        intent.setAction("com.example.messengerserver");intent.setPackage("com.example.messengerserver");bindService(intent, mConn, BIND_AUTO_CREATE);mTvState = (TextView) findViewById(R.id.id_tv_callback);button = (Button) findViewById(R.id.id_btn_add);layout = (LinearLayout) findViewById(R.id.id_ll_container);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {try {int a = mA++;int b = (int) (Math.random() * 100);//创建一个tv,添加到LinearLayout中TextView tv = new TextView(MainActivity.this);tv.setText(a + " + " + b + " = caculating ...");tv.setId(a);layout.addView(tv);Message msg = Message.obtain(null, MSG_SUM, a, b);msg.replyTo = mMessenger;if (isConn) {mService.send(msg);}} catch (RemoteException e) {e.printStackTrace();}}});}
}

注:
①intent设置:隐式必须声明package为service所在包名(而action不必声明,但若声明则必须和服务端设置的action相同,否则service绑定失败)
②ServiceConnection为连接、断开的回调方法
③流程:
a、客户端与服务端通过service绑定成功后,调用ServiceConnection回调方法,客户端依据返回的binder生成给服务端发送信息的messenger

mService = new Messenger(iBinder);

b、客户端创建message给服务端发送

Message msg = Message.obtain(null, MSG_SUM, a, b);
msg.replyTo = mMessenger;      //此处绑定客户端的Messenger,用于接收信息时触发此处的handleMessage
if (isConn) {mService.send(msg);
}

c、服务端接收信息进行数据处理并给在message绑定好的Messenger发送信息

message.arg2 = msg.arg1 + msg.arg2;
msg.replyTo.send(message);

发送回客户端后触发handleMessage

AIDL+远程Service

服务端

interface IPersonAidlInterface {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/void setName(String name);void setAge(int age);String getInfo();void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,double aDouble, String aString);
}

创建aidl文件夹及包+aidl文件(包名需与java文件夹内包相同)
aidl文件创建后,makeProject再继续编写。

public class PersonService extends Service {public PersonService() {}@Nullable@Overridepublic IBinder onBind(Intent intent) {return new IPersonImpl();}public class IPersonImpl extends IPersonAidlInterface.Stub {private String name;private int age;@Overridepublic void setName(String name) throws RemoteException {this.name = name;Log.i("server", name);}@Overridepublic void setAge(int age) throws RemoteException {this.age = age;}@Overridepublic String getInfo() throws RemoteException {return "My name is "+name+", age is "+age+"!";}@Overridepublic void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {}}
}

创建aidl.stub子类,重写方法逻辑,在Service的onbind返回stub实例。

声明service:

<service android:name=".PersonService"android:enabled="true"android:exported="true"android:process=":remote"><intent-filter><action android:name="com.example.aidlserver" /></intent-filter>
</service>

此处注意点同messenger

客户端


将服务端创建的aidl文件夹复制到客户端中,再makeProject

public class MainActivity extends AppCompatActivity {private IPersonAidlInterface iPersonAidlInterface;TextView textView;private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {iPersonAidlInterface = IPersonAidlInterface.Stub.asInterface(iBinder);try {iPersonAidlInterface.setName("123");textView.setText(iPersonAidlInterface.getInfo());} catch (RemoteException e) {e.printStackTrace();}}@Overridepublic void onServiceDisconnected(ComponentName componentName) {}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.text);Intent intent = new Intent();
//        intent.setAction("com.example.aidlserver");intent.setPackage("com.example.aidlserver");bindService(intent, serviceConnection, BIND_AUTO_CREATE);}}

注:
①在ServiceConnection中主要执行iPersonAidlInterface = IPersonAidlInterface.Stub.asInterface(iBinder);,后续通过iPersonAidlInterface即可调用服务端方法
②服务绑定注意点与方法和Messenger相同

对比

Messenger主要通过Message消息机制进行通信,省去了AIDL接口的编写与实现
两者都需要通过Service进行服务端、客户端关系绑定,绑定后再实现通信。

安卓跨进程通信:Messenger、AIDL远程Service 使用相关推荐

  1. Android跨进程通信二——AIDL

    AIDL全称Android Interface Definition Language即安卓接口定义语言.主要用于多进程通信.比Messenger,它具有支持多线程优势 注意事项: 为了线程安全考虑, ...

  2. 利用Messenger跨进程通信

    在进行跨进程通信的时候,可能很多开发者一开始想到的就是AIDL.AIDL,中文名称是android接口描述语言,是android系统中用于进行跨进程通信必须了解的.至于如何生成远程对象进行AIDL通信 ...

  3. Android 使用Messenger和Aidl实现跨进程通信

    Android Messenger和Aidl的使用 1.怎么使用多进程 为安卓的四大组件设置process属性值 例如:android:process=":test"或者 andr ...

  4. AIDL跨进程通信和Service调用

    AIDL的作用 1.aidl 是Android interface definition Language 的英文缩写,意思Android 接口定义语言. 2.使用aidl 可以帮助我们发布以及调用远 ...

  5. 使用AIDL+动态代理+运行时注解+反射 反手撸一套Android跨进程通信框架

    IPC 前言 跨进程通信方式 跨进程通信框架 涉及到的技术 使用Request-Response思想 IPCRequest IPCResponse RemoteService 服务端 客户端 附带 项 ...

  6. Android之解决aidl里面函数参数太大不能跨进程通信的问题

    问题: 因为做的截屏拍照是跨进程通信的,所以需要用aidl,但是参数传递用的byte[] image,网上查了下aidl传递的基本参数类型,没有byte[], 然后把图片转化成String,结果时候接 ...

  7. Android跨进程通信Binder机制与AIDL实例

    文章目录 进程通信 1.1 进程空间划分 1.2 跨进程通信IPC 1.3 Linux跨进程通信 1.4 Android进程通信 Binder跨进程通信 2.1 Binder简介 2.2 Binder ...

  8. Android跨进程通信一 Messenger

    实现客户端与服务端之间的交互 说明:         Messenger是信使的意思,从它的名字就可以了解到它充当着信差的角色.Android通过它实现跨进程通信,主要有客户端信使与服务端信使两种角色 ...

  9. 大话android 进程通信之AIDL

    上一篇的service涉及到进程通信问题,主要解决办法是通过 messenger来发送消息,这也是Google推荐的进程通信方式,比较简单易懂嘛~~,messenger底层也是通过binder来实现的 ...

最新文章

  1. BERT模型的OneFlow实现
  2. 计算机网络——OSI参考模型和TCP/IP协议
  3. 深入详解Redis布隆过滤器
  4. 第70天-内网安全-域横向内网漫游 Socks 代理隧道技
  5. Flink SQL 之 Calcite Volcano优化器(源码解析)
  6. 无法定位程序输入点于动态链接库kernel32
  7. 清远机器人编程_清远宇舵机器人告诉你为什么少年儿童要学习机器人编程?
  8. 先进事迹计算机维护与维修,汽车维修工先进事迹
  9. 5G NR的新特征—超低时延
  10. 收银设备对接php,快速对接payjs的个人支付接口(收银台模式)
  11. Java之CompletableFuture异步、组合计算基本用法
  12. wince buid
  13. CCF真题 ISBN号码 题解
  14. 《英雄联盟》——召唤师峡谷模式 游戏设计元素分析
  15. 一个大屏掌握港口全部信息的数字孪生技术
  16. 常见的文件后缀名和对应的编辑工具(上)
  17. 浙江理工大学电子计算机,2021浙江理工大学电子信息(计算机技术)085400考研调剂信息...
  18. 转贴:如何从优化SQL入手提高数据仓库的ETL效率 作者:周四阳 蔡自兴
  19. 功率谱和FFT变换频谱
  20. python tkinter库实现华氏温度摄氏温度转换

热门文章

  1. JAVASE23天从入门到精通_Day05
  2. react 学习(一) 实现简版虚拟 dom 和挂载
  3. 软件集成:Simulink与Arduino联合开发
  4. 基于AT89C52芯片的寻迹小车论文
  5. Linux virtual filesystem switch I 磁盘相关概念以及知识
  6. javascript断点调试
  7. 【华为OD机试真题 C++】贪吃蛇
  8. 基于物联网技术的智慧教室重点设备监控系统设计与实现
  9. 试水电子处方的背后:移动医疗利好时机到来?
  10. 基于单片机的数字时钟系统