移动开发最新Activity知识点总结(1),2024历年字节跳动Android面试真题解析

面试复习路线,梳理知识,提升储备

自己的知识准备得怎么样,这直接决定了你能否顺利通过一面和二面,所以在面试前来一个知识梳理,看需不需要提升自己的知识储备是很有必要的。

关于知识梳理,这里再分享一下我面试这段时间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)

  • 架构师筑基必备技能
  • Android高级UI与FrameWork源码
  • 360°全方面性能调优
  • 解读开源框架设计思想
  • NDK模块开发
  • 微信小程序
  • Hybrid 开发与Flutter

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结:

Android开发七大模块核心知识笔记

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事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

五、Activity启动模式,实现页面自由切换

=====================================================================================

5.1 管理类


ActivityRecord 是AMS用于管理App进程Activity的对象

TaskStack 是管理多个ActivityRecord的栈,栈顶的Activity表示获得焦点的Activity

ActivityStack 是管理多个TaskStack的栈,栈顶的TaskStack表示获取焦点的任务

ActivityStackSupervisior 管理多个ActivityStack,只有一个ActivityStack获取到焦点

5.2 Activity启动模式


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栈中,并整个应用只有一个这个对象

5.3 设置启动模式


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不出现在最近应用列表中

5.4 与任务关联


taskAffinity 可指定Activity要关联的任务,默认情况任务名为包名

属性allowTaskReparenting = true 可以让改Activity从一个任务回签到taskAffinity指定的任务

六、Activity启动流程

============================================================================

6.1 启动App的进程


无论是从Context还是Activity启动一个Activity都是调用startActivy,最后调用到Instrumentation的exeStartActivty,通过Binder通知AMS开始做Activity的启动的准备工作,在这里可以Hook Instrumentation实现对启动的Activity的拦截

6.2 AMS准备工作


SystemService进程AMS

1、PMS检测Activity是否存储

2、创建ActivityRecord记录Activity的所有信息

3、创建Token记录视图是否可以显示,通知WMS创建AppWindowToken

4、根据启动模式创建TaskStack

5、检测启动的进程是否存在,检测ProcessRecord ApplicationThread

6、如果不存在进程将ActivityTread作为参数通过socket通信传递给Zygote,开始fork进程

6.3 App进程启动


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启动

6.4 AMS收到App进程启动消息


赋值ProcessRecord,ApplicationThread,通知App SystemService已经备案成功

6.5 App收到AMS备案成功消息


1、反射Application,关联Context

2、调用attachBaseContext

3、创建ContentProvider 4、调用onCreate

6.6 启动Activity


AMS scheduleLaunchActivity调用启动Activity App进程

1、创建ActivityRecordClient

最后

Android学习是一条漫长的道路,我们要学习的东西不仅仅只有表面的 技术,还要深入底层,弄明白下面的 原理,只有这样,我们才能够提高自己的竞争力,在当今这个竞争激烈的世界里立足。

人生不可能一帆风顺,有高峰自然有低谷,要相信,那些打不倒我们的,终将使我们更强大,要做自己的摆渡人。

资源持续更新中,欢迎大家一起学习和探讨。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

自然有低谷,要相信,那些打不倒我们的,终将使我们更强大,要做自己的摆渡人。**

资源持续更新中,欢迎大家一起学习和探讨。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值