Activity知识点总结,高级UI都没弄明白凭什么拿高薪

3、分发事件,响应用户操作

4、Activity启动模式,实现自由切换

5、Activity页面间的数据传递

二、Activity生命周期

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

提到Activity就不的不提它的生命周期,系统通过模板模式将需要复写的方法暴露给开发者,然后开发者可以复写自己的逻辑在固定的方法中。Activity的生命周期有一下几种,他们都是成对出现的

onCreate是在Activity被创建的时候调用的只会调用一次,onDestroy是在Activity被销毁的时候调用

onStart是Activity处在可见但还没获取到焦点时候的会调动可调用多次,onStop是Activity不可见时候的回调 onResume是Activity可见并获取到焦点时的回调,这时可响应与用户的交互。onPause是Activity失去焦点的回调

如果因为内存不足导致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指定的任务

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

有任何问题,欢迎广大网友一起来交流,分享高阶Android学习视频资料和面试资料包~

偷偷说一句:群里高手如云,欢迎大家加群和大佬们一起交流讨论啊!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

24/03/13/H4lCoPEF.jpg" />

最后

有任何问题,欢迎广大网友一起来交流,分享高阶Android学习视频资料和面试资料包~

偷偷说一句:群里高手如云,欢迎大家加群和大佬们一起交流讨论啊!

[外链图片转存中…(img-DQ8ob31U-1712330337910)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值