一、前言

AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写,AIDL的作用是绑定一个其他APP的service,用于进程间的通讯。

在Android系统中,每个进程都运行在一块独立的内存中,在其中完成自己的各项活动,与其他进程都分隔开来。可是有时候我们又有应用间进行互动的需求,比较传递数据或者任务委托等,AIDL就是为了满足这种需求而诞生的。通过AIDL,可以在一个进程中获取另一个进程的数据和调用其暴露出来的方法,从而满足进程间通信的需求。

二、使用

1、创建服务项目


(1)定义aidl接口UserRemoteService和实体类User.aidl

UserRemoteService.aidl

package com.example.server.user;import com.example.server.user.User;
interface UserRemoteService {User getUserByid(int id);int addUser(in  User user);//in 为客户端传输数据到服务端,out 为服务端传输数据到客户端void showToast(String msg);
}

User.aidl

package com.example.server.user;
parcelable User;

(2)编写java代码

User.java

public class User implements Parcelable, Serializable {private int id;private String username;private String password;public User() {}public User(int id, String username, String password) {this.id = id;this.username = username;this.password = password;}public User(Parcel in) {id = in.readInt();username = in.readString();password = in.readString();}public static final Creator<User> CREATOR = new Creator<User>() {@Overridepublic User createFromParcel(Parcel in) {return new User(in);}@Overridepublic User[] newArray(int size) {return new User[size];}};public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel parcel, int flags) {parcel.writeInt(id);parcel.writeString(username);parcel.writeString(password);}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

注意:在构造函数中读取数据,读取的顺序要和写入的顺序一样,必须按照成员变量声明的顺序来,不然对象传输会丢失数据!已踩坑!
(3)编写服务service

UsersService.java

public class UsersService extends Service {@Overridepublic void onCreate() {super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return super.onStartCommand(intent, flags, startId);}@Nullable@Overridepublic IBinder onBind(Intent intent) {return new UserRemoteService.Stub(){@Overridepublic User getUserByid(int id) throws RemoteException {User user = new User(id,"123456","lss0555");return user;}@Overridepublic int addUser(User user) throws RemoteException {Log.e("添加用户:",""+user.toString());return 1;}@Overridepublic void showToast(String msg) throws RemoteException {Handler handler=new Handler(Looper.getMainLooper());handler.post(new Runnable(){public void run(){Toast.makeText(getApplicationContext(), "服务提示:"+msg, Toast.LENGTH_LONG).show();}});}};}
}

(4)配置启动服务

在 AndroidManifest.xml 声明服务

<service android:name=".service.UsersService"android:enabled="true"android:exported="true"><intent-filter><action android:name="com.example.server.service.UsersService"/></intent-filter>
</service>

在界面种进行启动服务

Intent service = new Intent(getApplicationContext(),UsersService.class);
startService(service);
2、创建客户端项目


定义aidl
将服务的User.aidl、User.java、UserRemoteService.aidl复制到项目下,文件的路径必须一致!

测试类,连接远程服务,调用

MainActivity.java

public class MainActivity extends AppCompatActivity {private UserRemoteService userRemoteService;private ServiceConnection conn = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {Toast.makeText(getApplicationContext(),"服务已断开",Toast.LENGTH_SHORT).show();userRemoteService = null;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Toast.makeText(getApplicationContext(),"服务连接成功",Toast.LENGTH_SHORT).show();userRemoteService = UserRemoteService.Stub.asInterface(service);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = new Intent();intent.setPackage("com.example.server");intent.setAction("com.example.server.service.UsersService");bindService(intent, conn, Service.BIND_AUTO_CREATE);}//获取用户信息public void getUserInfo(View view) {try {User user = userRemoteService.getUserByid(888);Log.e("用户信息:",""+user.toString());} catch (RemoteException e) {e.printStackTrace();}}//添加用户public void addUser(View view) {try {User user = new User(33, "lss0555", "123");int addUser = userRemoteService.addUser(user);Toast.makeText(getApplicationContext(),"结果:"+addUser,Toast.LENGTH_SHORT).show();} catch (RemoteException e) {e.printStackTrace();}}//提示功能public void maketip(View view) {try {userRemoteService.showToast("hello world");} catch (RemoteException e) {e.printStackTrace();}}@Overrideprotected void onDestroy() {super.onDestroy();if(conn!=null){unbindService(conn);}}
}

测试:

com.example.server E/添加用户:: User{id=33, username='lss0555', password='123'}com.example.client E/用户信息:: User{id=888, username='123456', password='lss0555'}

android之aidl进程间通讯数据传输相关推荐

  1. 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制

    概述 最近在学习Binder机制,在网上查阅了大量的资料,也看了老罗的Binder系列的博客和Innost的深入理解Binder系列的博客,都是从底层开始讲的,全是C代码,虽然之前学过C和C++,然而 ...

  2. Android-Binder进程间通讯机制-多图详解

    本系列: Android-Binder进程间通讯机制-多图详解 一次Binder通信最大可以传输多大的数据?​​​​​​​ 关于Binder (AIDL)的 oneway 机制 概述 最近在学习Bin ...

  3. Android中进程间通讯 AIDL

    Android中进程间通讯 AIDL IDL Interface Description Language  接口描述语言 AIDL Android IDL 适用场景:    client进程必须是A ...

  4. Android查缺补漏(IPC篇)-- 进程间通讯之Socket简介及示例

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8425736.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...

  5. Android(IPC)进程间通讯1:详解Binder由来?

    完整原文:http://tryenough.com/android-... Android开发的进程间通讯,整个Android的应用都依赖于binder做底层通信机制.而Linux中提供的进程间通讯方 ...

  6. 进程间通讯回调客户端

    首先进程间通讯的方式有:广播,ContentProvider(内容提供者),AIDL(Android接口定义语言) 今天我们所讲的就是AIDL: 首先定义AIDL接口文件,如果进程间要传递对象,那么这 ...

  7. 管道实现进程间通讯 、WaitNamedPipe

    一.管道实现进程间通讯 主要的理论知识 1.什么是管道以及分类 管道是两个头的东西,每一个头各连接一个进程或者同一个进程的不同代码,依照管道的类别分有两种管道,匿名的和命名的:依照管道的传输方向分也能 ...

  8. 【Linux】进程间通讯

    前提知识 进程间具有独立性 ,现在我们要打破独立性,去通讯,所以 通讯的成本一定很高. 又时候又需要多进程协同完成某种业务内容 ,例如以前: cat file | grep "hello&q ...

  9. 【Linux】-- 进程间通讯

    目录 进程间通讯概念的引入 意义(手段) 思维构建 进程间通信方式 管道 站在用户角度-浅度理解管道 匿名管道 pipe函数 站在文件描述符角度-深度理解管道 管道的特点总结 管道的拓展 单机版的负载 ...

最新文章

  1. 只腐蚀毛刺 腐蚀算法_摩托车油箱防腐蚀、油封安装、密封清洗经验分享
  2. poj3114Countries in War(缩点+DIJK)
  3. ZOJ2091(贪心)
  4. javaweb入门笔记(4)-request和response
  5. 世界排名前20的大学毕业生去做银行柜员,柜员工资是不是很高?
  6. mysql already closed._java.sql.SQLException: Already closed.
  7. 各个行业纷纷瞅准了这块大蛋糕
  8. JavaScript实现斐波那契数列(Febonacci Array)
  9. [教程]centos下设置网卡
  10. 计算机金融专业课程方案,《计算机在金融业中的应用》教学实施方案
  11. 【吐血整理,建议收藏】B站上有哪些值得反复观看的Java视频教程?
  12. java基础之多线程与Lambda表达式
  13. element上传附件(el-upload 超详细)
  14. 关于Pearson相关性系数、Cosine相似度、欧式距离
  15. python可以下载百度文库_python+selenium爬取百度文库不能下载的word文档
  16. 十一条Python学习路线,推荐收藏
  17. ncre计算机职业英语,NCRE计算机职业英语一级考试样卷.doc
  18. url中如果有引号的处理
  19. Kafka 实战 (3):kafka安装部署·2
  20. 【行业案例分享】平安云加速银行数字化转型!

热门文章

  1. 使用word自带功能快速编辑公式
  2. 自媒体素材哪里找?易撰素材库带你找素材
  3. Matlab中max函数
  4. 计算机公式固定数值符号,中级无纸化机考 数学公式/符号你会输入吗?
  5. java计算机毕业设计线上书城系统源码+lw文档+系统+数据库
  6. mongodb 备份压缩_MongoDB实现备份压缩的方法教程
  7. IntelliJ IDEA取消自动删除空格
  8. 这几个良心软件确定不看看?万一以后就需要了
  9. android自定义view onmeasure,Android 重写ViewGroup 分析onMeasure()和onLayout()方法
  10. 主观世界的破碎与重建——湖畔大学的失败课外课