腾讯高级Android开发面试总结

     年年寒冬都挡不住一个程序员想进大厂的心,这不,今年又开始着手找工作啦。不过令人比较惊喜的是我一开始更新简历,就有猎头找上门了,还就直接帮推了几个大厂tcl,腾讯,迅雷等几个大厂。一开始以为机会不大,没想到第二天就收到了腾讯的面试机会,特此记录一下,其他几个大厂暂时还没有面试通知,后续有了再整理。

    首先就是自我介绍,这一段主要就是介绍自己的一些工作经历,爱好什么的。

    然后就是问了一下简历上的项目经验,这一块是针对具体项目问的,不过总而言之,他想要知道的就是你这个项目的重点和难点,我就是没抓住重点,吃了亏,导致没把面试官往比较高大上的点引,也导致他觉得我做的这个项目比较low。然后就去问下一个项目了。

    最后说一下他问的一些通用的问题:

       1.如何在launcher上实现这样一个功能,就是生成一个图标,第一天显示,第二天不显示。

       其实这个问题主要归结于如何去隐藏图标,了解Launcher加载应用启动图标的过程之后,我们会发现Launcher加载应用图标在LauncherModel.java中的loadAllApps()方法完成,数组array_hide_app_icon中是所有需要隐藏图标的应用的包名和类名。可以把我们需要生成和隐藏的应用图标在这里进行实现,第一天加载,第二天不显示就去掉然后reload一下那个加载图标的方法。

       2.讲一下一个app是怎样被启动起来的?启动流程是怎么样的?

    回答一:   Activity的启动过程,我们可以从Context的startActivity说起,其实现是ContextImpl的startActivity,然后内部会通过Instrumentation来尝试启动Activity,这是一个跨进程过程,它会调用ams的startActivity方法,当ams校验完activity的合法性后,会通过ApplicationThread回调到我们的进程,这也是一次跨进程过程,而applicationThread就是一个binder,回调逻辑是在binder线程池中完成的,所以需要通过Handler H将其切换到ui线程,第一个消息是LAUNCH_ACTIVITY,它对应handleLaunchActivity,在这个方法里完成了Activity的创建和启动,接着,在activity的onResume中,activity的内容将开始渲染到window上,然后开始绘制直到我们看见。

   回答二:

(1)启动的起点发生在Launcher活动中,启动一个app说简单点就是启动一个Activity,那么我们说过所有组件的启动,切换,调度都由AMS来负责的,所以第一步就是Launcher响应了用户的点击事件,然后通知AMS

(2)AMS得到Launcher的通知,就需要响应这个通知,主要就是新建一个Task去准备启动Activity,并且告诉Launcher你可以休息了(Paused);

(3)Launcher得到AMS让自己“休息”的消息,那么就直接挂起,并告诉AMS我已经Paused了;

(4)AMS知道了Launcher已经挂起之后,就可以放心的为新的Activity准备启动工作了,首先,APP肯定需要一个新的进程去进行运行,所以需要创建一个新进程,这个过程是需要Zygote参与的,AMS通过Socket去和Zygote协商,如果需要创建进程,那么就会fork自身,创建一个线程,新的进程会导入ActivityThread类,这就是每一个应用程序都有一个ActivityThread与之对应的原因;

(5)进程创建好了,通过调用上述的ActivityThread的main方法,这是应用程序的入口,在这里开启消息循环队列,这也是主线程默认绑定Looper的原因;

(6)这时候,App还没有启动完,要永远记住,四大组建的启动都需要AMS去启动,将上述的应用进程信息注册到AMS中,AMS再在堆栈顶部取得要启动的Activity,通过一系列链式调用去完成App启动;

       3.和服务器进行连接,哪两个因素必不可少?

  Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信。

  我猜想面试官当时想的应该是http通信:必要因素应该是请求和响应。

  http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。

Socket通信中:

基于TCP/IP协议的通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。

而UDP则是提供无连接的数据报服务,UDP在发送数据报前不需建立连接,不对数据报进行检查即可发送数据包。。
 

       4.你用过protoBuf么?

         Protobuf是一种灵活高效可序列化的数据协议,相于XML,具有更快、更简单、更轻量级等特性。优点:高效且节省流量,缺点:可读性差!

       5.你讲一下glide?

这个我推荐这位大神的回答:https://blog.51cto.com/14541311/2456718?source=dra

以上就是这次面试总结的内容,这样一场高大上的BAT面试因为我的准备不足而草草结束,真是一次很大的遗憾,结局自然不言而喻,只是希望通过这次面试,能够让我警醒到表达能力还有很多不足,以后还要加强自己的表达能力和基础知识,争取早日进大厂!加油!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

景兄弟1366

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值