前一阵子在和一位技术总监闲谈中了解到,现在 Android Framework 成为头部公司必不缺少的技术栈]之一,尤其是熟悉 Franmework 源码的 Android 开发者,在面试中往往会占到很大的优势

那我今天就带来一部分有关:Framework 比较高刷的 Handler&Binder 两块技术点面试题分享

Handler 篇

looper,loop() 为什么不会阻塞主线程?

  • 因为主线程的 Looper 是在 ActivityThread 里面准备出来,创建出来的,那么其实我们 Android 程序也就是 Java 程序,你启动它,进入 main 方法,执行完所有的方法,也就会退出了
  • 我们写的代码就是通过 Handler 驱动起来的,我们 Activity 的 onCreate、onResume、onStop 等等这些生命周期方法,包括我们的 UI 绘制的信号,这些UI绘制的事件都是通过 Handler Looper 循环内部发起的,来调用回调我们的各个 Activity,各个 Fragment 等等这样的一些组件里面的各个生命周期方法,我们的代码就是在循环里面执行的,所以不会阻塞

简述 Handler 的实现原理

  • Android 应用是通过消息驱动运行的,在 Android 中一切皆消息,包括触摸事件,视图的绘制、显示和刷新等等都是消息
  • Handler 是消息机制的上层接口,平时开发中我们只会接触到 Handler 和 Message,内部还有 MessageQueue 和 Looper 两大助手共同实现消息循环系统。

延迟消息是怎么实现的

  • 无论是即时消息还是延迟消息,都是计算出具体的时间,然后作为消息的 when 字段进程赋值
  • 在 MessageQueue 中找到合适的位置(安排 when 小到大排列),并将消息插入到 MessageQueue 中;这样, MessageQueue 就是一个按照消息时间排列的一个链表结构

为什么 Handler 会报内存泄漏?

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

Binder 篇

Binder 的定向制导,如何找到目标 Binder,唤起进程或者线程呢?

Binder 实体服务其实有两种:

  • 一是通过 addService 注册到 ServiceManager 中的服务,比如 ActivityManagerService、PackageManagerService、PowerManagerService 等,一般都是系统服务;
  • 还有一种是通过 bindService 拉起的一些服务,一般是开发者自己实现的服务

这里先看通过 addService 添加的被 ServiceManager 所管理的服务

ServiceManager 是比较特殊的服务,所有应用都能直接使用,因为 ServiceManager 对于 Client 端来说 Handle 句柄是固定的,都是 0,所以 ServiceManager 服务并不需要查询,可以直接使用

Binder 为什么会有两棵 binder_ref 红黑树?

  • Binder_proc 中存在两棵 binder_ref 红黑树,其实两棵红黑树中的节点是复用的,只是查询方式不同,一个通过 Handle 句柄,一个通过 node 节点查找

  • refs_by_node 红黑树主要是为了 Binder驱动往用户空间写数据所使用的,而 refs_by_desc 是用户空间向 Binder 驱动写数据使用的,只是方向问题

比如在服务 addService 的时候,binder 驱动会在在 ServiceManager 进程的 binder_proc 中查找 binder_ref 结构体

Binder 是如何做到一次拷贝的

  • 用户空间虚拟内存地址映射物理内存中的
  • 虚拟内存读写实际上是对物理内存读写,这个过程就是内存映射

这个内存映射过程是通过系统调用 mmap() 来实现的 Binder借助了内存映射的方法,在内核空间和接收方用户空间的数据缓存区之间做了一层内存映射,就相当于直接拷贝到了接收方用户空间的数据缓存区,从而减少了一次数据拷贝

Binder机制是如何跨进程的

  • 在内核空间创建一块接收缓存区,
  • 实现地址映射:将内核缓存区、接收进程用户空间映射到同一接收缓存区

发送进程通过系统调用(copy_from_user)将数据发送到内核缓存区;由于内核缓存区和接收进程用户空间存在映射关系,故相当于也发送了接收进程的用户空间,实现了跨进程通信

就举例这么多了面试题也不是几个就能全部覆盖的,毕竟面试官不是吃素的,他会换着花样问你;有想跳槽拿高薪Android 开发的朋友,我这里分享一份 Handler、Binder 精选面试 PDF 文档私信发送 “面试” 直达获取;想拿高薪的人很多,就看你肯不肯努力了

面试题 PDF 文档内容展示:

Handler 机制之 Thread

Handler 机制之 ThreadLocal

Handler 机制之 SystemClock 类

Handler 机制之 Looper 与 Handler 简介

Android 跨进程通信 IPC 之 Binder 之 Framewor k层 C++ 篇

Android 跨进程通信 IPC 之 Binder 之 Framework 层 Java 篇

Android 跨进程通信 IPC 之 Binder 的补充

Android 跨进程通信 IPC 之 Binder 总结

小伙伴们如果有需要以上这些资料:私信发送 “面试” 直达获取,承诺100%免费!

大厂 Framework 面试必备 HandlerBinder 面试题相关推荐

  1. mysql面试必备考题(试题+答案)

    ✨ ✨ ✨

  2. 面试必备:《Java 最常见 200+ 面试题全面解析》

    春招在即,想让面试官在短短的几十分钟内就认可你的能力? 想在最快的时间内收获 Java 技术栈最核心的知识点? 想要更全面.更深入的了解 Java 技术? 这里能够给你想要的所有答案? 给准备面试的大 ...

  3. 华为js面试题_四面腾讯与华为,大厂前端面试真BT!

    今年算是经历颇多的一年了,腾讯和华为都走了几趟(一共面试了四个部门),拿了两个offer.(开心.png),但还是挂了两次,有点遗憾. 面试题总结 面试完之后,赶紧总结了一波,前端这个岗位,这两家大厂 ...

  4. 「面试必备」常见Java面试题大综合 马云见了都点赞

    一.Java基础 1.Arrays.sort实现原理和Collections.sort实现原理 答:Collections.sort方法底层会调用Arrays.sort方法,底层实现都是TimeSor ...

  5. 游戏必备组件有哪些_面试必备:2019Vue经典面试题总结(含答案)

    点击右上方红色按钮关注"web秀",让你真正秀起来 面试必备:2019Vue经典面试题总结(含答案) 一.什么是MVVM? MVVM是Model-View-ViewModel的缩写 ...

  6. 李洪强iOS经典面试题156 - Runtime详解(面试必备)

    李洪强iOS经典面试题156 - Runtime详解(面试必备)   一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...

  7. 大厂经典面试系列之三:唯品会大数据开发面试【建议关注收藏订阅,你早晚会用上】掌握了这些面试题,余生不在怕面试

    前言 上一篇文章总结了大厂经典面试系列之一:京东Java面试.接下来的文章我将陆续献上大厂的经典面试系列,所列的题目不代表所有,只是从面试者的口中总结的几次面试题,也是万千面试题的缩影,诣在帮助即将面 ...

  8. 算法面试必备-----数据分析常见面试题

    算法面试必备-----数据分析常见面试题 算法面试必备-----数据分析常见面试题 1.统计学问题 问题:贝叶斯公式复述并解释应用场景 问题:朴素贝叶斯的理解 问题:参数估计 问题:极大似然估计 问题 ...

  9. 算法面试必备-----数据库与SQL面试题

    算法面试必备-----数据库与SQL面试题 算法面试必备-----数据库与SQL面试题 1.数据库理论问题 问题:什么是数据库,数据库管理系统,数据库系统,数据库管理员? 问题:什么是元组,码,候选码 ...

最新文章

  1. 小米快传文件服务器怎么用,手机中的小米快传怎么用?小米快传的详细使用教程...
  2. 时间序列相关算法与分析步骤
  3. unity, 荧光效果(bloom)
  4. 用usecase获取需求的方法是否有缺陷,还有什么地方需要改进
  5. python中文版电脑下载-Python IDLE下载
  6. dot watch+vs code提升asp.net core开发效率
  7. python编一个答题程序_从0到1使用python开发一个半自动答题小程序的实现
  8. 海思3518E开发笔记1.2——海思SDK脚本学习
  9. 用linux搭建微信公众,搭建微信公众号后台——收发文本消息
  10. xp系统 共享文件夹服务器,WinXP如何共享文件夹?共享文件夹的方法
  11. CSDN去广告JS插件
  12. 手机电脑传文件?教你三种最简单的方法!
  13. wbarb matlab,图像的高频低频分解
  14. c 语言解析png图片文件信息,使用CImage加载PNG图片文件
  15. 【Web前端】彼岸の花——网上花店(网页制作)
  16. 匿名类的含义理解(多角度多案例通俗理解)
  17. 移动页面滚动穿透解决方案(荐)
  18. 挑战100天不停更hive sql 第25天 -场景题一 学生课程
  19. Spring5框架—— AspectJ
  20. fastreport打印ftp图片_C#:使用FastReport打印带图片传参模板的实现方法

热门文章

  1. linux命令选择一行,linux【管道命令 PIPE】选取命令、排序命令、双向从定向、比较工具...
  2. LeetCode斐波那契数列
  3. 苹果手机应用分身_【第一阶段B1】:苹果手机应用和疑问15例大纲、链接、汇总!...
  4. 抖音点不了赞一直显示服务器繁忙,抖音点不了赞怎么回事
  5. idea下载不了maven仓库的jar包(取消离线模式)
  6. EasyUI-draggable
  7. H5的draggable元素拖放属性
  8. Android 联想,雷电,mumu,游戏饭(长尾)游戏联运SDK接入
  9. js 获取本月第一天和最后一天,上月第一天和最后一天
  10. Network | 高颜值网络可视化工具(一)