关于Android UI组件的一些不得不了解的知识

最近整理了一下之前的一些代码,看了一下之前遇到的一些坑,总结了一下有关于视图这部分的问题,涉及到一些原理和工作流程,确实是不得不了解的知识,但是我觉得这些问题常常出现在面试当中,当面试官面带微笑的问出了你这些问题,哎呦,我好想大概知道怎么回事,但是不能表述的非常准确,那么就会被打负分哦,不多说这些了,直接看一下有哪些我们经常用到不是很熟悉或者不知道的知识吧:

Activity的启动过程:
Activity肯定是首当其冲,毕竟这个是最最最常用,没有之一的组件,我们都知道,activity不就是有一个栈吗?创建了生成,生命周期结束从栈顶收回,是的activity都保存在堆栈中,需要启动的activity的相关信息都保存在intent中,点击app图标启动时调用startActivitySately()方法,这个方法内部调用startActivty()方法,但是最终还会调用startActivityForResult()方法,因为它是有返回结果的,如果不需要返回结果,系统就会自动给-1,
而startActivityForResult()这个方法实际是通过Instrumentation类中的execStartActivity()方法来启动activity。

Activity的缓存方法:
缓存这个东西基本面试必问,那么activity到底是怎么样把数据内容保存起来的呢?
1.配置改变导致Activity被杀死,横屏变竖屏:在onStop之前会调用onSaveInstanceState()保存数据在重建Activity之后,会在onStart()之后调用onRestoreInstanceState(),并把保存下来的Bundle传给onCreate()和它会默认重建Activity当前的视图,我们可以在onCreate()中,回复自己的数据。
2.内存不足杀掉Activity,优先级分别是:前台可见,可见非前台,后台。

Service的生命周期,两种启动方法,有什么区别:
context.startService() ->onCreate()- >onStart()->Service running–>(如果调用context.stopService() )->onDestroy() ->Service shut down
1.如果Service还没有运行,则调用onCreate()然后调用onStart();
2.如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。
3.调用stopService的时候直接onDestroy,
4.如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。
context.bindService()->onCreate()->onBind()->Service running–>onUnbind() -> onDestroy() ->Service stop
1.onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。
2.这个时候会把调用者和Service绑定在一起,Context退出了,Service就会调用onUnbind->onDestroy相应退出。
3.所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。

View的绘制流程:
OnMeasure()——>OnLayout()——>OnDraw()
第一步:OnMeasure():测量视图大小。从顶层父View到子View递归调用measure方法,measure方法又回调OnMeasure。
第二步:OnLayout():确定View位置,进行页面布局。从顶层父View向子View的递归调用view.layout方法的过程,即父View根据上一步measure子View所得到的布局大小和布局参数,将子View放在合适的位置上。
第三步:OnDraw():绘制视图。ViewRoot创建一个Canvas对象,然后调用OnDraw()。六个步骤:①、绘制视图的背景;②、保存画布的图层(Layer);③、绘制View的内容;④、绘制View子视图,如果没有就不用; ⑤、还原图层(Layer);⑥、绘制滚动条。

View,Viewgroup的事件分发:
1丶Touch事件分发中只有两个主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个相关事件。View包含dispatchTouchEvent、onTouchEvent两个相关事件。其中ViewGroup又继承于View。
2丶ViewGroup和View组成了一个树状结构,根节点为Activity内部包含的一个ViwGroup。
3丶触摸事件由Action_Down、Action_Move、Aciton_UP组成,其中一次完整的触摸事件中,Down和Up都只有一个,Move有若干个,可以为0个。
4丶当Acitivty接收到Touch事件时,将遍历子View进行Down事件的分发。ViewGroup的遍历可以看成是递归的。分发的目的是为了找到真正要处理本次完整触摸事件的View,这个View会在onTouchuEvent结果返回true。
5丶当某个子View返回true时,会中止Down事件的分发,同时在ViewGroup中记录该子View。接下去的Move和Up事件将由该子View直接进行处理。由于子View是保存在ViewGroup中的,多层ViewGroup的节点结构时,上级ViewGroup保存的会是真实处理事件的View所在的ViewGroup对象:如ViewGroup0-ViewGroup1-TextView的结构中,TextView返回了true,它将被保存在ViewGroup1中,而ViewGroup1也会返回true,被保存在ViewGroup0中。当Move和UP事件来时,会先从ViewGroup0传递至ViewGroup1,再由ViewGroup1传递至TextView。
6丶当ViewGroup中所有子View都不捕获Down事件时,将触发ViewGroup自身的onTouch事件。触发的方式是调用super.dispatchTouchEvent函数,即父类View的dispatchTouchEvent方法。在所有子View都不处理的情况下,触发Acitivity的onTouchEvent方法。
7丶onInterceptTouchEvent有两个作用:1.拦截Down事件的分发。2.中止Up和Move事件向目标View传递,使得目标View所在的ViewGroup捕获Up和Move事件。

Android中touch事件的传递机制:
1.Touch事件传递的相关API有dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent
2.Touch事件相关的类有View、ViewGroup、Activity
3.Touch事件会被封装成MotionEvent对象,该对象封装了手势按下、移动、松开等动作
4.Touch事件通常从Activity#dispatchTouchEvent发出,只要没有被消费,会一直往下传递,到最底层的View
5.如果Touch事件传递到的每个View都不消费事件,那么Touch事件会反向向上传递,最终交由Activity#onTouchEvent处理
6.onInterceptTouchEvent为ViewGroup特有,可以拦截事件
7.Down事件到来时,如果一个View没有消费该事件,那么后续的MOVE/UP事件都不会再给它。

猜你喜欢

转载自blog.csdn.net/qq_39681405/article/details/86077985
今日推荐