深度思考:已经开发 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 版》
学什么知道了,怎么学呢?
做得越多不见得越厉害,而是对自己的知识体系做总结。
我认为学习的阶段应该是这样的:
学习新知识--->灵活应用--->自我总结--->创造新知识











 
    
评论