技术点(Android)
一转眼三个月过去了,没有产出一篇博客的三个月。大抵是忙在Joy-Library上了…
作为一个Android工程师面试之前应该掌握哪些技能呢?或者说我们应该具备哪些技能才能称为一个优秀的工程师呢?
专业技能
-
Java
毋庸多说,Java作为基本功,必须达到熟练甚至精通的程度。
-
基本语法
static、final、volatile关键字
for、foreach、while、do-while循环
接口、抽象类、内部类、静态内部类 -
集合
List、Map、Set
ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet的实现原理 -
多线程
Thread和Runnable的区别和联系
多次start一个线程会怎样
线程有哪些状态
线程池的实现原理是怎样的
造成死锁的原因及排查方法
synchronized和ReentrantLock的区别
synchronized锁普通方法和锁静态方法的区别 -
IO
阻塞IO、非阻塞IO、多路复用IO、异步IO这四种IO模型
阻塞/非阻塞的区别
NIO的原理、NIO属于哪种IO模型、NIO的三大组成 -
Java虚拟机
Java虚拟机的内存布局
GC算法及几种垃圾收集器
Java内存模型
happens-before规则
volatile关键字使用规则 -
设计模式
23种设计模式
你的项目中用到了哪些设计模式,如何使用
知道常用设计模式的优缺点 -
数据结构和算法分析
数组、链表
栈和队列
树:AVL树、红黑树
排序算法(插入排序、希尔排序、快速排序、冒泡排序、选择排序、堆排序、归并排序、基数排序)
二分查找算法
-
-
Android
-
Activity => A => B,完整的生命周期
A: onCreate onStart onResume onPause
B: onCreate onStart onResume
A: onSaveInstanceState onStop -
从B返回A
B: onPause
A: onRestart onStart onResume
B: onStop onDestroy - Activity启动过程 (参考)
-
Activity、Window、View之间的联系 (参考)
Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图)
ActivityThread.performLaunchActivity() => Activity.attach() => new PhoneWindow()
Activity.setContentView() => Window.setContentView() => generate mDecor (new DecorView) => generate mContentParent (findViewById) -
ViewRootImpl.performTraversals() => performMeasure()、performLayout()、performDraw()
测量(Measure)
布局(Layout)
绘制(Draw) -
View.requestLayout()、invalidate()、postInvalidate() (参考)
requestLayout: 子View调用这个方法,会标记当前View及父容器,同时逐层向上提交,直到ViewRootImpl处理该事件,ViewRootImpl会调用三大流程,从measure开始,对每一个含有标记位的View及其子View都会进行测量、布局、绘制。
invalidate: 调用该方法会引起View树重绘,常用于内部调用(如: View.setVisibility)或者需要刷新界面的时候,需要在主线程中调用。
postInvalidate: 这个方法与invalidate的作用是一样的,都是使View树重绘,但两者的使用条件不同,postInvalidate是在非UI线程中调用,invalidate则是在UI线程中调用。 -
ViewGroup
dispatchTouchEvent: 用来进行事件分发,无论ViewGroup还是View的事件都是从这个方法开始的。
onInterceptTouchEvent: 在onInterceptTouchEvent中调用,表示是否拦截当前事件,返回true表示拦截,将不会把事件分发给子View。
onTouchEvent: 在onInterceptTouchEvent中调用,如果返回true表示消费当前事件,false表示不消费当前事件。
View
dispatchTouchEvent
onTouchEvent
Activity、ViewGroup、View(都不消费touch事件的情况)
按下:
Activity: dispatchTouchEvent -> ViewGroup: dispatchTouchEvent -> ViewGroup: onInterceptTouchEvent -> View: dispatchTouchEvent -> View: onTouchEvent -> ViewGroup: onTouchEvent -> Activity: onTouchEvent
抬起:
Activity: dispatchTouchEvent -> Activity: onTouchEvent -
IPC机制(Inter-Process Communication) (参考一) (参考二) (参考三) (参考四)
序列化与反序列化
AIDL
Binder
Bundle与Messenger - LruCache的原理及Lru算法
- IntentService
-
Handler、AsyncTask、Thread、HandlerThread、ThreadLocal
HandlerThread: HandlerThread自带Looper使它可以通过消息机制重复使用线程,节省开支。 示例
-
开源组件(熟练使用+熟悉原理)
RxJava、RxAndroid
Retrofit、OkHttp、Volley
Fresco、Glide、Picasso
Dagger2
EventBus3Okio(了解)
LeakCanary(会用) -
架构
MVC
MVP
MVVM
Clean Architecture -
开源项目
android-architecture
android-boilerplate
Android-CleanArchitecture
GithubClient - Android Studio、Gradle相关
-
Git相关
新建一个分支test(git branch -b test)
在test分支上修改后,提交这些修改(git add .)(git commit -m “changeLog”)
把test分支合并到develop分支上
推送develop到远程服务器
更新本地develop分支 -
各个插值器(Interpolator)的算法实现
AccelerateInterpolator
DecelerateInterpolator
AccelerateDecelerateInterpolator
LinearInterpolator
BounceInterpolator
PathInterpolator
CycleInterpolator -
四种launchMode的用法和不同之处
singleInstance
这种启动模式比较特殊,因为它会启动一个新的栈结构,将Activity放在这个新的栈结构中,并保证不会有其他Activity实例进入。
singleTask
如果在栈中有对应的Activity实例,则此Activity实例以上的其他Activity实例统统出栈,使此Activity实例成为栈顶实例。
singleTop
在栈中如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例。
standard
是默认的启动模式,不管栈中有没有已存在的实例,都生成一个新的,放在栈的顶部。 -
动画
补间动画
帧动画
属性动画 - ImageView中src和background的区别
-
持续更新…