文章目录

  • AIDL实现连接服务
  • AIDL实现消息服务(客户端→服务端)
  • AIDL实现消息服务(服务端→客户端)

上一篇:Android IPC(二)Messenger实现跨进程双向通信
下一篇:《Android IPC(四)》,望支持加快更新!

AIDL实现连接服务

AIDL实现消息服务(客户端→服务端)

AIDL实现消息服务(服务端→客户端)

Demo结构:

大家学习的时候注意要对应上我的Demo结构路径,否则会出现找不到文件的问题,如果你对AIDL文件很熟悉的话,路径可以随自己喜欢选择。

中间的 IConnectionService、IMessageService等等这块区域的代码是在Android Studio编译时自动生成的

MyBean.aidl

package com.jlink.aidldemo.entity;//对应java 中的MyBean
parcelable MyBean;

IConnectionService.aidl

package com.jlink.aidldemo;//连接服务
interface IConnectionService {//连接oneway void connect();//取消连接void disconnect();//连接状态boolean isConnected();
}

IMessageService.aidl

// IMessageService.aidl
package com.jlink.aidldemo;
import com.jlink.aidldemo.entity.MyBean;
import com.jlink.aidldemo.MessageReceiveListener;//消息服务
interface IMessageService {//发送消息void sendMessage(in MyBean myBean);//注册消息接收监听器void registerMessageReceiveListener(MessageReceiveListener messageReceiveListener);//取消注册消息接收监听器void unRegisterMessageReceiveListener(MessageReceiveListener messageReceiveListener);
}

IServiceManager.aidl

package com.jlink.aidldemo;interface IServiceManager {IBinder getService(String serviceName);
}

MessageReceiveListener.aidl

// MessageReceiveListener.aidl
package com.jlink.aidldemo;
import com.jlink.aidldemo.entity.MyBean;//消息监听器
interface MessageReceiveListener {void onReceiveMessage(in MyBean myBean);
}

MyBean.java

public class MyBean implements android.os.Parcelable{private String content; //内容private boolean isSendSuccess;  //状态public MyBean(){}protected MyBean(Parcel in) {content = in.readString();isSendSuccess = in.readByte() != 0;}public static final Creator<MyBean> CREATOR = new Creator<MyBean>() {@Overridepublic MyBean createFromParcel(Parcel in) {return new MyBean(in);}@Overridepublic MyBean[] newArray(int size) {return new MyBean[size];}};@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(content);dest.writeByte((byte) (isSendSuccess ? 1 : 0));}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public boolean isSendSuccess() {return isSendSuccess;}public void setSendSuccess(boolean sendSuccess) {isSendSuccess = sendSuccess;}
}

MyService.java

public class MyService extends Service {private int num = 0;public MyService(){}//RemoteCallbackList 存储 消息监听器private RemoteCallbackList<MessageReceiveListener> messageReceiveListenerRemoteCallbackList = new RemoteCallbackList<>();//创建计时器private ScheduledThreadPoolExecutor scheduledThreadPoolExecutor;//用来注销计时器private ScheduledFuture scheduledFuture;@Overridepublic void onCreate() {super.onCreate();scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);}private Handler handler = new Handler(Looper.getMainLooper());private boolean isConnected = false;private IConnectionService connectionService = new IConnectionService.Stub() {@Overridepublic void connect() throws RemoteException {isConnected = true;handler.post(new Runnable() {@Overridepublic void run() {Toast.makeText(MyService.this,"连接成功",Toast.LENGTH_SHORT).show();}});scheduledFuture = scheduledThreadPoolExecutor.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {int size = messageReceiveListenerRemoteCallbackList.beginBroadcast();num++;for (int i=0; i<size; i++){MyBean myBean = new MyBean();myBean.setContent("喷火龙怒气值:" + num);try {//服务端 → 客户端messageReceiveListenerRemoteCallbackList.getBroadcastItem(i).onReceiveMessage(myBean);} catch (RemoteException e) {e.printStackTrace();}}messageReceiveListenerRemoteCallbackList.finishBroadcast();}},2000,2000, TimeUnit.MILLISECONDS);}@Overridepublic void disconnect() throws RemoteException {isConnected = false;//删除计时器scheduledFuture.cancel(true);handler.post(new Runnable() {@Overridepublic void run() {Toast.makeText(MyService.this,"断开连接",Toast.LENGTH_SHORT).show();}});}@Overridepublic boolean isConnected() throws RemoteException {handler.post(new Runnable() {@Overridepublic void run() {Toast.makeText(MyService.this,String.valueOf(isConnected),Toast.LENGTH_SHORT).show();}});return isConnected;}};private IMessageService messageService = new IMessageService.Stub() {@Overridepublic void sendMessage(MyBean myBean) throws RemoteException {handler.post(new Runnable() {@Overridepublic void run() {Toast.makeText(MyService.this,String.valueOf(myBean.getContent()),Toast.LENGTH_SHORT).show();}});if (isConnected){myBean.setSendSuccess(true);}else{myBean.setSendSuccess(false);}}@Overridepublic void registerMessageReceiveListener(MessageReceiveListener messageReceiveListener) throws RemoteException {if (messageReceiveListener != null){messageReceiveListenerRemoteCallbackList.register(messageReceiveListener);}}@Overridepublic void unRegisterMessageReceiveListener(MessageReceiveListener messageReceiveListener) throws RemoteException {if (messageReceiveListener != null){messageReceiveListenerRemoteCallbackList.unregister(messageReceiveListener);}}};private IServiceManager serviceManager = new IServiceManager.Stub() {@Overridepublic IBinder getService(String serviceName) throws RemoteException {if (IConnectionService.class.getSimpleName().equals(serviceName)){return connectionService.asBinder();}else if (IMessageService.class.getSimpleName().equals(serviceName)){return messageService.asBinder();}else {return null;}}};@Nullable@Overridepublic IBinder onBind(Intent intent) {return serviceManager.asBinder();}
}

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button btnConnect,btnDisConnect,btnIsConnect;private Button btnSendMessage,btnRegisterListener,btnUnregisterListener;private IConnectionService connectionServiceProxy;private IMessageService messageServiceProxy;private IServiceManager serviceManagerProxy;//监听器的实现private MessageReceiveListener messageReceiveListener = new MessageReceiveListener.Stub() {@Overridepublic void onReceiveMessage(MyBean myBean) throws RemoteException {new Handler(Looper.getMainLooper()).post(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this,myBean.getContent(),Toast.LENGTH_SHORT).show();}});}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();Intent intent = new Intent(MainActivity.this,MyService.class);bindService(intent, new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder iBinder) {try {serviceManagerProxy = IServiceManager.Stub.asInterface(iBinder);connectionServiceProxy = IConnectionService.Stub.asInterface(serviceManagerProxy.getService(IConnectionService.class.getSimpleName()));messageServiceProxy = IMessageService.Stub.asInterface(serviceManagerProxy.getService(IMessageService.class.getSimpleName()));} catch (RemoteException e) {e.printStackTrace();}}@Overridepublic void onServiceDisconnected(ComponentName name) {}}, Context.BIND_AUTO_CREATE);}private void init() {btnConnect = findViewById(R.id.btn_connect);btnDisConnect = findViewById(R.id.btn_disconnect);btnIsConnect = findViewById(R.id.btn_is_connected);btnSendMessage = findViewById(R.id.btn_send_message);btnRegisterListener = findViewById(R.id.btn_register_listener);btnUnregisterListener = findViewById(R.id.btn_unregister_listener);btnIsConnect.setOnClickListener(this);btnConnect.setOnClickListener(this);btnDisConnect.setOnClickListener(this);btnSendMessage.setOnClickListener(this);btnRegisterListener.setOnClickListener(this);btnUnregisterListener.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.btn_connect:try {//连接connectionServiceProxy.connect();} catch (RemoteException e) {e.printStackTrace();}break;case R.id.btn_disconnect:try {//断开连接connectionServiceProxy.disconnect();} catch (RemoteException e) {e.printStackTrace();}break;case R.id.btn_is_connected:try {//获取连接状态boolean isConnected = connectionServiceProxy.isConnected();Toast.makeText(MainActivity.this,String.valueOf(isConnected),Toast.LENGTH_SHORT).show();} catch (RemoteException e) {e.printStackTrace();}break;case R.id.btn_send_message:try {//客户端 → 服务端MyBean myBean = new MyBean();myBean.setContent("王睿对喷火龙使出了动感光波");messageServiceProxy.sendMessage(myBean);} catch (RemoteException e) {e.printStackTrace();}break;case R.id.btn_register_listener:try {messageServiceProxy.registerMessageReceiveListener(messageReceiveListener);} catch (RemoteException e) {e.printStackTrace();}break;case R.id.btn_unregister_listener:try {messageServiceProxy.unRegisterMessageReceiveListener(messageReceiveListener);} catch (RemoteException e) {e.printStackTrace();}break;}}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_connect"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="连接"/><Buttonandroid:id="@+id/btn_disconnect"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="取消连接"/><Buttonandroid:id="@+id/btn_is_connected"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="连接状态"/><Buttonandroid:id="@+id/btn_send_message"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="发送消息"/><Buttonandroid:id="@+id/btn_register_listener"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="注册监听器"/><Buttonandroid:id="@+id/btn_unregister_listener"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="取消监听器"/></LinearLayout>

Demo地址:
链接:https://pan.baidu.com/s/1JHmCOeRIjGaVnwuA8RB2Jw
提取码:u5xh

Android IPC(三)AIDL实现跨进程通信相关推荐

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

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

  2. android四个组件的跨进程通信

    Android四大组件(Activity,service,broadcast,Content Provider)跨进程通信相信在android项目中进程用到,此处将一一做以说明以及总结. 1.简括: ...

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

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

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

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

  5. 利用Messenger跨进程通信

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

  6. Android IPC 进程进程间通信或跨进程通信

    Android IPC 机制 老话长谈,趁现在有时间对IPC做一个具体的总结. IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间 ...

  7. Android - 跨进程通信(IPC) 另一种便捷实现 详解

    文章目录 1. 写在前面 2. 跨进程通信的实现 3. 扩展思考 4. 参考资料 1. 写在前面 看到此图有何感想,这是另一种便捷的实现方式,我们先来看看其它的几种方式. Android 进程间通信 ...

  8. Binder跨进程通信原理(三):Binder IPC实现原理

    1. 动态内核可加载模块 && 内存映射 正如上一章所说, 跨进程通信是需要内核空间做支持的. 传统的 IPC 机制如 管道, Socket, 都是内核的一部分, 因此通过内核支持来实 ...

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

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

  10. Android组件化跨进程通信框架Andromeda解析

    关于组件化 随着项目结构越来越庞大,模块与模块间的边界逐渐变得不清晰,代码维护越来越困难,甚至编译速度都成为影响开发效率的瓶颈. 组件化拆分是比较常见的解决方案,一方面解决模块间的耦合关系.将通用模块 ...

最新文章

  1. python各个解释器的用途-常见的Python五大解释器!
  2. ms查约束具体代码_记 Arthas 实现一次 CPU 排查与代码热更新
  3. 在Android Studio进行“简单配置”单元测试(Android Junit)
  4. 云合影程序_活动回顾丨阿里云ACE同城会开发者云workshop圆满落幕
  5. 用友BQ商业智能平台——图表功能
  6. 谷歌开源3D舞蹈生成模型FACT,舞姿清奇!
  7. pdf转word python_Python实现PDF转Word
  8. java public_java中public,private,protected和default的区别
  9. vuecli3 配置多个代理
  10. Pytorch生成Tensor常用方法汇总
  11. 航拍+AI︱paddlepaddle图像分割实现天空风格迁移(换天、漂浮城堡、宇宙飞船)
  12. 云计算学习笔记:什么是云?云计算是什么?
  13. bbs小项目整理(五)(登录模块的完成)
  14. Linux DNS服务详解——DNS基础知识
  15. 0402网络基础--查看及测试网络连通、IP地址、IPv6、子网划分
  16. Android RadarScanView雷达扫描控件
  17. PDF转Word文档怎么转?两招教你学会PDF转word
  18. C++递归算法之分成互质组
  19. C#毕业设计——基于C#+asp.net+SQL server的网上物流管理信息系统设计与实现(毕业论文+程序源码)——网上物流管理信息系统
  20. luoguP3799 妖梦拼木棒

热门文章

  1. idea中git回退远程仓库版本
  2. windwo下载完nvm无法执行node
  3. 安卓项目R,java文件不能自动更新,clean之后,R.java消失 (转自 Cynosure鱼)
  4. SAP RFC BAPI
  5. GIS-python学习
  6. WWW'22 | 信息检索方向值得一读的3篇论文详解
  7. 推荐算法竞赛TOP解决方案汇总
  8. 交叉熵和极大似然估计的再理解
  9. 【每日算法Day 102】美团 AI 平台算法工程师面试编程题
  10. 【每日算法Day 98】慈善赌神godweiyang教你算骰子点数概率!