深度思考:已经开发 8 年的你,为何跳槽被多家大厂拒绝?为什么会迷茫 Android 开发还有什么能学习的
安卓基础知识确实很多,如果日常积累不够的话确实比较头晕,比如我承认我只在 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、在外包待的时间太久,外包学习投
入的时间过多,技术上没什么长进
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 版》
学什么知道了,怎么学呢?
做得越多不见得越厉害,而是对自己的知识体系做总结。
我认为学习的阶段应该是这样的:
学习新知识--->灵活应用--->自我总结--->创造新知识
评论