(源码截图是Android 5.1.1_r6)
一 App和Surface的关系是怎样的
不论是用Skia绘制二维图像,还是用OpenGL绘制三维图像,最终Application都要和Surface交互。Surface 是什么:
Handle onto a raw buffer that is being managed by the screen compositor.
由屏幕显示内容合成器(screen compositor)所管理的原始缓冲区的句柄,就像在C++语言中,可以通过一个文件的句柄,就可以获得文件的内容一样,通过Surface就可以获得原生缓冲器以及其中的内容,那App是怎么通过Surface获取的缓冲区去绘图的呢?
应用程序的外表是通过Activity显示的,首先我们来看一下Activity是怎么完成界面绘制工作的。从Activity启动开始跟。
Zygote在收到启动请求的时候,会fork一个子进程,这个子进程就是app的对应的进程,它的入口函数就是ActivityThread类的main函数,这个类里面有一个handleLaunchActivity函数,它就是创建Activity的地方。
然后接着看Activity创建的代码performLaunchActivity
Instrumentation.java
跳转到Activity attach中
Window是个抽象类,那当前Activity中的这个mWindow的具体实现类是哪个?
继续跟这个PolicyManager
这里获取了return 了 com.android.internal.policy.impl.Policy 的这个类 makeNewWindow(context)方法,继续跟Policy这个类
这里发现了,Activity中存在的Window是PhoneWindow。
然后继续Activity创建好后的方法handleResumeActivity();
这里三个方法都要跟,先看第一个r.getWindow.getDecorView();
r是ActivityClinetRecord 是Activity描述的类,对Activity进行了高度抽象,记录了Activity的各种信息,大家应该都清楚,这里就不再赘述了。
1.window.getDecorView。
ActivityClinetRecord记录着是是Activity的信息,所以这个window就是刚刚说的Activity里面的PhoneWindow,我们跟一下PhoneWindow这个方法
再看一下installDecor()方法,这个方法是不是有点眼熟,setContentView就是调的这个,我们看一下SetContentView
再跟一下这个installDecor
如果用户没有传这个layout,mContentParent就是decorView的子布局
再看一下generateLayout(mDecor)这个方法,方法太多截取了一下