Activity的启动过程?
https://hawksjamesf.github.io/blog/2018-03-15/framework-service-ams-component
从Context的startActivity说起,其实现是ContextImpl的startActivity,然后内部会通过Instrumentation来尝试启动Activity,这是一个跨进程过程,它会调用ams的startActivity方法,当ams校验完Activity的合法性后,会通过ApplicationThread回调到我们的进程,这是一个跨进程的过程,而ApplictionThread就是一个Binder.回调逻辑就是在Binder线程池中完成,所以需要通过Handler H将其切回UI线程,第一个消息是LAUNCH_ACTIVITY,对应着handleLaunchActivity,在这个方法里面完成了Activity的创建和启动,接着,在Activity的onResume中,Activity的内容将开始渲染到Window上面,然后开始绘制,直到我们可见。
Android的权限
涉及到的方法:checkSelfPermission() 主要功能检查权限
RequestPermissions:主要功能申请权限
ShouldShowRequestPermissionRationale()
onRequestPermissionResult()
Android中大图加载问题?
1.0图片采样率缩放:将图片按照一定比例缩放,降低分辨率,从而减少内存占用,具体用到BitmaoFactory.Options对象。
2.0利用BitmapRegionDecoder加载图片的一部分。(不仅不出现OOM,也不压缩)
BitmapRegionDecoder
网络协议=====TCP/UDP、TCP三次握手和四次挥手
应用层:http/ftp
网络层:IP
传输层:TCP/UDP
第一次握手:客户端向服务端发送报文,报文中设置标志位,生成随机序列号,客户端进入syn_sent状态。
第二次握手:服务端收到客户端报文,知道客户端请求建立连接,服务端给客户端发送报文,
第三次握手:客户端收到服务器的报文,检查ack标记位,并发送给服务端,服务端检查标记位,如果正确连接建立成功。完成三次握手
第一次挥手:客户端发送报文,标记位此时客户端进入fit wait状态,表示客户端没有数据发送给服务端
第二次挥手:服务端收到客户端发送的fit报文,然后给客户端发送一个报文,设置标志位,确认序列号,服务端进入close wait状态,表示客户端到服务端的发送连接断开。
第三次挥手:服务器发送报文到客户端,用来关闭服务器
第四次挥手:客户端收到服务器发送的标志位为 FIN 的报文,客户端进入到 CLIENT_WAIT 状态,等待2MSL
时间。然后发送一个标志位为 ACK = 1 的报文,确认序列号为 Ack = m+1
。完成四次挥手
线程池相关的问题?
为什么使用线程池?提高资源利用,减少重复创建线程,提高响应速度,具有可管理性(对当前的线程进行优化处理,减少创建和销毁线程带来的开销)
线程分类:四个构造:
1.0FixedThreadPool:线程数量固定的线程池,当线程处于空闲状态也不会回收,当所有线程是活动状态,会等待。
2.0CachedThreadPool:线程数量不等的线程池,只有非核心的线程,当数量很大时候,新的任务进来,就会创建新的线程,超时60秒
3.0ScheduledThreadPool:核心线程数量固定,非核心线程没有限制,用于执行定时任务和具有周期性的任务。
4.0SingleTrheadExecutor:只有一个核心线程,所有任务在一个线程中按照顺序执行,处理了线程同步。公测先来先上。
我整理了下,RxJava的主要作用如下: 1. 线程切换 2. 网络请求,本地数据等的数据源组合起来的处理 3. 将嵌套调用改为链式调用,流程更加清晰 但是,这个框架有9000+的方法数,有0.6M的包体积,还有众多操作符的学习成本。我感觉我以上说的“主要作用”,不足以弥补它在框架体积和学习成本上的缺点。但是为什么还是那么多人说这个框架好呢?请问,RxJava真正的优点在哪里? 个人理解 经过反复的思考,我认为“RxJava的应用场景到底在哪里?”的答案,应该到“什么是Rx”里找?先弄清楚“什么是Rx”,然后再思考RxJava可以给我们的项目带来什么好处? Rx是什么:Rx是一个基于响应式编程思想实现的函数库,让开发者可以利用可观察序列和LINQ风格查询操作符来编写异步和基于事件的程序(可以这样定义:Rx=Observable + LINQ + Schedule) 因此,RxJava的应用场景其实应该从其特点(Observable-事件,LINQ-链式操作符,Schedule-线程,响应式编程)出发。能够发挥其特点帮助开发者更快速高效的进行开发的场景,就是RxJava的应用场景。 应用RxJava的目的: 1. 项目中,存在大量复杂的操作(包括UI反馈,网络请求等)。这些操作会引出一连串业务处理(包括UI刷新,DB处理等),通过RxJava将操作转化为Observable,再通过响应式编程链式调用来实现业务,可以让业务处理的流程更加清楚,改动业务更灵活。 2. RxJava提供了大量操作事件的操作符,这些操作符的功能涵盖了项目开发中大部分的应用场景,使用这些操作符API,可以减少开发成本,事半功倍。 3. RxJava提供了方便的线程切换操作,切换线程不再需要用到Handler之类的操作了。加大开发效率,提升代码清晰度。
RXJAVA
https://www.jianshu.com/p/031745744bfa
https://gank.io/post/560e15be2dca930e00da1083
https://www.jianshu.com/p/a9ebf730cd08
自定义View的绘制,SurfaceView的原理,view的onMeasure、onLayout和onDraw的方法执行意义等。还有关于手势事件的分发机制和滑动冲突的处理。其他的一些系统常用控件的源码分析也很必要,比如ListView和RecyclerView的区别缓存机制、viewPager的页数缓存实现原理
视频学习地址:http://v.qq.com/vplus/56c7ec6c231bdbafd198c58fb86eb4dc/videos