如何拿下面试官?2019的一些面试实战小结告诉你!

今日头条屏幕适配的原理?

1:首先计算出 density,计算公式:当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位为 dp) = densitydensity 的意思就是 1 dp 占当前设备多少像素计算density 的原因:在布局文件中填写的是什么单位,最后都会被转化为 px,系统就是通过上面的方法,将你在项目中任何地方填写的单位都转换为 px

但是,今日头条适配方案默认项目中只能以高或宽中的一个作为基准,来进行适配

简述Android中的加固和使用平台?

加固:防止代码反编译,提高代码安全性

加固三方平台,梆梆安全,360加固,爱加密等
区别:梆梆安全,360加固看不到项目中的类,爱加密看的到Java类,单看不到里面的方法实现体,效果比前面差一点点

加固的底层原理:第三方加固的应用会生成一个Apk,然后把你的APK读取出来,在封装到这个第三方应用的APK里面.

如何对APK瘦身?

简述多渠道打包及原理和常用操作?

针对每一个渠道(应用市场)都生成一个带有渠道标识的apk文件

原理:用户下载启动应用,获取渠道标识,和设备的唯一标识,并上传到服务器里面,服务器这里就 会根据获取的记录,根据渠道号然后判断是否存在该服务器的表里面.(打标记,取标记,上传标记)

1)友盟多渠道打包:在清单文件中定义一个占位符,在gradle脚本中替换占位符(会使用到Python)

2)美团打包,在meta-data中创建一个空的文件,以文件名标识渠道,做一个解压与压缩的操作,速度会比较快

3)新一代多渠道打包,将渠道标识添加到.apk文件的末尾,并不会对源文件损坏

Android下的数据存储方式有那些?

Android开发下如何有效进行屏幕适配?

两种序列化相关

既然Google推荐Parcelable这种序列化,在这里,推荐一键生成序列化的插件,

在Android Studio里面搜索插件,如下图,写起序列化(根本不用你写)那就是一个美滋滋呐~

OkHttp相关?

ButterKnife相关?

Rxjava概念,常用操作符及拓展?

简介:

一款优雅的异步框架,代替之前的AsyncTask / Handler / XXX / …

其强大的操作符和链式写法,线程切换等有助于提高开发效率和快速定位Bug

与Retrofit搭配使用更是有意想不到的效果,

底层原理:观察者模式

等一些相应的博客

缺点:

1:操作符太多会增加学习成本时间

2:使用不好,容易导致内存泄露(解决方式,推荐Rxlifecycle结合Rxjava,规避内存泄漏风险)

ANR相关

ANR全名Application Not Responding, 也就是”应用无响应”. 当操作在一段时间内系统无法处理时, 系统层面会弹出上图那样的ANR对话框.

在Android里, App的响应能力是由Activity Manager和Window Manager系统服务来监控的. 通常在如下两种情况下会弹出ANR对话框:

A) 5s内无法响应用户输入事件(例如键盘输入, 触摸屏幕等).

B) BroadcastReceiver在10s内无法结束.

造成以上两种情况的首要原因就是在主线程(UI线程)里面做了太多的阻塞耗时操作, 例如文件读写, 数据库读写, 网络查询等等.

如何分析ANR?

ANR产生时, 系统会生成一个traces.txt的文件放在/data/anr/下. 开发人员可通过adb命令将其导出到本地 ($adb pull data/anr/traces.txt .)通过分析,我们可以根据具体的日志查看Anr原因( 如: 普通阻塞,CPU满负荷,内存泄露 )

Android中那些场景是执行在主线程的?

三级缓存:

内存泄漏:

如何进行内存泄露分析?

A: 通过Android Studio 窗口进行分析,查看内存分配情况,如果操作应用是内存一直往上涨说明存在内存泄露

B: 定位内存泄露分析的工具—-MAT(Memory Analyzer tool)

C: 使用开源库LeakCanary快速定位内存泄露

Android中的四大组件相关?

Activity:

Activity是一个应用程序组件,提供一个屏幕(狭义的理解就是当前APP的界面),用户可以用来交互为了完成某项任务。(点击,登录,跳转页面)

Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件(设置布局文件)。

在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。

Activity四种启动模式?

简述System.exit(0) 、onDestory()、Activity.finish()三者的区别

1)System.exit(0) 是你正常结束程序,kill 掉当前进程,针对的是整个Application

2)onDestory()方法是Activity生命周期的最后一步,资源空间等就被回收了。当重新进入此Activity的时候,必须重新创建,执行onCreate()方法.

3)Activity.finish()当你调用此方法的时候,系统只是将最上面的Activity移出了栈,并没有及时的调用onDestory()方法,也就是占用的资源没有被及时释放。

图片优化,以及图片加载框架的使用,如Picasso、 Fresco、Glide等?

Handle相关:

拓展

先简单介绍下你自己?

分析:除了向面试官做简单的基本自我介绍之外,还需向面试官展现自身对该职业所必须具备的一些自身特质,

比如,面试程序员职业需要间接的向面试官表示自己思维严谨,对细节的处理,理性思维,假设论证等等;面试产品等职业,需要向面试官通过自己的一些故事间接展现对产品的看法以及独特的思维个性等等

切入点:自身特质能否符合该职位的预期需求

对自己的期望和规划?

分析:职业发展规划表面上看是在考察你(求职者)、职位、公司三者之间长期的契合程度,但实际上,这么大的一个问题完全不是三眼两语间能够表达清楚的。面试官(无论HR还是专业部门的)主要是看你回答问题时的思路是否清晰,回答中表现出的工作态度如何,顺便看看你是否对公司和职位有足够的了解。所以不管答案如何,最关键的就是不能茫然。

切入点:依旧自身特点,对未来期望和规划需表述清晰,思维敏捷

谈谈自己的优点和缺点?

先谈缺点:

技术行业面试基本是由该岗位未来同事和上司进行。这种面试技术性强,行为问题主要考察就是你是否真心想做这个工作(而不是当跳板或者听说高薪体面而来)和你性格与文化是否相符。所有答案都应该围绕这两点组织(即每个经历都应回归到你通过这个经历学到什么,该职位所需关键技巧,这些经历为何让你想做这个工作,和该经历体现出你什么样的个人风格)。对这个问题因为好的回答而留下好印象很难,

关键是避免留下坏印象。

要点以下:

1)避免避重就轻,不要谈一个算不得缺点的缺点。比如熬夜会困,或者(待人接物)太客气等等。

2)避免谈非职业缺点,比如有感情洁癖,挑食,不擅长陪女友逛街,做饭经常不懂会煮糊。

3)避免谈到无法改善的弱点,比如我算数必须用计算器,我脑子不好用看书不理解。

4)避免谈到致命弱点,比如脾气怪异,不喜欢合作,迟到早退等。

那谈什么最好呢?我认为要点有三:

1)谈已经在改正的缺点/有明确计划来改正的缺点。尤其是你能够充分论证在近期就可以解决的缺点。

2)谈一个利用你的优点改正的缺点,顺便带出一个优点。(这是较高效的沟通技巧)

相对较好的回答:

1)喜欢追求细节导致项目/作业未能按期完成。通过时间管理能力改变工作方式,先完成框架再改善细节得以解决;

2)不知如何拒绝,同事要求帮忙一概揽下,影响自身工作进度。通过多任务处理能力设定优先顺序,以该优先顺序表向求助同事展示自己手上工作,并给其一个自己在何时可以给予帮助的时间估计,让求助人自行决定是否求助,问题解决

3)对处理同一问题的解决办法上,由于组员自己的技术偏好和技术构成不一样容易造成沟通障碍及影响项目计划,所以,应学会高效和有效沟通方式及工作技巧

最后

暂且分享这些,由于部分答案过长影响阅读,我已经整理成了一个PDF文档,关注+点赞,可以私信我【总结答案】,领取vx:xx13414521

当然,这段时间大家学习的时间比较多,看完文章后也可以学习我收集的这份1612页的面试指南,满满的都是干货,希望对大家有帮助!