Activity startActivityForResult
Instrumentation execStartActivity
AMS startActivity
ApplicationThread scheduleLaunchActivity
ActivityThread.H handleMessage -> performLaunchActivity
Activity attach
Instrumentation callActivityOnCreate
可以使用lint工具,检测出没有用的文件,同时可以开启资源压缩,自动删除无用的资源。
尽量多使用可绘制对象,某些图像不需要静态图像资源,框架可以在运行时动态绘制图像。尽量自己写Drawable,能不用UI切图就不用,占用空间小。
重用资源。比如一个三角按钮,点击前三角朝上代表收起的意思,点击后三角朝下,代表展开,一般情况下,我们会用两张图来切换,我们其实完全可以用旋转的形式去改变。
…
利用提前展示出来的Window,快速展示出来一个节目,给用户快速反馈的体验,障眼法,治标不治本.
避免在启动时做密集沉重的初始化(Heavy app initialization)。
启动时 避免I/O操作,反序列化,网络操作,布局嵌套等耗时操作
如果父控件有颜色,也是自己需要的颜色,那么就不必在子控件加背景颜色
如果子控件有背景颜色,并且能完全覆盖父控件,那么父控件不用设置背景颜色
尽量减少不必要的嵌套
能用LinearLayout和FrameLayout,就不要用RelativeLayout,因为RelativeLayout相对比较复杂,测绘也相对耗时.
include和merge一起使用,增加复用,减少层级
ViewStub按需加载,更加轻便
复杂界面选择ConstraintLayout,可有效减少层级
频繁使用字符串拼接用StringBuilder或者StringBuffer
ArrayMap、SparseArray替换HashMap
避免内存泄漏
集合类泄漏(集合一直引用着被添加进来的元素对象)
单例/静态变量造成的内存泄漏(生命周期长的持有了生命周期短的引用)
匿名内部类/非静态内部类
资源未关闭造成的内存泄漏
检测内存泄漏的几个工具:LeakCanary,TraceView,Systrace,Android Lint,Memory Monitor+mat
集合类泄漏(集合一直引用着被添加进来的元素对象)
单例/静态变量造成的内存泄漏(生命周期长的持有了生命周期短的引用)
匿名内部类/非静态内部类
资源未关闭造成的内存泄漏
网络,文件等流忘记关闭
Service执行完成后忘记stopSelf()
EventBus等观察者模式的框架忘记手动解除注册
线程池 避免存在大量的Thread,重用线程池内部的线程,从而避免了线程的创建和销毁带来的性能开销,同时能有效控制线程池的最大并发数,避免大量线程因互相抢占系统资源而导致阻塞线现象发生。推荐阅读 《Android开发艺术探索》 第11章。
分类
FixedThreadPool 数量固定的线程池
CachedThreadPool 只有非核心线程,数量不定,空闲线程有超时机制,比较适合执行大量耗时较少的任务
ScheduledThreadPool 核心线程数量固定,非核心线程没有限制.主要用于执行定时任务和具有固定中周期的重复任务.
SingleThreadPool 只有一个核心线程,确保所有的任务在同一个线程顺序执行,统一外界任务到一个线程中,这使得在这些任务之间不需要处理线程同步 的问题. 优点
减少在创建和销毁线程上所花的时间以及系统资源的开销
不使用线程池有可能造成系统创建大量的线程而导致消耗完系统内存以及"过度切换" 注意点
重新设置LayoutInflater的Factory2,从而拦截创建View的过程,然后搞成自己的控件,想怎么换肤就怎么换肤.
这块暂时不懂,加入todo
www.jianshu.com/p/c8044b2c2…
Handler机制的关键在于对于ThreadLocal原理的理解,线程私有数据,利用ThreadLocal机制将Looper存放到线程内部,perfect !
应用层,应用框架层,系统运行库层,硬件抽象层和Linux内核层
SharedPreferences: 小东西,最终是xml文件中,key-value的形式存储的.
文件
数据库
ContentProvider
网络
View是Android中所有控件的基类
View适用于主动更新的情况,而SurfaceView则适用于被动更新的情况,比如频繁刷新界面。
View在主线程中对页面进行刷新,而SurfaceView则开启一个子线程来对页面进行刷新。
View在绘图时没有实现双缓冲机制,SurfaceView在底层机制中就实现了双缓冲机制。
隔壁老李头的系列文章非常棒,地址在这里
调用其他组件的对外提供的方法:之前看到过一种思路,利用"接口+实现"的方式,定义一个ComponentBase 中间层,然后里面有每个组件对外提供方法调用的Interface,每个组件在初始化的时候就把这些Interface给实现了,然后其他组件需要用的时候就从ComponentBase里面取。
界面跳转:ARouter
这个大家可以跟着hencoder老师的文章系统学习一下.
校验用户身份,校验数据的完整性
当Activity需要模块化的时候
不同设备上的适配,比如平台和手机
Activity相对Fragment而言,非常笨重,一般小界面小模块用Fragment比较合适.或者首页的tab之类的.
观察者模式,链式
不太了解原理,很少使用,好像也是基于观察者模式的一个框架。
主要是分析measure,layout,draw的过程。
Retrofit的话,源码写的非常非常棒.主要是通过动态代理+获取方法上面的注解等,然后组装请求网络的参数,最后用OkHttp去请求网络
OkHttp的拦截器链设计得非常巧妙,是典型的责任链模式.并最终由最后一个链处理了网络请求,并拿到结果.
事件传递大体过程: Activity--> Window-->DecorView --> View树从上往下
,传递过程中谁想拦截就拦截自己处理,MotionEvent是Android中的点击事件。
主要事件类型
ACTION_DOWN 手机初次触摸到屏幕事件
ACTION_MOVE 手机在屏幕上滑动时触发,会回调多次
ACTION_UP 手指离开屏幕时触发
我觉得anr就是在主线程做了耗时操作,比如io、读写文件、数据库操作等等。 anr发生之后一般会有日志,在/data/anr/traces.txt里面。
不是同一个。
Activity的attach方法,这里是为Activity实例化了一个PhoneWindow实例
Dialog的构造方法里面也是实例化了一个PhoneWindow实例
Activity里面实例化了一个Window,Window里面有一个DecorView(根布局)。
todo
如果一个View需要处理事件,它设置了OnTouchListener,那么OnTouchListener的onTouch方法会被回调。如果onTouch返回false,则onTouchEvent会被调用,反之不会。在onTouchEvent方法中,事件为Action,UP的时候会回调OnClickListener的onClick方法,可见OnClickListener的优先级很低。
这个确实不怎么了解,主要是不建议保活,提升用户体验,特别是安卓高版本,谷歌是封杀得很严格的,不建议保活。
先做一次测量,做完之后有空间剩余,有weight的View再测量一下,分一下剩余的空间。
先前有鸿神的AndroidAutoLayout,根据宽高进行控件缩放,非常经典,很多项目可能都还在使用,但是已经停止更新了。然后就是有名的今日头条方案,出来还是有点时间了。原理其实就是更改density。
屏幕的宽度=设计稿宽度 * density
然后有AndroidAutoSize库,将今日头条方案融合进去还完善了很多问题,易用,完美。
3. 其他
======
1. Java四种引用
强引用,默认就是,宁愿OOM,也不回收
弱引用,内存不够会被回收
软引用,GC时会被回收
虚引用,它的作用在于跟踪垃圾回收过程,在对象被收集器回收时收到一个系统通知。
2.项目中遇到的最困难的事情是什么?如何解决的?
每个人遇到的情况不同,这个提前思考一下自己做过的项目最有挑战的地方。
3.Git基本操作
4.Kotlin优势
完全兼容java
空安全
支持lambda表达式
支持扩展函数
更少的代码量,更快的开发速度
缺点就是有时候代码阅读性可能会降低。
5.Kotlin 协程是什么?
就是一个线程框架,提供了一套操作线程的api.
6.二叉树,广度优先遍历,深度优先遍历
推荐小灰的漫画算法
7.tcp,http,https,socket
8.敏捷开发
9.你经常使用哪些设计模式,常见设计模式的运用
10.3年之后工资怎么想的
11.你的优势
12.职业规划(3年后干啥,5年后干啥)
13.应用,进程,线程之间的区别
进大厂的诀窍
经过这几年的“摸爬滚打”,我发现进大厂确实有一些诀窍,对于和我一样背景一般的同学,只要你抓住了诀窍,进大厂不是梦。
**1)一定要提前准备,至少准备个一个月,**网上的面试题多看看,对于那些高频题目,带着理解去学习,实在不能理解的就背下来,大家高考的时候不都是背过来的。
2)大厂通常有很多部门,每个部门的hc数和招人标准都不一样,即便是同个部门,如果hr不同,标准肯定也不一样,**重复投简历可以增大我们拿到面试机会的概率。**同理,重复面试不同的部门,也可以增大我们进大厂的概率。
3)大厂经常会布局新业务,**新业务需要快速启动入场,hc通常会有很多,因此招人的标准会稍微降低,**这个时候是个绝佳的机会。我当时进的就是个新的业务部门。
面试系统复习路线
有时候,选择比努力更加重要,机遇比奋斗更加重要。但是,机会只留给有准备的人。我们只有时刻准备着,才能在机会到来的时候,去抓住它。
这里给大家分享一下我的面试复习路线,有需要的朋友可以参考一下:
1、看视频进行系统学习
前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
2、进行系统梳理知识,提升储备
客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
系统学习方向:
**架构师筑基必备技能:**深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO
**Android高级UI与FrameWork源码:**高级UI晋升+Framework内核解析+Android组件内核+数据持久化
**360°全方面性能调优:**设计思想与代码质量优化+程序性能优化+开发效率优化
**解读开源框架设计思想:**热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack
,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
2、进行系统梳理知识,提升储备
客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
系统学习方向:
**架构师筑基必备技能:**深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO
**Android高级UI与FrameWork源码:**高级UI晋升+Framework内核解析+Android组件内核+数据持久化
**360°全方面性能调优:**设计思想与代码质量优化+程序性能优化+开发效率优化
**解读开源框架设计思想:**热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack