android之aidl进程间通讯数据传输
一、前言
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进程间通讯数据传输相关推荐
- 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制
概述 最近在学习Binder机制,在网上查阅了大量的资料,也看了老罗的Binder系列的博客和Innost的深入理解Binder系列的博客,都是从底层开始讲的,全是C代码,虽然之前学过C和C++,然而 ...
- Android-Binder进程间通讯机制-多图详解
本系列: Android-Binder进程间通讯机制-多图详解 一次Binder通信最大可以传输多大的数据? 关于Binder (AIDL)的 oneway 机制 概述 最近在学习Bin ...
- Android中进程间通讯 AIDL
Android中进程间通讯 AIDL IDL Interface Description Language 接口描述语言 AIDL Android IDL 适用场景: client进程必须是A ...
- Android查缺补漏(IPC篇)-- 进程间通讯之Socket简介及示例
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8425736.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...
- Android(IPC)进程间通讯1:详解Binder由来?
完整原文:http://tryenough.com/android-... Android开发的进程间通讯,整个Android的应用都依赖于binder做底层通信机制.而Linux中提供的进程间通讯方 ...
- 进程间通讯回调客户端
首先进程间通讯的方式有:广播,ContentProvider(内容提供者),AIDL(Android接口定义语言) 今天我们所讲的就是AIDL: 首先定义AIDL接口文件,如果进程间要传递对象,那么这 ...
- 管道实现进程间通讯 、WaitNamedPipe
一.管道实现进程间通讯 主要的理论知识 1.什么是管道以及分类 管道是两个头的东西,每一个头各连接一个进程或者同一个进程的不同代码,依照管道的类别分有两种管道,匿名的和命名的:依照管道的传输方向分也能 ...
- 【Linux】进程间通讯
前提知识 进程间具有独立性 ,现在我们要打破独立性,去通讯,所以 通讯的成本一定很高. 又时候又需要多进程协同完成某种业务内容 ,例如以前: cat file | grep "hello&q ...
- 【Linux】-- 进程间通讯
目录 进程间通讯概念的引入 意义(手段) 思维构建 进程间通信方式 管道 站在用户角度-浅度理解管道 匿名管道 pipe函数 站在文件描述符角度-深度理解管道 管道的特点总结 管道的拓展 单机版的负载 ...
最新文章
- 只腐蚀毛刺 腐蚀算法_摩托车油箱防腐蚀、油封安装、密封清洗经验分享
- poj3114Countries in War(缩点+DIJK)
- ZOJ2091(贪心)
- javaweb入门笔记(4)-request和response
- 世界排名前20的大学毕业生去做银行柜员,柜员工资是不是很高?
- mysql already closed._java.sql.SQLException: Already closed.
- 各个行业纷纷瞅准了这块大蛋糕
- JavaScript实现斐波那契数列(Febonacci Array)
- [教程]centos下设置网卡
- 计算机金融专业课程方案,《计算机在金融业中的应用》教学实施方案
- 【吐血整理,建议收藏】B站上有哪些值得反复观看的Java视频教程?
- java基础之多线程与Lambda表达式
- element上传附件(el-upload 超详细)
- 关于Pearson相关性系数、Cosine相似度、欧式距离
- python可以下载百度文库_python+selenium爬取百度文库不能下载的word文档
- 十一条Python学习路线,推荐收藏
- ncre计算机职业英语,NCRE计算机职业英语一级考试样卷.doc
- url中如果有引号的处理
- Kafka 实战 (3):kafka安装部署·2
- 【行业案例分享】平安云加速银行数字化转型!
热门文章
- 使用word自带功能快速编辑公式
- 自媒体素材哪里找?易撰素材库带你找素材
- Matlab中max函数
- 计算机公式固定数值符号,中级无纸化机考 数学公式/符号你会输入吗?
- java计算机毕业设计线上书城系统源码+lw文档+系统+数据库
- mongodb 备份压缩_MongoDB实现备份压缩的方法教程
- IntelliJ IDEA取消自动删除空格
- 这几个良心软件确定不看看?万一以后就需要了
- android自定义view onmeasure,Android 重写ViewGroup 分析onMeasure()和onLayout()方法
- 主观世界的破碎与重建——湖畔大学的失败课外课