Android面试官:看你简历上写熟悉-AIDL,说一说-oneway-吧

😎:oneway 是什么?跟 AIDL 没关系吧,我熟悉 AIDL 指的是使用 AIDL 接口进行跨进程通信。

面试官:AIDL 接口的方法可以用 oneway 修饰符来修饰,了解过这个修饰符的作用吗?

😎:可以提高性能吗?我觉得没必要使用,我从没用过,程序也跑的好好的,没出过什么问题。

面试官:好的,回去等通知吧


😨 业余时间经常打游戏、追剧、熬夜,目前月薪 15k

面试官:看你简历上写熟悉 AIDL,说一说 oneway 吧

😨:用 oneway 修饰的 AIDL 接口方法,是单向调用,不需要等待另一个进程的返回结果,所以方法的返回类型也只允许是 void.

面试官:怎么理解 “单向调用” ,有了解过它的实现原理吗?

😨:由应用进程到服务进程是通过 binder 驱动进行 IPC 通信的,单向的意思应该是应用进程只向 binder 驱动发送一次数据就结束返回,不再等待回复数据;而不用 oneway 修饰的方法需要等待 binder 驱动与服务端通信完后,再回复数据给应用端。

面试官:只向 binder 驱动发送数据吗?binder 驱动有没有回复应用?

😨:嗯… 我理解的是既然不需要返回值,所以没有回复吧

面试官:好的,回去等通知吧


🤔️ 坚持每天学习、不断的提升自己,目前月薪 30k

面试官:看你简历上写熟悉 AIDL,说一说 oneway 吧

🤔️:oneway 主要有两个特性:异步调用和串行化处理。异步调用是指应用向 binder 驱动发送数据后不需要挂起线程等待 binder 驱动的回复,而是直接结束。像一些系统服务调用应用进程的时候就会使用 oneway,比如 AMS 调用应用进程启动 Activity,这样就算应用进程中做了耗时的任务,也不会阻塞系统服务的运行。

串行化处理是指对于一个服务端的 AIDL 接口而言,所有的 oneway 方法不会同时执行,binder 驱动会将他们串行化处理,排队一个一个调用。

面试官:有了解过相关的 binder 协议吗?

🤔️:了解过,图会更直观一些,我来画一下图吧,首先是非 oneway 的情况:

如果是 oneway 的话,客户端就不需要挂起线程等待:

涉及到的 binder 命令也有规律,由外部发送给 binder 驱动的都是 BC_ 开头,由 binder 驱动发往外部的都是 BR_开头。

面试官:怎么理解客户端线程挂起等待呢?有没有实际占用 CPU 的调度?

🤔️:这里的挂起相当于 Thread 的 sleep,是真正的"休眠",底层调用的是 waiteventinterruptible() Linux 系统函数。

面试官:你是从哪里了解到 waiteventinterruptible() 函数的呢?

🤔️:在学习 Handle 机制的时候,Handle 中最关键的地方就是 Looper 的阻塞与唤醒,阻塞是调用了 nativePollOnce() 方法,当时对它的底层实现感兴趣,就去了解了一下,也学习到 Linux 用来实现阻塞/唤醒的 select、poll 和 epoll 机制

面试官:可以,我们再来聊聊别的。

文末

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

学习分享

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 24
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的 Android AIDL 示例代码: 首先,需要定义一个 AIDL 接口文件,例如 MyService.aidl: ``` package com.example.myservice; interface MyService { String getMessage(); } ``` 然后在服务端实现这个接口,例如 MyService.java: ``` package com.example.myservice; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class MyService extends Service { private final MyServiceImpl mImpl = new MyServiceImpl(); private static class MyServiceImpl extends IMyService.Stub { @Override public String getMessage() { return "Hello from MyService!"; } } @Override public IBinder onBind(Intent intent) { return mImpl; } } ``` 最后,在客户端绑定服务并调用接口方法,例如 MainActivity.java: ``` package com.example.myapplication; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import com.example.myservice.MyService; public class MainActivity extends AppCompatActivity { private MyService mService; private boolean mBound = false; private final ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = MyService.Stub.asInterface(service); mBound = true; // 调用 MyService 中定义的接口方法 try { String message = mService.getMessage(); TextView textView = findViewById(R.id.text_view); textView.setText(message); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { mService = null; mBound = false; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 绑定 MyService Intent intent = new Intent(); intent.setComponent(new ComponentName("com.example.myservice", "com.example.myservice.MyService")); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); } @Override protected void onDestroy() { super.onDestroy(); if (mBound) { unbindService(mConnection); mBound = false; } } } ``` 鉴于这只是一个简单的示例,实际的应用场景可能会更加复杂。需要注意的是,AIDL 接口中定义的方法的参数和返回值必须是支持跨进程传输的类型,例如基本类型、String、Parcelable 等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值