自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 Android屏幕刷新机制

但是CPU/GPU写数据是不可控的,所以会出现buffer里有些数据根本没显示出来就被重写了,即buffer里的数据可能是来自不同的帧的, 当屏幕刷新时,此时它并不知道buffer的状态,因此从buffer抓取的帧并不是完整的一帧画面,即出现画面撕裂。帧率是动态变化的,例如当画面静止时,GPU 是没有绘制操作的,屏幕刷新的还是buffer中的数据,即GPU最后操作的帧数据。第一个Jank,是不可避免的。一秒内屏幕刷新的次数(一秒内显示了多少帧的图像),单位 Hz(赫兹),如常见的 60 Hz。

2023-11-13 14:05:38 42

原创 Starting window添加移除流程

前面提到Activity的启动是需要一个空白页或者截图页面过渡的,所以在系统进程收到的Activity的启动请求时,根据不同的场景分配不同的启动窗口类型,绘制启动出口startingwindow的移除时机在activity的绘制完成之后,当Activity完成绘制之后,Startingwindow的使命页结束了,所以移除。系统进程中的Activity,也就是窗口容器,activity窗口和启动窗口都是它的child,因此启动窗口的添加和移除都是由ActivityRecord负责。

2023-11-13 14:05:06 173

原创 黑屏分析~

这里对应的Window为应用界面,上面信息描述了该窗口的基本信息,重点需要关注mDrawState=HAS_DRAWN,mDrawState为窗口的绘制状态,HAS_DRAWN表示WMS已经完成该窗口的显示流程。当一个窗口刚刚被WMS执行addWindow()方法创建的时候,WindowStateAnimator在WindowState的构造函数中一起被创建,在relayoutWindow之前,窗口是没有Surface的,所以不可能被显示出来,此时状态就是NO_SURFACE。请求添加窗口记录,会在。

2023-11-13 14:04:34 108

原创 Activity启动过程

对于通过点击应用程序图标来启动Activity的情景来说,ActivityManagerService在这一步中,会调用startProcessLocked来创建一个新的进程,而对于通过在Activity内部调用startActivity来启动新的Activity来说,这一步是不需要执行的,因为新的Activity就在原来的Activity所在的进程中进行启动;

2023-11-13 14:02:11 15

原创 Activity窗口大小计算

窗口是否需要指定有额外的内容边衬区域和可见边衬区域。另一方面,如果测量出来的大小和当前大小一致,但是。窗口当前的宽度和高度的,但是它们的值是由应用程序进程上一次主动请求。窗口指定额外的内容边衬区域和可见边衬区域是为了放置一些额外的东西。窗口的大小以及内容区域边衬大小和可见区域边衬大小。窗口的大小以及内容区域边衬大小和可见区域边衬大小之后,如果。窗口的内容区域边衬大小和可见区域边衬大小分别保存在。窗口的内容边衬大小和可见边衬大小的,不过它们是由。服务计算得到的内容边衬大小和可见边衬大小,即。

2023-11-13 14:01:34 31

原创 SurfaceFlinger学习

对象的用法是有区别的。之所以会有这样的区别,是因为绘制应用程序窗口是独立的,由应用程序进程来完成,而设置应用程序窗口的属性却需要全局考虑,即需要由。元数据的缓冲区是需要按照一定的规则来访问的。对象的,但是它们的操作方式却不一样。指向已经使用了的缓冲区列表的头部。对象来描述,一个是在应用程序进程这一侧创建的,另一个是在。应用程序可能会有很多个窗口,而每一个窗口都有自己的。服务是运行在不同的进程中的,因此,它们采用。中的每一个已经使用了的缓冲区都对应有一个。对象来完成的,因此,位于应用程序进程和。

2023-11-13 14:00:58 14

原创 dumpsys window学习

4. 两个Activity窗口在切换过程,实际上就是前一个窗口显示退出动画而后一个窗口显示开始动画的过程,而在动画的显示过程,窗口的大小会有一个变化的过程,这样就导致前后两个Activity窗口的大小不再都等于屏幕的大小,因而它们就有可能同时都处于可见的状态。这里所说的窗口位置包括窗口在X、Y和Z轴的位置。1. 每一个Activity窗口的大小都等于屏幕的大小,因此,只要对每一个Activity窗口设置一个不同的Z轴位置,然后就可以使得位于最上面的,即当前被激活的Activity窗口,才是可见的。

2023-11-13 14:00:09 167

原创 WMS启动流程

进程中运行,但是会在不同线程中运行,如下所示。绑定,因此在其他进程中可以通过如下方式获取。创建过程中涉及到的类主要有。

2023-09-07 09:39:07 23

原创 SurfaceFlinger学习

对象的用法是有区别的。之所以会有这样的区别,是因为绘制应用程序窗口是独立的,由应用程序进程来完成,而设置应用程序窗口的属性却需要全局考虑,即需要由。元数据的缓冲区是需要按照一定的规则来访问的。对象的,但是它们的操作方式却不一样。指向已经使用了的缓冲区列表的头部。对象来描述,一个是在应用程序进程这一侧创建的,另一个是在。应用程序可能会有很多个窗口,而每一个窗口都有自己的。服务是运行在不同的进程中的,因此,它们采用。中的每一个已经使用了的缓冲区都对应有一个。对象来完成的,因此,位于应用程序进程和。

2023-09-07 09:38:27 16

原创 Robolectric测试

验证Activity生命周期以及Toast显示。

2023-09-07 09:37:16 22

原创 java多线程

如果创建的线程数还没有达到指定的核心线程数量,将会继续创建新的核心线程,直到达到最大核心线程数后,核心线程数将不在增加;如果核心线程数等于最大线程数,则当核心线程都处于激活状态时,任务将被挂起,等待空闲线程来执行。的类,一般来说,Runnable任务开辟在新线程中的使用方法为:new Thread(new RunnableTask())).start(),但在Executor中,可以使用Executor而不用显示地创建线程:executor.execute(new RunnableTask());

2023-09-07 09:36:38 23

原创 Framework学习

InputDispatcher:是 IMS 中的另一个关键组件,运行于一个独立的线程中,InputDispatcher 中保管来自 WMS 的所有窗口的信息,收到 InputReader 的输入事件后,会在其保管的窗口中寻找合适的窗口,并将事件派发给此窗口;ViewRootImpl:对某些窗口,如壁纸窗口,SurfaceView 的窗口来说,窗口就是输入事件派发的终点,而对其他的如Activity,对话框等使用了 Android 控件系统的窗口来说,输入事件的终点是控件;

2023-09-07 09:35:34 26

原创 Framework-view学习

sizeSpec大小是由父容器决定的,父容器DecorView的测量模式是MeasureSpec.EXACTLY,测量大小sizeSpec是整个屏幕的大小。由于performMeasure()方法调用了 View中measure()方法俩进行测量,由于DecorView继承自FrameLayout,是PhoneWindow的一个内部类,而FrameLayout没有measure方法,因此调用的是父类View的measure方法,因此从View的成员函数measure开始分析整个测量过程。

2023-09-07 09:34:46 15

原创 Fragment学习

自定义一个Fragment类,需要继承Fragment或者他的子类,重写onCreateView()方法 在该方法中调用:inflater.inflate()方法加载Fragment的布局文件,接着返回加载的view对象。在需要加载Fragment的Activity对应的布局文件中添加fragment的标签。在onCreate( )方法中调用setContentView()加载布局文件即可。定义Fragment的布局,即fragment显示内容。或replace()加载Fragment。

2023-09-07 09:33:56 25

原创 dumpsys window学习

4. 两个Activity窗口在切换过程,实际上就是前一个窗口显示退出动画而后一个窗口显示开始动画的过程,而在动画的显示过程,窗口的大小会有一个变化的过程,这样就导致前后两个Activity窗口的大小不再都等于屏幕的大小,因而它们就有可能同时都处于可见的状态。这里所说的窗口位置包括窗口在X、Y和Z轴的位置。1. 每一个Activity窗口的大小都等于屏幕的大小,因此,只要对每一个Activity窗口设置一个不同的Z轴位置,然后就可以使得位于最上面的,即当前被激活的Activity窗口,才是可见的。

2023-09-07 09:33:23 121

原创 Android系统框架以及开关机流程

Android系统总体框架Android系统启动过程是由图从下往上的一个过程:由Boot Loader引导开机,然后依次进入 -> Kernel -> Native -> Framework -> App 。Linux内核层:Android平台的基础是Linux内核,它提供了用于支持Android平台的设备驱动Linux操作系统和驱动,由C语言实现。借助Linux内核服务增加了一些面向移动计算的特有功能,实现硬件设备驱动,进程和内存管理,网络协议栈,电源管理,无线通信等核

2023-09-07 09:32:53 48

原创 Android事件分发机制

对于PhoneWindow来说,他持有一个DecorView的实例,DecorView就是Activity最顶层的view,在Activity的onCreate()方法中setContentView(Layout)的时候就是把这个传入的layout添加进了DecorView中。可以看见DecorView是直接调用了他父类的DispatchTouchEvent(). DecorView的父类是FrameLayout(FrameLayout的父类是ViewGroup)。

2023-09-07 09:30:48 8

原创 Android多进程

避免对象的内存泄漏(内存对象的泄漏,会导致一些不再使用的对象无法及时释放,这样很容易导致后续需要分配内存的时候,空闲空间不足而出现OOM。·避免在onDraw方法里面执行对象的创建(类似onDraw等频繁调用的方法,一定需要注意避免在这里做创建对象的操作,因为它会迅速增加内存的使用,而且很容易引起频繁的GC,甚至是内存抖动。OOM(内存溢出):是因为应用所需要分配的内存超过系统对应用内存的阈值,而抛出的 java.lang.OutOfMemoryError错误。·防止系统资源紧张(OOM)

2023-09-07 09:29:29 54

原创 Android 多线程

多个线程并发的操作UI组件,可能导致线程安全问题。Android只允许在UI线程(主线程)中修改Activity组件。实例:延时线程来模拟文件下载的过程。通过这个对象向主线程发送信息。指定延时多少毫秒后发送空信息。同时也会创建一个与其关联的。对象时会创建一个与之关联的。而发送的信息会先到主线程的。指定延时多少毫秒后发送信息。属性是否为指定对象的消息。()中重写处理消息的方法。写在主线程中(在主线程中。因为系统已经初始化了一个。线程的时候会初始化一个。作用就是发送与处理信息。在当前线程中要有一个。

2023-09-07 09:28:38 26

原创 Activity窗口大小计算

窗口当前的宽度和高度的,但是它们的值是由应用程序进程上一次主动请求。服务计算得到的,并且会一直保持不变到应用程序进程下一次再请求。服务主动请求应用程序进程修改的,修改后的值就会保存在。窗口不是第一次被请求执行测量、布局和绘制操作,并且。窗口是第一次被请求执行测量、布局和绘制操作,即。就等于屏幕的宽度和高度,否则的话,它的当前宽度。窗口的大小发生了变化,这时候变量。窗口的当前宽度和高度有时候是被。窗口当前的宽度和高度是保存在。窗口的大小变化进行处理。类的另外两个成员变量。服务来重新计算为止。

2023-09-07 09:28:00 25

原创 Activity、Service学习

中不同的启动方式,比如有两个不同的按钮,启动的是同一个。类,然后将需要暴露的方法都写到该类中。传递的数据可能不同,这里就可以用这个。进行通信,他们之间交流的媒介就是。对象,然后调用相关方法即可。返回一个我们自定义的。类中,实例化这个自定义。

2023-09-07 09:26:58 5

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除