学习分享
在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了
很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘
如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。
2021最新上万页的大厂面试真题
七大模块学习资料:如NDK模块开发、Android框架体系架构…
只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。
这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
用户输入或者点击屏幕的时候会把event事件存储在/dev/input/eventXX的一个FD上
SystemService进程中有两个线程用于处理input事件
InputReader线程用于读取event
1、使用inotify监听fd的增加或者删除
2、使用epoll机制监听fd更改,处理Rawevent成KeyEvent、MotionEvent、TrackEvent
3、把event事件分发给InputDispather线程,应为在同一个进程所以可以直接添加到event队列中
InputDispatcher线程用于分发event 根据当前设备的状况来优先消化事件(该过程交由PhoneWindowManager.java来处理.最后,剩余事件分发给ViewRoot;ViewRoot再分发给IME输入法或View、Activity。
1、使用epoll机制等待event事件
2、InputChannel使用socket机制,将event事件发送给App进程
App进程
1、View的注册过程
每一个window有一个InputChannel对应一个Socket,InputChannel是在ViewRootImpl setView的时候创建的,同时也创建了时间接收的类WindowInputEventReceiver,addWindows时向WMS注册InputChannel用于接收event事件,WMS通过IM注册,IMS在向InputDispatcher注册,这样在收到event事件后就能想App进程转发event了
2、event事件接收
event事件发送过来第一个接收到的是InputEventReceiver的dispatchInputEvent方法,调用WindowInputEventReceiver onInputEvent,通过Handler发送input事件,使用责任链处理input事件,如果处理完通知systemService进程
3、event事件处理 event事件被调用WindowInputEventReceiver收到消息 event -> Hanlder -> DecorView -> PhoneWindow -> Activity, Activity -> PhoneWindow -> DecorView -> ViewGroup -> View
#####ViewGroup中分发
分发流程
dispatchTouchEvent -> onInterceptTouchEvent
处理流程
-> onTouch -> onTouchEvent -> onClick
=====================================================================================
ActivityRecord 是AMS用于管理App进程Activity的对象
TaskStack 是管理多个ActivityRecord的栈,栈顶的Activity表示获得焦点的Activity
ActivityStack 是管理多个TaskStack的栈,栈顶的TaskStack表示获取焦点的任务
ActivityStackSupervisior 管理多个ActivityStack,只有一个ActivityStack获取到焦点
1、standard 标准模式直接在TaskStack栈顶创建Activity对象
2、singleTop 如果要启动的Activity在TaskStack栈顶的话,不需要创建Activity,调动onNewIntent onResume,否则就创建一个Activity对象
3、singleTask 如果要启动的Activity在TaskStack栈中存在,将它上面的所有对象出栈,调用onNewIntent onResume,否则就创建一个Activity对象。singleTask模式下,任务取决于清单中配置的taskAffinity
4、singleInstance 启动Activity单独存在在一个TaskStack栈中,并整个应用只有一个这个对象
1、在xml中声明android:launchMode
2、使用Intent启动
FLAG_ACTIVITY_NEW_TASK类似singleTask当在清单中为Activity设置taskAffinity属性时,能跳转到指定任务,任务不存在创建任务
FLAG_ACTIVITY_SINGLE_TOP singleTop模式
FLAG_ACTIVITY_CLEAR_TOP类似singleTask,当Activity存在任务中,TaskStack都会出栈,从新创建入栈
FLAG_ACTIVITY_NO_HISTORY 被指定的 Activity 在跳转到其他 Activity 后,将从任务中移除
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 指定Activity不出现在最近应用列表中
taskAffinity 可指定Activity要关联的任务,默认情况任务名为包名
属性allowTaskReparenting = true 可以让改Activity从一个任务回签到taskAffinity指定的任务
============================================================================
无论是从Context还是Activity启动一个Activity都是调用startActivy,最后调用到Instrumentation的exeStartActivty,通过Binder通知AMS开始做Activity的启动的准备工作,在这里可以Hook Instrumentation实现对启动的Activity的拦截
SystemService进程AMS
1、PMS检测Activity是否存储
2、创建ActivityRecord记录Activity的所有信息
3、创建Token记录视图是否可以显示,通知WMS创建AppWindowToken
4、根据启动模式创建TaskStack
5、检测启动的进程是否存在,检测ProcessRecord ApplicationThread
6、如果不存在进程将ActivityTread作为参数通过socket通信传递给Zygote,开始fork进程
6.3.1 native层 启动Binder
1、open Binder 打开Binder驱动
2、mmap 内存映射
3、注册线程到Binder驱动
6.3.2 java层
执行ActivityThread main函数 1、Looper.prepareMainLooper 准备主线程 2、创建ActivityThread 3、attach 通知AMS进程创建成功,进行备案 4、Looper.loop 主线程Looper启动
赋值ProcessRecord,ApplicationThread,通知App SystemService已经备案成功
1、反射Application,关联Context
2、调用attachBaseContext
3、创建ContentProvider 4、调用onCreate
AMS scheduleLaunchActivity调用启动Activity App进程
1、创建ActivityRecordClient
2、performLaunchActivity
反射创建Activity关联Context
调用attach 创建PhoneWindow 创建WindowManager 关联Window.callback
总结
本文讲解了我对Android开发现状的一些看法,也许有些人会觉得我的观点不对,但我认为没有绝对的对与错,一切交给时间去证明吧!愿与各位坚守的同胞们互相学习,共同进步!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
为没有绝对的对与错,一切交给时间去证明吧!愿与各位坚守的同胞们互相学习,共同进步!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!