ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Android AIDL 教程 (一)—— 简单的示例,2024年最新ios内嵌h5页面
[打印本页]
作者:
缠丝猫
时间:
2024-6-19 18:04
标题:
Android AIDL 教程 (一)—— 简单的示例,2024年最新ios内嵌h5页面
在 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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4