Android AIDL 教程 (一)—— 简单的示例,2024年最新ios内嵌h5页面 ...

缠丝猫  金牌会员 | 2024-6-19 18:04:17 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 814|帖子 814|积分 2442


  • 在 AndroidManifet 配置 Service,将我们的 Service 暴暴露去。
将请求抽象成接口,编写 aidl 文件

一般来说, AIDL 文件支持以下类型


  • Java 编程语言中的所有原语类型(如 int、long、char、boolean 等等)
  • String
  • CharSequence
  • List
List 中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 可选择将 List 用作“通用”类(例如,List)。另一端实际接收的详细类始终是 ArrayList,但生成的方法使用的是 List 接口。


  • Map
Map 中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 不支持通用 Map(如 Map<String,Integer> 情势的 Map)。 另一端实际接收的详细类始终是 HashMap,但生成的方法使用的是 Map 接口。


  • 实现 Parceable 的自界说类型
注意事项


  • 在 aidl 文件中,除了 Java 编程语言中的所有原语类型、String、CharSequence、List、Map,其他在 AIDL 文件中用到的类,你必须使用 import 语句导入,否则会报错。
  • 当你使用实现Parceable 的自界说类型的时候,当其作为参数的时候,你必须为其制定是输入或者是输出参数。
in 表现输入参数,即服务端可以修改该类型
out 表现输出参数,即客户端可以修改该类型,客户端不行
inout 表现客户端和服务端都可以修改该类型

void onSuccess(int code,in MusicInfo musicInfo);
有人可能会这样想,既然 inout 表现客户端和服务端都可以修改该类型,那我们平常在写 aidl 文件的时候,直接在方法参数前面加上 inout 修饰就 OK了,省得去区分。
这样做法固然不行,既然两边都可以修改,那系统的开销肯定会比较大。就比如管道一样。
说了这么多,接下来让我们一起来看一下例子 IEasyService.aidl
package xj.musicserver.easy;
// Declare any non-default types here with import statements
interface IEasyService {
/**


  • Demonstrates some basic types that you can use as parameters
  • and return values in AIDL.
*/
void connect(String mes);
void disConnect(String mes);
}
这个 aidl 文件很接口,只有两个方法,connect 和 disConnect 方法。

这里我们把 aidl 文跟 Java 文件中放在一起,必要在 build.gradle 中配置
sourceSets {
main {
jniLibs.srcDirs = [‘libs’]
aidl.srcDirs = [‘src/main/java’]
}
}
关于怎样在 AndroidStudio 中引用 aidl 文件的,可以参考我的这一篇文章 AndroidStudio 引用 aidl 文件的两种方法
编写一个 Service,实现接口,处理客户端的请求,并将接口返回回去

public class EasyService extends Service {
private static final String TAG = “EasyService”;
public EasyService() {
}
IEasyService.Stub mIBinder=new IEasyService.Stub() {
@Override
public void connect(String mes) throws RemoteException {
LogUtil.i(TAG,“connect: mes =” + mes);
}
@Override
public void disConnect(String mes) throws RemoteException {
LogUtil.i(TAG, “disConnect: mes =” +mes);
}
};
@Override
public IBinder onBind(Intent intent) {
LogUtil.i(TAG,"onBind: intent = "+intent.toString());
return mIBinder;
}
@Override
public boolean onUnbind(Intent intent) {
LogUtil.i(TAG,“onUnbind: =”);
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
LogUtil.i(TAG,“onDestroy: =”);
super.onDestroy();
}
}
这个 Service 所做的动作就是当客户端毗连上的时候,会启动我们的 Service,此时会调用 Service 的 onBInd 方法,在 onBinder 方法内里,我们将 mIBinder (实现了 IEasyService.Stub 接口)返回回去。他充当客户端和服务端的桥梁,通过他我们可以进行通讯。
至于这个 IEasyService.Stub 是什么呢?其实当我们在 AndroidStudio 内里编写完 aidl 文件,重新 make project 一下,就会自动生成了。
将服务端的 Service 暴暴露去

在 AndroidManifest 文件下,配置 Service 的 action 及 exported 等信息。
其中 android:exported=“true” 表现别的历程可以访问,这个是必须配置的。android:process=“:remote” 表现运行在 :remote 历程,不配置的话默认运行所在的 App 历程,这个可以不配置。
<service
android:name=“.easy.EasyService”
android:enabled=“true”
android:exported=“true”
android:process=“:remote”>

客户端的实现



  • 将服务端的 aidl 文件 copy 过来,注意要放在同一个包下
  • 通过服务端 Service 的 Action 启动, 当启动 Service 成功的时候,将服务端返回的 Binder 保存下来并转化成相应的实例。
  • 之后假如想与服务端通讯,通过保存下来的 Binder,即可调用服务端的方法。
第一步:将服务端的 aidl 文件 copy 过来,注意要放在同一个包下



  • 第二步,通过服务端 Service 的 Action 启动, 当启动 Service 成功的时候,将服务端返回的 Binder 保存下来并转化成相应的实例
当我们点击按钮的时候,我们通过 Action 去启动远程 servic。
case R.id.btn_start_service:
LogUtil.i(TAG,“onButtonClick: btn_start_service=”);
Intent intent = new Intent(ACTION);
// 注意在 Android 5.0以后,不能通过隐式 Intent 启动 service,必须制定包名
intent.setPackage(XJ_MUSICSERVER);
bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
private static final String ACTION = “xj.musicserver.easy.IEasyService”;
private IEasyService mIEasyService;
ServiceConnection mServiceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mIEasyService = IEasyService.Stub.asInterface(service);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里不停到现在。
深知大多数Android工程师,想要提升技能,每每是自己探索发展或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易遇到天花板技能故步自封!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初志也很简单,就是盼望能够帮助到想自学提升又不知道该从何学起的朋侪,同时减轻大家的负担。







既有适合小白学习的零基础资料,也有适合3年以上履历的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目次大纲截图出来,每个节点内里都包罗大厂面经、学习条记、源码讲义、实战项目、讲解视频,并且后续会连续更新
假如你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)

推荐学习资料




  • 脑图



一个人可以走的很快,但一群人才能走的更远。岂论你是正从事IT行业的老鸟或是对IT行业感爱好的新人,都欢迎扫码到场我们的的圈子(技能交换、学习资源、职场吐槽、大厂内推、口试辅导),让我们一起学习发展!

加V获取:vip204888 (备注Android)**
[外链图片转存中…(img-ThI6KotD-1712766334144)]
推荐学习资料




  • 脑图
    [外链图片转存中…(img-3mNDmvLW-1712766334145)]
    [外链图片转存中…(img-gfKUOIDm-1712766334145)]
    [外链图片转存中…(img-gyGCLDoD-1712766334145)]
一个人可以走的很快,但一群人才能走的更远。岂论你是正从事IT行业的老鸟或是对IT行业感爱好的新人,都欢迎扫码到场我们的的圈子(技能交换、学习资源、职场吐槽、大厂内推、口试辅导),让我们一起学习发展!
[外链图片转存中…(img-QMBeRoaj-1712766334145)]

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表