2024年最全Android之AIDL(进程间通信)(1),2024年最新面试要怎么练

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
第一,学习知识比较碎片化,没有合理的学习路线与进阶方向。
第二,开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

AIDL  IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级。它是使用代理类在客户端和实现端传递数据。

使用AIDL实现IPC 服务的步骤是:

1、首先创建aidl文件,该文件(YourInterface.aidl)定义了客户端可用的方法和数据的接口。它的定义方法与接口是一样的;(会在gen目录下面自动生成对应的YourInterface .java文件)

IRemoteService.aidl

package hb.android.aidl;

interface IRemoteService {

int getPid();

void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,

double aDouble, String aString);

}

IRemoteService2.aidl

package hb.android.aidl;

interface IRemoteService2{

void sysout();

String returnStr();

}

自动生成的java文件如图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2、  实现接口-AIDL编译器从AIDL接口文件中利用Java语言创建接口,该接口有一个继承的命名为Stub的内部抽象类(并且实现了一些IPC 调用的附加方法),要做的就是创建一个继承于YourInterface.Stub 的类并且实现在.aidl 文件中声明的方法。(一般是在服务中实现这个接口,在服务中使用IPC)

/**

  • 实现定义的aidl接口。

*/

private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {

public int getPid() {

return Process.myPid();

}

public void basicTypes(int anInt, long aLong, boolean aBoolean,

float aFloat, double aDouble, String aString) {

// Does nothing

System.out.println(“basicTypes”);

}

};

/**

  • 实现定义的aidl接口。

*/

private final IRemoteService2.Stub mBinder2 = new IRemoteService2.Stub() {

@Override

public void sysout() {

System.out.println(“This is IremoteService2.Stub.sysout()”);

}

@Override

public String returnStr() throws RemoteException {

return “This is IRemoteServicfe2.Stub.returnStr()”;

}

};

3、向客户端公开(暴露)接口-如果是编写服务,应该继承Service并且重载Service.onBind(Intent) 以返回实现了接口的对象实例

/**

  • 返回IBinder,在这里可以根据选择的接口进行返回哪一个 如果只有一个接口就不需要判断,直接返回就可以了。

*/

@Override

public IBinder onBind(Intent intent) {

if (IRemoteService2.class.getName().equals(intent.getAction())) {

return mBinder2;

}

if (IRemoteService.class.getName().equals(intent.getAction())) {

return mBinder;

}

return null;

}

4、 运行这个程序,那么服务就已经安装到系统了。接下来就是客户端访问服务,利用服务,进行进程间的通信。

下面再看看如何调用IPC 方法(Calling  an  IPC Method)

1、   声明.aidl 文件中定义的接口类型的变量和方法。

IRemoteService.aidl

package hb.android.aidl;

interface IRemoteService {

int getPid();

void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,

double aDouble, String aString);

}

IRemoteService2.aidl

package hb.android.aidl;

interface IRemoteService2 {

void sysout();

String returnStr();

}

2、   实现ServiceConnection

/**

  • ServiceConnection与Service想链接,IRemoteService.Stub.asInterface(service);

  • 会返回与当前的aidl文件相关的类的实例,这样就可以获取到远程的远程服务实现的IRemoteService接口了。

  • 注意如果一个ServiceConnection同一时刻只能与Service连接

  • 。如果需要同时连接一个服务里的多个aidl接口,那么必须定义两个ServiceConnection获取

  • ,因为一个ServiceConnection连接会返回一个aidl接口的实例。

*/

private ServiceConnection mConnection = new ServiceConnection() {

// Called when the connection with the service is established

public void onServiceConnected(ComponentName className, IBinder service) {

// Following the example above for an AIDL interface,

// this gets an instance of the IRemoteInterface, which we can use

// to call on the service

try {

if (service.getInterfaceDescriptor().equals(

IRemoteService.class.getName())) {

mIRemoteService = IRemoteService.Stub.asInterface(service);

mIRemoteService.basicTypes(0, 0, false, 0, 0, null);

}

} catch (RemoteException e) {

e.printStackTrace();

}

}

// Called when the connection with the service disconnects unexpectedly

public void onServiceDisconnected(ComponentName className) {

System.out.println(“Service has unexpectedly disconnected”);

mIRemoteService = null;

}

};

private ServiceConnection mConnection2 = new ServiceConnection() {

@Override

public void onServiceDisconnected(ComponentName name) {

System.out.println(“Service2 has unexpectedly disconnected”);

mIRemoteService2 = null;

}

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

try {

if (service.getInterfaceDescriptor().equals(

IRemoteService2.class.getName())) {

mIRemoteService2 = IRemoteService2.Stub

.asInterface(service);

mIRemoteService2.sysout();

}

} catch (RemoteException e) {

e.printStackTrace();

}

}

};

3、   调用Context.bindService(),传递ServiceConnection的实现

intent = new Intent(IRemoteService.class.getName());

System.out.println(IRemoteService.class.getName());

bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

intent2 = new Intent(IRemoteService2.class.getName());

System.out.println(IRemoteService2.class.getName());

bindService(intent2, mConnection2, BIND_AUTO_CREATE);

4、   在ServiceConnection.onServiceConnected()方法中会接收到IBinder对象,调用YourInterfaceName.Stub.asInterface((IBinder)service)将返回值转换为YourInterface类型

mIRemoteService = IRemoteService.Stub.asInterface(service);

mIRemoteService.basicTypes(0, 0, false, 0, 0, null);

5、   调用接口中定义的方法。应该总是捕获连接被打断时抛出的DeadObjectException异常,这是远端方法唯一的异常。

6、   调用Context.unbindService()断开连接;

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。

由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

1)]

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。

由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值