写点什么

深度思考:已经开发 8 年的你,为何跳槽被多家大厂拒绝?为什么会迷茫 Android 开发还有什么能学习的

用户头像
Android架构
关注
发布于: 33 分钟前

安卓基础知识确实很多,如果日常积累不够的话确实比较头晕,比如我承认我只在 APP 升级的时候搞过一个前台的 Service,但是面试的时候就会问你 Service 生命周期,如何绑定,如何跨进程通讯,如何关闭 Service 等等,你肯定不能说"我没用过我不会"。


所以我们就要复习,一来我们可以应付面试,二来我们也可以通过基础知识的积累来提高我们的能力。


主要知识点:


1.Activity 任务栈和 4 种启动模式关联性问题


2.IPC 非常重要,想要达到中级和高级的水平就必须要读懂,跨进程几种方式必须了解


3.Binder 肯定是必问的,当然还有 AIDL


4.自定义 View 的 draw measure layout 过程,事件的分发,拦截,处理,处理滑动冲突的思路,view 滑动的几种方式


5.动画的几种实现方式


6.Window 在 Android 里的作用。它和 Activity 和 View 的关系


7.四大组件的工作过程,这个确实有难度,按自己能力钻研吧,也别陷的太深 但是,四大组件的使用方式必须会,Service 的启动和绑定,广播的使用方法,写个简单 ContentProvider 这些都是必须的


8.Looper,Handler,MessageQueue 的关系


9.主线程为什么是主线程,如何开启线程,线程池和安卓常用的四种线程池 他们的特点和使用场景


11.AsyncTask 原理,并发问题,缺点等


12.如何面对大的 bitmap,如何自己设计一个 ImageLoader


13.其实可以扩展为,如何设计一个 okhttp,如何设计一个 retrofit,eventBus 等等


14.其实就考察对开源框架的认识和使用的熟练程度


15.如何避免和处理 Crash 和 ANR 16.优化篇,过度绘制,OOM,内存泄漏,布局优化,MAT, Lint


大厂相关面试题:


  • 有个问题很常见:你了解过哪些开源框架?

  • okhttp 或者 retrofit 必须了解一下底层原理,即使不能读好源码,也要看看别人是怎么分析的

  • 如今热更新和插件化特别火,一定要能说出来几种,并简单说明原理

  • MVC MVP MVVM 优缺点,一点要说出自己的切身体会

  • Fragment,生命周期和使用方法

  • Rxjava 尽量也看看

  • 注解机制,现在这么多使用注解的框架

  • Acitvity 的生命周期是什么样的?

  • Acitvity 的生命周期,如何摧毁一个 Activity? (美团)

  • Intent 显示跳转与隐式跳转,如何使用?(美团)

  • Activity A 跳转 B,B 跳转 C,A 不能直接跳转到 C,A 如何传递消息给 C?(美团)

  • Activity 如何保存状态的?

  • 请描述 Activity 的启动流程,从点击图标开始。(B 站)

  • 你会在什么情况下使用 Service?

  • startServer 和 bindServier 的区别?(美团)

  • Service 和 Thread 的区别?

  • IntentService 与 Service 的区别?

  • ContentProvider 如何自定义与使用场景是什么?

  • BroadcastReciver 的静态注册与动态注册的区别?

  • 广播的分类与工作原理


Java 基础知识


我是参照的《Thinking in Java》这个书和网上的博文,别的我也没买。网上 Java 的资料非常多,但是确实有很多写的不好,甚至有一些错误的,大家阅读要小心了。


主要知识点:


1.修饰符


2.类 接口 抽象类 匿名内部类 回调机制


3.几种基本类型,长度,边界


4.从 Iterator 到 Collection,再到 Set List Map(必问)


5.从以下几个角度理解学习:用法,具体实现类,线程安全性,底层数据存储结构,某些场景下如何选用?比如 ArrayList 和 LinkedList 如何选用 线程相关(必问)


6.锁机制 synchronize 用法


7.实现一个死锁


8.同步,生产者消费者模型


9.Thread 中的几个常用方法 比如问你 sleep 和 wait 区别


10.线程安全


11.JVM 了解一些,GC 了解一下,堆和栈的区别等


12.静态代理,动态代理 反射


13.设计模式 单例模式(要会写),工厂模式,抽象工厂,观察者模式等


大厂相关面试题:


  • 什么情况下会发生栈内存溢出?

  • 如果让你写一段栈溢出的代码你会什么写,一个栈大概有多大,为什么?每个线程都有这样大小的一个栈吗? (美团)

  • JVM 中一次完整的 GC 流程是怎样的,对象如何晋升到老年代?

  • 介绍下 GC 回收机制与分代回收策略。

  • Java 中有几种引用关系,它们的区别是什么?

  • GC 收集算法有哪些?它们的特点是什么?

  • 如何判断一个对象是否被回收,有哪些 GC 算法,实际虚拟机使用最多的是什么 GC 算法?(美团)

  • Jvm 内存 结构说一下。(东方头条)

  • JVM DVM ART 的区别(360)

  • 描述 GC 机制。Class 会不会回收?用不到的 Class 怎么回收?(东方头条)

  • StackOverFlow 与 OOM 的区别?分别发生在什么时候,JVM 栈中存储的是什么,堆存储的是什么?(美团)

  • Java 虚拟机和 Dalvik 虚拟机的区别?

  • 请描述 new 一个对象的流程。

  • Java 对象会不会分配到栈中?

  • String, Stringbuffer, StringBuilder 的区别是什么?(东方头条)

  • String StringBuffer StringBuilder 在进行字符串操作时的效率;这里主要考察 String 在内存中是如何创建的。(字节跳动)

  • String 为什么是不可变的?(字节跳动)

  • String 为什么设计成 final 的?

  • final 、finally、finalize 区别。

  • 抽象类和接口的区别。

  • 重载和重写的区别 (京东)

  • 什么是值传递和引用传递,Java 是值传递还是引用传递?


算法和数据结构


主要知识点:


1.数组,链表,队列,栈,图


2.不会直接问你,会让你找到用处,比如 Activity 任务栈


3.算法


4.基本几种排序复杂度和思路


5.几种查找复杂度和思路


6.串的处理


大厂相关面试题:


  • 如何在一个 1 到 100 的整数数组中找到丢失的数字? 腾讯

  • 如何在给定的整数数组中找到重复的数字? 小米

  • 如何在未排序整数数组中找到最大值和最小值? 字节跳动

  • 在 Java 中如何从给定数组中删除多重复制? 百度

  • 常用的数据结构有哪些? B 站

  • 一个数组插入删除查找和链表的效率对比?如果一个数组要反复插入删除怎么优化降低时间复杂度? 腾讯

  • arrayList 底层原理 滴滴 字节跳动

  • 如何在一次遍历中找到单个链表的中值? 中国平安

  • 如何证明给定的链表是否包含循环?如何找到循环的头节点? 优酷

  • 两个有交叉的单链表,求交叉点 华为如何得到单链表的长度? 360

  • 如何在不使用递归的情况下逆转单链表? 小米/美团

  • 怎么判断链表有环? 滴滴

  • 如何使用栈实现队列的功能?广州荔枝 FM

  • 两个栈实现一个队列 蘑菇街

  • 两个队列实现一个栈 腾讯

  • 对比一下队列和栈,以及它们底部实现 腾讯


推荐 LeetCode 刷题和读《剑指 offer》。


性能优化


主要内容:


1.ANR


2.内存溢出


3.内存抖动


4.内存泄漏


5.UI 卡顿


6.冷启动优化等方面


大厂相关面试题:


  • 内存优化,内存抖动和内存泄漏。(东方头条)

  • Bitmap 压缩,质量 100%与 90%的区别?(东方头条)

  • TraceView 的使用,查找 CPU 占用(东方头条)

  • 内存泄漏查找 (酷我音乐)

  • ANR 查找

  • ANR 是什么,怎么解决?(美团)

  • CPU 波动

  • 当前项目中是如何进行性能优化分析的

  • 冷启动、热启动的概念(酷我音乐)

  • View 层次过深怎么优化,选择哪个布局比较好?(美团)

  • 怎样检测函数执行是否卡顿 (字节跳动)

  • 什么时候会发生内存泄漏?举几个例子(美团)


学习 Android 路上的一些弯路(避坑)

在学习之路上,每个人都会走一些弯路,犯一些错误,前世之事后事之师,真心希望 Android 初学者不要重蹈我的覆辙。


1、在外包待的时间太久,外包学习投


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


入的时间过多,技术上没什么长进


2、没有早一点接触互联网技术


3、没有早一点拥抱开源,Github 上有那么多牛逼的代码,多读,多写,然后就拼天赋吧。


4、不要妄自菲薄,技术上不自信,认为自己写不了牛逼的代码


5、不要闭门造车,多关注最新技术,提高眼界


6、尽量不要接收二手知识,比如能看英文就不要看翻译版了


7、不要惧怕大块头的书,像 thinking in Java,算法导论,一天掌握一点,一年也差不多掌握了 8 不要过早地做管理,先写个五年代码再说


8、Java 基础一定要扎实,虽然说并不需要首先精通 Java 才能上手安卓,但良好的 Java 功底确实会有很大的帮助。


有句话叫做基础不牢,地动山摇,大家可以制定一个安卓学习计划:


第一步:书籍


我之前入手的第一本书就是 android 疯狂讲义,七八百页,其实我感觉我们不用全部都学,比如说动画、视频、传感器先可以不学,安卓疯狂讲义的有些设计不是很合理,把很多难的内容放到了前面。


没有做到从易到难,我们学的过程中可以先把一章整体看一下,然后再安排学习的顺序,把里面的每一个例子都自己敲一遍。因为我上下班坐公交车时间很长因此我都是在公交车上看书,这样一个月过去了,疯狂讲义的主要部分学了一遍。


第二步:视频


我看过收集的视频也很多,每天看 7 个,中间也有耽搁的这样过去了一个月,所有的看了一遍,主要的,难懂的看了两到三遍。


第三步:高仿项目


做完前两步,自己感觉水平应该可以了,于是就想去独立开发一个 app,但是还是不知道怎么下手,于是从网上找了几个开源项目,开始模仿去做,有仿新浪微博,仿美团,闹钟,这样过去了一个月,终于有些底气了。


第四步:android 官网


要想去安卓官网还需要翻墙,这个大家都懂,首先官网上面的 api guide 看一下,最后都能仿着写一遍代码,然后再把 training 上的几个例子也仿着写一遍。这样学上面的例子用了一个月。


第五步:独立开发 app


开始设想独立开发一款 app。


Android 学籍推荐


我 Android 开发快八年了,做为一名过来人的角度,给大家推荐几本书籍。


Android 开发,目前主要是以 java/ kotlin 语言为主,学习 Android 之前,最好要先学习 java 语言。对 java 语法,基本数据结构有一定的了解。


Java


1.《Effectve Java》


2.《Java 编程思想》


3.《深入理解 Java 虚拟机》


Android


1.入门的话,主要推荐郭霖的《第一行代码》书籍,写得通俗易懂。


2.进阶推荐两本书籍《Android 内核剖析》,《Android 开发艺术探索》


C++


学习完 Android 的话,想进阶的话,还要学习一下 C++,没错,现在很多疑难问题都是 native 层的,只有学习 C++,才能成为一名真正的高手。


1.《深度探索 C++对象模型》


2.《UNIX 环境高级编程 第 3 版》

学什么知道了,怎么学呢?

做得越多不见得越厉害,而是对自己的知识体系做总结


我认为学习的阶段应该是这样的:


学习新知识--->灵活应用--->自我总结--->创造新知识

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
深度思考:已经开发8年的你,为何跳槽被多家大厂拒绝?为什么会迷茫Android开发还有什么能学习的