android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用...
本文首发于微信公众号「后厂技术官」
在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法,但是我们能发现Messenger是以串行的方式来处理客户端发来的信息,如果有大量的消息发到服务端,服务端仍然一个一个的处理再响应客户端显然是不合适的。另外,Messenger用来进程间进行数据传递但是却不能满足跨进程的方法调用,接下来我们来使用AIDL来实现跨进程方法调用,此前我们都是用Eclipse来实现的,这次我们看看在Android Studio中使用AIDL有什么不同。
1. 创建AIDL文件
我们将项目的目录结构调为Android模式,在java同级目录创建aidl文件夹,在文件夹中创建一个包名和应用包名一致的包
我们先创建一个IGameManager.aidl的文件,这里面有两个方法分别是addGame和getGameList。(IGameManager.aidl)
package com.example.liuwangshu.moonaidl;
import com.example.liuwangshu.moonaidl.Game;
interface IGameManager{
ListgetGameList();
void addGame(in Game game);
}
在AIDL文件中支持的数据类型包括:
基本数据类型
String和CharSequence
List:只支持ArrayList,里面的元素都必须被AIDL支持
Map:只支持HashMap,里面的元素必须被AIDL 支持
实现Parcelable接口的对象
所有AIDL接口
在IGameManager.aidl中我们用到了Game这个类,这个类实现了Parcelable,在AIDL 文件中我们要import 进来,来看看Game类。(Game.java)
package com.example.liuwangshu.moonaidl;
import android.os.Parcel;
import android.os.Parcelable;
public class Game implements Parcelable{
public String gameName;
public String gameDescribe;
public Game(String gameName,String gameDescribe){
this.gameName=gameName;
this.gameDescribe=gameDescribe;
}
protected Game(Parcel in){
gameName=in.readString();
gameDescribe=in.readString();
}
public static final Creator CREATOR = new Creator() {
@Override
public Game createFromParcel(Parcel in){
return new Game(in);
}
@Override
public Game[] newArray(int size) {
return new Game[size];
}
};
@Override
public int describeContents(){
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags){
dest.writeString(gameName);
dest.writeString(gameDescribe);
}
}
在这里不去讲怎么去实现Parcelable 接口,在上面的IGameManager.aidl文件中我们用到了Game这个类,所以我们也要创建Game.aidl,来申明Game实现了parcelable 接口。(Game.aidl)
package com.example.liuwangshu.moonaidl;
parcelable Game;
这个时候我们重新编译程序,工程就会自动生成IGameManager.aidl对应的接口文件,这个文件生成的位置和Eclipse的位置不同,我们将项目的目录结构调整为project模式,在app–>build–>generated–>soure–>aidl–>debug目录下我们找到自己的包名文件,在文件中有一个接口文件IGameManager。
IGameManager接口文件的代码这里就不说了,有兴趣的可以下载本项目的源码去了解下。
2. 创建服务端
服务端我们在onCreate方法中创建了两个游戏的信息并创建Binder对象实现了AIDL的接口文件中的方法,并在onBind方法中将Binder对象返回。(AIDLService.java)
package com.example.liuwangshu.moonaidl;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class AIDLService extends Service{
private CopyOnWriteArrayList mGameList=new CopyOnWriteArrayList();
private Binder mBinder= new IGameManager.Stub() {
@Override
public List getGameList() throws RemoteException{
return mGameList;
}
@Override
public void addGame(Game game) throws RemoteException{
mGameList.add(game);
}
};
@Override
public void onCreate(){
super.onCreate();
mGameList.add(new Game("九阴真经ol", "最好玩的武侠网游"));
mGameList.add(new Game("大航海时代ol","最好玩的航海网游"));
}
@Override
public IBinder onBind(Intent intent){
return mBinder;
}
}
当然我们不要忘了这个服务端应该运行在另一个进程,在AndroidManifest.xml文件中配置service:
3. 客户端调用
最后我们在客户端onCreate方法中调用bindService方法绑定远程服务端,绑定成功后将返回的Binder对象转换为AIDL接口,这样我们就可以通过这个接口来调用远程服务端的方法了。(AIDLActivity.java)
package com.example.liuwangshu.moonaidl;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.List;
public class AIDLActivity extends AppCompatActivity{
private final static String TAG="AIDLActivity";
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_aidl);
Intent mIntent=new Intent(AIDLActivity.this,AIDLService.class);
bindService(mIntent,mServiceConnection, Context.BIND_AUTO_CREATE);
}
private ServiceConnection mServiceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service){
IGameManager iGameManager=IGameManager.Stub.asInterface(service);
Game game=new Game("月影传说","最好玩的武侠单机游戏");
try {
iGameManager.addGame(game);
List mList=iGameManager.getGameList();
for(int i=0;i
Game mGame=mList.get(i);
Log.i(TAG,mGame.gameName+"---"+mGame.gameDescribe);
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name){
}
};
@Override
protected void onDestroy(){
super.onDestroy();
unbindService(mServiceConnection);
}
}
绑定成功后我们创建了一个新的Game然后调用远程服务端的addGame方法将新游戏添加进去,然后调用循环将远端服务中的所有的游戏在打印出来,我们运行程序
打印出了远程服务端的所有的游戏,这样我们就成功的在客户端通过AIDL来调用远程服务端的方法了。
android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用...相关推荐
- Binder相关面试总结(一):为什么Android要采用Binder作为IPC机制?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nwy9SoNo-1609925310525)(//upload-images.jianshu.io/upload_ima ...
- 为什么Android要采用Binder作为IPC机制?
作者:Gityuan 链接:https://www.zhihu.com/question/39440766/answer/89210950 来源:知乎 著作权归作者所有,转载请联系作者获得授权. 在开 ...
- android ffmpeg 简书,偶遇FFmpeg(三)——Android集成
熟悉命令之后,自然是对其根据自己的需求进行应用了.所以久等的第三编文章就来放放水.记录一下在Android端的集成. 文章组织架构 接下来几遍文章将会按照以下结构来进行组织. 编译FFmpeg For ...
- ( 持续更新,目前含 200+ 工具类 ) DevUtils 是一个 Android 工具库, 主要根据不同功能模块,封装快捷使用的工具类及 API 方法调用。
DevUtils GitHub About ( 持续更新,目前含 200+ 工具类 ) Roadmap DevUtils 是一个 Android 工具库,主要根据不同功能模块,封装快捷使用的工具类及 ...
- python中判断文件是否存在的三种方式_Python中判断文件是否存在的方法
Python中判断文件是否存在的方法 发布时间:2020-08-06 11:15:42 来源:亿速云 阅读:58 作者:小新 这篇文章主要介绍Python中判断文件是否存在的方法,文中介绍的非常详细, ...
- python读取文件的三种方式_python中读取文件的f.seek()方法
用于二进制文件中 F.seek方法 作用: 设置读写位置 F.seek(偏移量, whence=相对位置) 偏移量 大于0的数代表向文件末尾方向移动的字节数 小于0的数代表向文件头方向中移动的字节数 ...
- 设计模式学习笔记(三)工厂模式中的简单工厂、工厂方法和抽象工厂模式之间的区别
设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...
- python中函数参数传递的三种方式_python中函数参数传递的几种方法
转自 http://www.douban.com/note/13413855/ Python中函数参数的传递是通过"赋值"来传递的.但这条规则只回答了函数参数传递的"战 ...
- 三种查看SqlServer中数据物理pge页的方法
1.根据数据记录查看当前记录所在的文件编号.page页.以及在页中的插槽. 示例如下: SELECT top 10 %%physloc%%, sys.fn_physlocFormatter (%%ph ...
最新文章
- C/C++:sizeof('a')的值为什么不一样?
- NGUI中深度depth和z轴关系的小试验
- 计算机共享原理,synchronize底层原理 游戏电脑问题解决分享!
- css 浮动和清除浮动
- 用java程序for循环打印菱形_编写Java程序,应用for循环打印菱形、三角形
- IP,IP地址,mac地址
- Ajax get请求示例
- 研究城市空间结构的入门级文献及书籍推荐(待更新)
- 1.2 矩阵与线性方程组-向量空间、内积空间与线性映射
- Android开发跳坑之路
- python无限循环怎么结束_在无限循环中停止python脚本
- Java基础知识(八) Java平台与内存管理
- SKYLAKE平台安装win7步骤(U盘)
- 日记01 2021年5月
- waitpid() 做人要厚道
- 思科曹图强:勒索软件将打破安全防御平衡
- 中职一年级计算机学情分析,学情分析
- 【Hadoop大数据分析与挖掘实战】(一)----------P19~22
- PLC通过PNS与FUNUC机器人通信
- python中subplot是什么意思_subplot(2,3,1)啥意思?
热门文章
- python xml etree word_使用python格式化插入的元素xml.etree模块,包括新行
- blob字段乱码怎么处理_下载的附件名总乱码?你该去读一下 RFC 文档了!
- 将服务器get到的响应打印,得到HttpResponse的响应主体
- 计算机科学是对描述和变换,对计算机科学发展的思考
- linux java文件 core_linux下部署.net core/java
- 运算符优先级与结合性
- usb转ttl模块与matlab,图文详解USB转TTL设备与电路板的连接
- 【C语言进阶】 宏定义实现字符串引用
- 如把联想电脑计算机图标放在桌面上,thinkpad电脑图标没了怎么恢复
- python3类的继承详解_基于python3 类的属性、方法、封装、继承详解