| |
|
开发:
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
onPause 中不要做耗时的操作,因为会影响后面页面onResume导致卡顿 onStop 应用有可能被系统回收 设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法; 不设置执行横竖屏切换执行方法 onPause -> onStop -> onDestroy -> onCreate -> onStart -> onResume 监听Activity生命周期监控可以使用Jetpack的LifeCycle。使用一个隐藏的Fragment和观察者模式监控Activity的生命周期。 =================================================================================== 在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 ===================================================================================== ActivityRecord 是AMS用于管理App进程Activity的对象 TaskStack 是管理多个ActivityRecord的栈,栈顶的Activity表示获得焦点的Activity ActivityStack 是管理多个TaskStack的栈,栈顶的TaskStack表示获取焦点的任务 ActivityStackSupervisior 管理多个ActivityStack,只有一个ActivityStack获取到焦点
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进程 最后其实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 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |