正式加入字节跳动,分享一点面试小经验

今天正式入职了字节跳动。工号超吉利,尾数是3个6。然后办公环境也很好,这边一栋楼都是办公区域。公司内部配备各种小零食、饮料,还有免费的咖啡。15楼还有健身房。而且公司包三餐来着。下午三点半左右还会有阿姨推着小车给大家送下午茶。听说入职以后很容易长胖来着。不过如果想要保持身材的话,公司二楼还提供专门的健身餐。周二周四还可以预约专业的按摩服务,有效调理颈椎和腰椎。生活服务得这么贴心,感觉在这里就只需要好好工作就好了吧,哈哈

其实很早就和小伙伴们说要写一篇面试经验的。包括我为什么想要换工作,为了换工作做了什么准备,以及面试过程的一些分享。但是前段时间因为住院做了个小手术而耽误了。今天刚刚好现在在入职的熟悉时期。晚上的时候趁机把这篇写完,顺便也借机会完成一下我们组的新手村任务。各位有兴趣来字节跳动的朋友们,可以把简历发送给我邮箱,我来帮你内推哟。

一、Android基础

Android基础知识点比较多,看图。

建议阅读:

《Android开发艺术探索》

1. Activity

# Activity的四大启动模式,以及应用场景?

Activity的四大启动模式:

  • standard:标准模式,每次都会在活动栈中生成一个新的Activity实例。通常我们使用的活动都是标准模式。
  • singleTop:栈顶复用,如果Activity实例已经存在栈顶,那么就不会在活动栈中创建新的实例。比较常见的场景就是给通知跳转的Activity设置,因为你肯定不想前台Activity已经是该Activity的情况下,点击通知,又给你再创建一个同样的Activity
  • singleTask:栈内复用,如果Activity实例在当前栈中已经存在,就会将当前Activity实例上面的其他Activity实例都移除栈。常见于跳转到主界面。
  • singleInstance:单实例模式,创建一个新的任务栈,这个活动实例独自处在这个活动栈中。

# Activity中onStart和onResume的区别?onPause和onStop的区别?

首先,Activity有三类:

  • 前台Activity:活跃的Activity,正在和用户交互的Activity
  • 可见但非前台的Activity:常见于栈顶的Activity背景透明,处在其下面的Activity就是可见但是不可和用户交互。
  • 后台Activity:已经被暂停的Activity,比如已经执行了onStop方法。

所以,onStartonStop通常指的是当前活动是否位于前台这个角度,而onResumeonPause从是否可见这个角度来讲的。

2. 屏幕适配

# 平时如何有使用屏幕适配吗?原理是什么呢?

平时的屏幕适配一般采用的头条的屏幕适配方案。简单来说,以屏幕的一边作为适配,通常是宽。

原理:设备像素px和设备独立像素dp之间的关系是

px = dp * density

假设UI给的设计图屏幕宽度基于360dp,那么设备宽的像素点已知,即px,dp也已知,360dp,所以density = px / dp,之后根据这个修改系统中跟density相关的知识点即可。

3. Android消息机制

# Android消息机制介绍?

Android消息机制中的四大概念:

  • ThreadLocal:当前线程存储的数据仅能从当前线程取出。
  • MessageQueue:具有时间优先级的消息队列。
  • Looper:轮询消息队列,看是否有新的消息到来。
  • Handler:具体处理逻辑的地方。

过程:

  1. 准备工作:创建Handler,如果是在子线程中创建,还需要调用Looper#prepare(),在Handler的构造函数中,会绑定其中的LooperMessageQueue
  2. 发送消息:创建消息,使用Handler发送。
  3. 进入MessageQueue:因为Handler中绑定着消息队列,所以Message很自然的被放进消息队列。
  4. Looper轮询消息队列:Looper是一个死循环,一直观察有没有新的消息到来,之后从Message取出绑定的Handler,最后调用Handler中的处理逻辑,这一切都发生在Looper循环的线程,这也是Handler能够在指定线程处理任务的原因。

# Looper在主线程中死循环为什么没有导致界面的卡死?

  1. 导致卡死的是在Ui线程中执行耗时操作导致界面出现掉帧,甚至ANRLooper.loop()这个操作本身不会导致这个情况。
  2. 有人可能会说,我在点击事件中设置死循环会导致界面卡死,同样都是死循环,不都一样的吗?Looper会在没有消息的时候阻塞当前线程,释放CPU资源,等到有消息到来的时候,再唤醒主线程。
  3. App进程中是需要死循环的,如果循环结束的话,App进程就结束了。

# IdleHandler介绍?

介绍: IdleHandler是在Hanlder空闲时处理空闲任务的一种机制。

执行场景:

  • MessageQueue没有消息,队列为空的时候。
  • MessageQueue属于延迟消息,当前没有消息执行的时候。

会不会发生死循环: 答案是否定的,MessageQueue使用计数的方法保证一次调用MessageQueue#next方法只会使用一次的IdleHandler集合。

4. View事件分发机制和View绘制原理

刚哥的《Android开发艺术探索》已经很全面了,建议阅读。

5. Bitmap

# Bitmap的内存计算方式?

在已知图片的长和宽的像素的情况下,影响内存大小的因素会有资源文件位置和像素点大小

像素点大小: 常见的像素点有:

  • ARGB_8888:4个字节
  • ARGB_4444、ARGB_565:2个字节

资源文件位置: 不同dpi对应存放的文件夹

比如一个一张图片的像素为180*180pxdpi(设备独立像素密度)为320,如果它仅仅存放在drawable-hdpi,则有:

横向像素点 = 180 * 320/240 + 0.5f = 240 px
纵向像素点 = 180 * 320/240 + 0.5f = 240 px

如果 如果它仅仅存放在drawable-xxhdpi,则有:

横向像素点 = 180 * 320/480 + 0.5f = 120 px
纵向像素点 = 180 * 320/480 + 0.5f = 120 px

所以,对于一张180*180px的图片,设备dpi为320,资源图片仅仅存在drawable-hdpi,像素点大小为ARGB_4444,最后生成的文件内存大小为:

横向像素点 = 180 * 320/240 + 0.5f = 240 px
纵向像素点 = 180 * 320/240 + 0.5f = 240 px
内存大小 = 240 * 240 * 2 = 115200byte 约等于 112.5kb

# Bitmap的高效加载?

Bitmap的高效加载在Glide中也用到了,思路:

  1. 获取需要的长和宽,一般获取控件的长和宽。
  2. 设置BitmapFactory.Options中的inJustDecodeBounds为true,可以帮助我们在不加载进内存的方式获得Bitmap的长和宽。
  3. 对需要的长和宽和Bitmap的长和宽进行对比,从而获得压缩比例,放入BitmapFactory.Options中的inSampleSize属性。
  4. 设置BitmapFactory.Options中的inJustDecodeBounds为false,将图片加载进内存,进而设置到控件中。

二、Android进阶

Android进阶中重点考察Android Framework、性能优化和第三方框架。

1. Binder

# Binder的介绍?与其他IPC方式的优缺点?

Binder是Android中特有的IPC方式,引用《Android开发艺术探索》中的话(略有改动):

从IPC角度来说,Binder是Android中的一种跨进程通信方式;Binder还可以理解为虚拟的物理设备,它的设备驱动是/dev/binder;从Android Framework来讲,Binder是Service Manager连接各种Manager和对应的ManagerService的桥梁。从面向对象和CS模型来讲,Client通过Binder和远程的Server进行通讯。

基于Binder,Android还实现了其他的IPC方式,比如AIDLMessengerContentProvider

与其他IPC比较:

  • 效率高:除了内存共享外,其他IPC都需要进行两次数据拷贝,而因为Binder使用内存映射的关系,仅需要一次数据拷贝。
  • 安全性好:接收方可以从数据包中获取发送发的进程Id和用户Id,方便验证发送方的身份,其他IPC想要实验只能够主动存入,但是这有可能在发送的过程中被修改。

学习福利

【Android 详细知识点思维脑图(技能树)】

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

详细整理在GitHub点击可见;

Android架构视频+BAT面试专题PDF+学习笔记

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)**

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

android教学!Android开发人员不得不收集的代码,看看这篇文章吧!相关推荐

  1. Android开发人员不得不收集的代码(持续更新中)(http://www.jianshu.com/p/72494773aace,原链接)

    Android开发人员不得不收集的代码(持续更新中) Blankj 关注 2016.07.31 04:22* 字数 370 阅读 102644评论 479喜欢 3033赞赏 14 utilcode D ...

  2. [干货]Android开发人员不得不收集的代码(不断更新)

    代码地址链接:[干货]Android开发人员不得不收集的代码 为方便查找,已进行大致归类,其目录如下所示: 尺寸相关→SizeUtils.java dp与px转换 dp2px.px2dp sp与px转 ...

  3. 好东西(Android开发人员不得不收集的代码)

    各种帮助类汇总:https://github.com/Blankj/AndroidUtilCode 常用的 ios 风格 dialog 和 meterial design 风格的 dialog:htt ...

  4. Android开发人员不得不收集的代码

    各种帮助类汇总:https://github.com/Blankj/AndroidUtilCode 常用的 ios 风格 dialog 和 meterial design 风格的 dialog:htt ...

  5. Android开发人员不得不收集的代码(不断更新中...)

    尺寸相关 dp与px转换 sp与px转换 各种单位转换 在onCreate()即可获取View的宽高 ListView中提前测量View尺寸 手机相关 判断设备是否是手机 获取当前设备的IMIE,需与 ...

  6. Java开发人员不得不收集的代码

    前言 数据库相关的面试题早已成为了一线互联网大厂面试的家常菜,如果你对数据库不太熟悉,我劝你不要轻易面试大厂.那么,为什么数据库成了大厂面试的家常菜呢?主要原因当然还是海量数据. 无论对于刚入行的小白 ...

  7. Android开发人员不得不收集的代码,值得收藏!

    经历 坐标湖南,双非一本毕业.毕业后跟发小一起到深圳找工作.发小国防科大软件工程毕业.几乎没有太多周折,轻松入职了中国平安.像我这种双非渣本,随便在深圳拉一个外卖小哥出来学历可能都比我高. 前期找工作 ...

  8. Android开发人员不得不收集的代码,面试心得体会

    一.认识鸿蒙 鸿蒙 微内核是基于微内核的全场景分布式OS,可按需扩展,实现更广泛的系统安全,主要用于物联网,特点是低时延,甚至可到毫秒级乃至亚毫秒级. 鸿蒙OS实现模块化耦合,对应不同设备可弹性部署, ...

  9. Android开发人员不得不收集的代码,分享一点面试小经验

    一.背景介绍 从实用角度梳理一篇能够帮大家快速扫盲的CMake基础教程,也是对我目前负责项目的一次学习总结.既然选择从项目实用性考虑,下面的讲解内容可能并不一定完整,更多的是符合项目目前使用到的一些特 ...

最新文章

  1. 怎么重启网站mysql数据库_如何重启MySQL数据库服务
  2. python中的类属性和类方法_python面向对象之类属性和类方法的使用和实例
  3. Python应用实战-如何通过python对Excel进行常规性操作
  4. python字符集_Python任意字符集转换
  5. Discovering versions from the identity service failed when creating the password plugin.
  6. React 18 RC 版本发布啦,生产环境用起来!
  7. 53 MM配置-评估和科目设置-定义评估控制
  8. vijos1214——伤心的AsukaNoKaze
  9. 冰点文库下载器v3.2.9
  10. Git代码提交,固定日志模板
  11. c# mysql分页_c#-数据库分页查询
  12. 安全帽检测/人脸识别系统国标GB28181协议云服务EasyGBS搭建智慧工地 助力智慧建筑生态圈
  13. VSCode更改默认浏览器
  14. 全球与中国云计算数据中心IT资产处置(ITAD)市场深度研究分析报告
  15. 组播IGMP 自学笔记
  16. rpg人物制作软件_能够自己DIY角色的rpg游戏-可以自己DIY角色的rpg游戏大全_飞翔游戏专题...
  17. WebOffice安装教程Hello World!(win10 IE打开控件问题)
  18. 【iOS】网络操作与AFNetworking
  19. Vitamio多媒体开发框架
  20. 原癌基因和抑癌基因总结

热门文章

  1. linux jdk1.8 rpm安装全教程,含安装包
  2. 今天安利几个实用的电脑小技巧给你
  3. 中国移动看重利润高的5G用户,坐视老用户流失
  4. 用python实现字母图形
  5. android7.0版本手机,简直神速 安卓7.0新版本发布 老款安卓手机照样流畅运行
  6. 四款华为手机不建议买
  7. xxljob分布式配置文件
  8. 一文搞懂SQL注入攻击
  9. MOS管Qg的概念解析
  10. 寒假博客日记——第十一天