android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用...

本文首发于微信公众号「后厂技术官」

在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法,但是我们能发现Messenger是以串行的方式来处理客户端发来的信息,如果有大量的消息发到服务端,服务端仍然一个一个的处理再响应客户端显然是不合适的。另外,Messenger用来进程间进行数据传递但是却不能满足跨进程的方法调用,接下来我们来使用AIDL来实现跨进程方法调用,此前我们都是用Eclipse来实现的,这次我们看看在Android Studio中使用AIDL有什么不同。

1. 创建AIDL文件

我们将项目的目录结构调为Android模式,在java同级目录创建aidl文件夹,在文件夹中创建一个包名和应用包名一致的包

6cd6e6ee4c5fdfa488b4251437b0ebcf.png

我们先创建一个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。

2a2c65a24f2220ddf5cedec5fc101631.png

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方法将新游戏添加进去,然后调用循环将远端服务中的所有的游戏在打印出来,我们运行程序

6720dd245100c32fa8e353519181ffa8.png

打印出了远程服务端的所有的游戏,这样我们就成功的在客户端通过AIDL来调用远程服务端的方法了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nubia ui 5.0 android,流畅度爆棚 搭Android 5.0系统新机一览

近期各品牌新机都不少,而且90%以上都是Android系统的手机,可见安卓手机的主导地位仍在上升。而在系统层次,Android 5.0已经逐步开始普及,近期上市新机百分百均采用了这一系统,值得一提的是定制不再“深度”&#xff0c…

html 百分比正方形,css实现未知宽度的正方形需求

今天群里有哥们问了一下,百分比宽度的正方形如何用css实现。其实就是不定宽的正方形如何用css实现。第一个方法利用图片的等比例缩放,用base64写一个1*1的透明png图片,宽度100%,这样容器就自动被撑成一个正方形,demo如…

html引用本地图片不能是桌面的,Img标签与本地文件:/// URL不显示在Microsoft Edge Web浏览器...

在我的桌面应用程序中,我创建了一个临时HTML文件(旨在让用户打印报告),然后通过默认显示网页浏览器。这个HTML文件保存在一个临时文件夹,例如:C:/Users/UserName/AppData/Local/TempImg标签与本地文件:/// URL不显示在…

怎么用计算机算立方数,计算器的使用方法

计算器人们都很熟悉,尤其是从事数据行业的人更要懂得如何使用计算器,那么外行人士想要正确使用计算器该怎么办呢?今天小编就来为您解围。计算器包括标准型和科学型两种,其中标准型使用方法如下:1、键入数字时,按下相应…

麻省理工学院计算机科学与工程博士,2020年麻省理工学院博士读几年

麻省理工学院(Massachusetts Institute of Technology),简称麻省理工(MIT),坐落于美国马萨诸塞州剑桥市(大波士顿地区) ,是世界著名私立研究型大学、被誉为"世界理工大学之最"。麻省理工学院博士读几年麻省理工学院博士一般读5年&a…

为什么计算机语言都是英语,编程为什么都是英语 编程为什么没有汉语

编程为什么都是英语?编程为什么没有汉语?一些想写编程但英语又不好的同学想知道编程为什么都是英语,为什么没有汉语,下面就让小编为大家介绍一下其实是有汉语编程语言的,感兴趣的小伙伴一起来看看吧,有一门…

学计算机随随便便上万,大学“最烧钱”专业排行榜,“家境一般”慎入,“土豪”请随意...

俗话说“高考七分考,三分报”,而这也意味着在高考当中不仅考试重要,在高考后的填报志愿也是非常重要的,因为填报志愿也代表着在大学期间学习什么专业,也代表着在毕业后会从事什么行业,所以报考专业一定要慎…

苏大计算机学院在哪,苏州大学和扬州大学都位于江苏,这两所大学,哪一所的实力更强?...

原标题:苏州大学和扬州大学都位于江苏,这两所大学,哪一所的实力更强?一个朋友问我这么一个问题:“苏州大学和扬州大学都位于江苏,这两所大学,哪一所的实力更强?”经常看到这么一句话…

计算机技术博客博客知乎,我的技术博客的选择:CSDN、博客园、简书、知乎专栏仍是Github Page?...

有不少技术人员在学习到必定程度后发现了写博客的重要性,一方面帮助本身记忆,一方面也能帮助他人解决问题,因而会选择本身开始写博客,以后又发现平台太多不知从何下手,在这里我根据本身写博客的经验比较一下各个平台的…

计算机文化基础重点知识归纳,计算机文化基础_第二章重点知识总结(考试必备!!!)...

操作系统:是管理软硬件资源、控制程序执行、改善人机界面、合理组织计算机工作流程和为用户使用计算机提供良好运行环境的一种系统软件。操作系统的四种特性:并发性、共享性、虚拟性、异步性。并发性:是指两个或两个以上的运行程序在同一时间…

c++生成光栅条纹程序_共享屋:一文让你认识光栅尺和编码器

坚持学习与健身,是对自己最大的投资每天进步一点点共享屋数控机床电气调试与维修微信:799309212大家好,我是共享屋,每天通过一篇文章分享我的经验与观察,希望能够给你一些启发或者帮助。分享的主题是有关数控机床电气调…

修改蓝牙耳机按键映射_喜欢玩游戏的不要错过了,五款高性能游戏蓝牙耳机推荐...

随着电竞行业的发展,不少人都会在休闲时打打游戏娱乐一下,尤其是手游火爆以后,玩游戏的人就更多了,像是王者荣耀,和平精英,穿越火线等等,几乎都是装机必备。不过现在的游戏需要有很好的声音呈现…

笔吧评测室所用测试软件,这是一台假游戏本:笔吧评测室 GIGABYTE 技嘉 Aero15 Classic-XA 游戏本 测评...

这是一台假游戏本:笔吧评测室 GIGABYTE 技嘉 Aero15 Classic-XA 游戏本 测评2019-05-09 17:20:5118点赞26收藏21评论经常看我们日常推送的同学们最近都获得了一个全新的知识点——高刷新率屏幕也有色彩差的了 !过去120Hz或者144Hz都至少搭载了72%NTSC色域…

https开头的网址是什么意思_我想打这个面试官,他给我挖坑,问我:URI中的 “//” 有什么用?...

我们在浏览网页的时候,需要在浏览器中输入http://或者https://开头的URL地址,类似http://honeypps.com,那么这里的"://"或者"//"有什么用呢?说到URL就不得不提URI了。用什么来标记服务器上的资源呢&#xff1…

计算机显卡型号中数字含义详解,显卡型号中字母和数字所代表的含义

来源于电脑组装网的DIY装机知识,自己只是复制粘贴,更多人分享,提有用的显卡型号中字母和数字所代表的含义作者: admin 来源: http://doc.xuehai.net 时间: 2012-12-22 阅读:3419次发表文章我们在组装电脑的时候,选择显卡肯定会比较慎重,显卡贵的要几千&a…

拖链电缆 机器人电缆_干货!拖链电缆用途及安装注意事项

拖链电缆主要应用于:工业自动化系统、生产流水线系统、焊机机器人、潜水器、等需要来回移动的场合。为了防止电缆纠缠、磨损、拉脱、挂和散乱,常把电缆放入电缆拖链中。拖链电缆用途普通拖链电缆具有弯曲性能、移动柔性、耐磨、耐油、抗拉等优点&#xf…

如果删除网上服务器登陆账号密码,怎么清除SVN的用户名和密码

有些时候如果我们保存了SVN的登录密码后,我们需要在同一台电脑上切换SVN用户或者清除我们已经保存的SVN用户名和密码,下面是学习啦小编给大家整理的一些有关清除SVN的用户名和密码的方法,希望对大家有帮助!清除SVN的用户名和密码的方法安装好…

使用场景_天然气重卡使用痛点及应用场景研究

【商车邦导读】天然气重卡在使用中存在哪些痛点?什么样的用户更适合购买天然气重卡?最近一段时间,虽然柴油价格处于历史低位,但天然气重卡依然持续热销,其中的原因主要有两点:一个是国六排放升级&#xff0…

sat2 计算机科目,2019-2020年SAT2考试时间及Top100大学要求

在CB官网上,你会发现一个长长的名单,上面列出了所有将SAT科目考试(即SAT2)视为入学招生要求的大学名录。虽然很多美国大学并没有强制性的要求学生提供SAT2考试成绩,但是如果你在考试中表现出色,这份成绩单将作为锦上添花为申请大学…

的setinterval函数_ES6 极简教程 lt;6gt; 函数扩展

1. 函数参数默认值用法如下{function test(x, y world) {console.log(默认值, x, y);}test(hello); // hello worldtest(hello, TH); // hello TH }2. rest 参数在不确定参数个数的时候,把输入的参数都转化为数组:注意: rest 参数后…