IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Activity知识点总结,想进BTAJ -> 正文阅读

[移动开发]Activity知识点总结,想进BTAJ

如果因为内存不足导致Activity被销毁了,用户重新启动这个Activity生命周期会从onCreate开始

Activity意外关闭时会调用onSaveInstanceState我们可以在这里缓存一些数据,然后在Activity恢复的时候调用onRestoreInstanceState用户恢复数据,现在谷歌推出的Jetpack ViewModel也可以实现存储数据和恢复数据的功能,前者是缓存少量数据,后者用户缓存大量数据

onSaveInstanceState 是在onStop之前 Android系统版本大于9.0 在onStop之后,View States用于保存View状态,Instance States用户保存View States和开发者要保存的数据。Android系统会自动保存View的状态。

onRestoreInstanceState 是在onStart之后,开发者不能存储太大量数据,否则会导致在页面重建的时候卡顿。如果需要保存大量数据请使用Jetpack的ViewModle

2.1 常见场景生命周期调用


1、启动Dialog

是不会调用Activity生命周期的,因为不会经过AMS

2、启动一个透明的Activity

A onPause B onCreate onStart onResume

3、启动一个不透明的Activity

A onPause B onCreate onStart onResume A onStop

4、点击home键

onPause onStop

onPause 中不要做耗时的操作,因为会影响后面页面onResume导致卡顿

onStop 应用有可能被系统回收

设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法;

不设置执行横竖屏切换执行方法 onPause -> onStop -> onDestroy -> onCreate -> onStart -> onResume

2.2 对Activity生命周期的监听


监听Activity生命周期监控可以使用Jetpack的LifeCycle。使用一个隐藏的Fragment和观察者模式监控Activity的生命周期。

三、创建window,统一管理window

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

在Activity启动的时候,会调用生命周期onCreate,在onCreate的我们需要使用setContentView(view)把我们自定义的View设置到Activity管理的window中

这个window是PhoneWindow(每个Activity只有一个Window),PhoneWindow是管理用户自定义的View的类,他的内部是DecorView,我们定义的View是存储在DecorView中,content的位置。PhoneWindow是在Activity调用attach的是时候创建PhoneWindow

PhoneWindow是被WindowManager管理的,在Activity调用attach方法的时候,获取系统的WindowManager然后,根据PhoneWindow创建对应的WindowManagerImpl,而WindowManagerImpl中实际干活的是WindowManagerGlobal,WindowManagerGlobal是单例的管理整个应用所有的window,并提供与WMS通信的IWindowManager接口和IWindowSession接口

调用WindowManager的addView添加DecorView,addView内部会创建ViewRootImpl,然后调用ViewRoot的setView,ViewRootImpl管理和WMS通信,接收输入和Touch事件,负责整个View的通信。

ViewRoot的内部调用requestLayout开始测量客户端要绘制的自定义View,首先要发送异步消息,请求Vsync信号,在收到消息后就开始我们熟悉的measure layout draw

在draw的时候应用端会像SurfaceFlinger申请Surface用于绘制客户端自定义的view,然后提交到SurfaceFlinger,SurfaceFlinger将图像数据合成后提交到FrameBuffer中,然后绘制到手机屏幕上

四、分发用户点击事件,响应用户操作

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

用户输入或者点击屏幕的时候会把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进程启动


最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

【Android高级架构视频学习资源】

脉络 + 诸多细节**,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

[外链图片转存中…(img-eNErHwBT-1630497714279)]

【Android高级架构视频学习资源】

**Android部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-02 11:30:10  更:2021-09-02 11:31:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:45:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码