当前位置: 首页 > news >正文

Framework面试之(Binder)(Handler)脚踏大厂面试大赏

前言

framework的底层技术,在Android开发中的地位可谓是数一数二的存在。学好framework技术决定你在Android领域能找到好工作进大厂,拿高薪。话说的好:“面试造火箭,进厂拧螺丝”所以说你进大厂技术不厉害没事,但面试你一定要会说会讲。把面试题刷好一样能就进大厂。当然技术也是重要的,毕竟拧螺丝也是一门粗活。脚踏进大厂才能去考虑打螺丝的事。

那我今天就带来一部分有关:framework比较高刷的Binder&Handler两块技术点面试题分享。从我的《Android精选面试题库》抽取部分;如下:

1

Framework面试题

Binder篇

  1. Android为什么不用linux已有的IPC进程通信?
  2. Binder核心函数mmap的理解?
  3. mmap内存映射原理?

答案:

  • 进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域
  • 调用内核空间的系统调用函数mmap(不同于用户空间函数),实现文件物理地址和进程虚拟地址的一一映射关系
  • 进程发起对这片映射空间的访问,引发缺页异常,实现文件内容到物理内存(主存)的拷贝
  1. MVVM设计模式看mmap函数读写机制?
  2. Binder机制是如何跨进程的?
  • 传统的跨进程通信方式有很多,比如 Socket、信号量、管道、内存共享、消息队列等,这些都存在于 Linux 中。
  1. 一次拷贝是发生在客户端还是服务端
  2. Activity传递数据最大为什么是1M-8k
  • 答案:因为mmap函数的基本单位为页,而每页的大小为4K,也就是说有2页的数据是额外的数据,额外的数据是什么呢?参考一下http通信协议,http由请求行、请求头、请求体三部分组成,同样的道理,其实binder进行进程间通信也需要这些信息,因此留出来来8K的内存大小来传递请求头和请求行等信息,这8K的内容为系统自动配置的,我们无法使用这8K内存大小。具体到底层代码,底层copy_from_user方法,被调用了2次,第一次传递的数据大小为8K,第二次传递的数据大小为我们传递的真实数据内容,大小为1M-8k。
  1. 为什么activity间传递对象需要序列化
  • **答案:**跨进程调用可能是原因之一。还有是为了恢复被杀死的activity。有时候activity会因为很多原因被杀死,然后使用的时候再恢复。而一个app有多个入口点页面,如果不能序列化就不好恢复到某个acitivty。

Handler篇

  1. 多个handler往MessageQueue中添加数据,内部是如何确保线程安全的?
  2. looper,loop()为什么不会阻塞主线程?
  • 答案:因为主线程的Looper实在ActivityThread里面准备出来,创建出来的,那么其实我们Android程序也就是Java程序,你启动它,进入main方法,执行完所有的方法,也就会退出了 。写的代码就是通过handler驱动起来的,我们activity的onCreate、onResume、onStop等等这些生命周期方法,包括我们的UI绘制的信号,这些UI绘制的事件都是通过Handler Looper循环内部发起的,来调用回调我们的各个Activity,各个Fragment等等这样的一些组件里面的各个生命周期方法,我们的代码就是在循环里面执行的,所以不会阻塞。
  1. 简述Handler的实现原理
  • 答案:Android 应用是通过消息驱动运行的,在 Android 中一切皆消息,包括触摸事件,视图的绘制、显示和刷新等等都是消息。Handler 是消息机制的上层接口,平时开发中我们只会接触到 Handler 和 Message,内部还有 MessageQueue 和 Looper 两大助手共同实现消息循环系统。
  1. 延迟消息是怎么实现的
  • 答案:无论是即时消息还是延迟消息,都是计算出具体的时间,然后作为消息的when字段进程赋值。然后在MessageQueue中找到合适的位置(安排when小到大排列),并将消息插入到MessageQueue中。这样,MessageQueue就是一个按照消息时间排列的一个链表结构。
  1. 一个线程有几个Handler?

  2. 为什么handler会报内存泄漏?

  • 答案:因为是内部类持有外部类的对象,sendMessage的时候会调用到handler的enqueueMessage方法,msg.target = this; Message会持有handler,而handler持有调用handler的对象,所以gc不能回收

2

诶嘿,就举例这么多,面试题也不是几个就能全部覆盖的,毕竟面试官不是吃素的,换着花样问你。为什么有些不附上答案,因为文章篇幅长?[懒得写];想跳槽拿高薪的Android开发的朋友,我必须拿出这些个面试PDF文档 《Android精选面试文档》。想拿高薪的人很多,就看你能不能利用上 {卷王}

3

话说太多没用,好好刷题学技术。Android开发高级工程师人才必经少缺;强者为王,抢饭碗这件事都是为强者制定的。

相关文章:

  • Redis的不同系统安装教程
  • 几种Set的比较
  • 使用 ECK 在 Kubernetes 集群中管理 Elastic Stack
  • 在Qt中使用MySQL
  • java---SPFA算法---最短路(4)(每日一道算法2022.8.30)
  • 2382. 删除操作后的最大子段和--(phase2--day3)
  • 时间复杂度计算题
  • 不愧是阿里内部“千亿级并发系统架构设计笔记”面面俱到,太全了
  • SpringCloud之配置中心
  • C++征途 --- Stack(栈)容器和Queue(队列)容器
  • Mysql 用户权限设置 细分数据库、表操作
  • 车路协同、车联网、智慧交通、智能网联车、自动驾驶、无人驾驶、高精度地图
  • AtCoder Beginner Contest 266 A-G
  • 2022年全球MEMS传感器市场总体规模及应用细分研究报告
  • 设计模式之命令模式
  • 【Leetcode】101. 对称二叉树
  • 345-反转字符串中的元音字母
  • DataBase in Android
  • Django 博客开发教程 8 - 博客文章详情页
  • Fundebug计费标准解释:事件数是如何定义的?
  • Javascript弹出层-初探
  • PHP面试之三:MySQL数据库
  • Python3爬取英雄联盟英雄皮肤大图
  • springMvc学习笔记(2)
  • Vue 重置组件到初始状态
  • 使用common-codec进行md5加密
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • HanLP分词命名实体提取详解
  • ​ubuntu下安装kvm虚拟机
  • ​力扣解法汇总946-验证栈序列
  • # include “ “ 和 # include < >两者的区别
  • #14vue3生成表单并跳转到外部地址的方式
  • #Ubuntu(修改root信息)
  • $.ajax,axios,fetch三种ajax请求的区别
  • (02)vite环境变量配置
  • (1)SpringCloud 整合Python
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2)(2.10) LTM telemetry
  • (3)STL算法之搜索
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (翻译)terry crowley: 写给程序员
  • (利用IDEA+Maven)定制属于自己的jar包
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (四)Controller接口控制器详解(三)
  • (一)插入排序
  • .NET Framework .NET Core与 .NET 的区别
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .net连接MySQL的方法
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • [100天算法】-不同路径 III(day 73)
  • [17]JAVAEE-HTTP协议
  • [20150321]索引空块的问题.txt
  • [202209]mysql8.0 双主集群搭建 亲测可用