1.底层C++
SufaceFlinger类图的静态结构
2.上层Java的调用流程。
首先,直接从WindowManagerService入手:
public int relayoutWindow(Session session, IWindow client, int seq,
WindowManager.LayoutParams attrs, int requestedWidth,
int requestedHeight, int viewVisibility, int flags,
Rect outFrame, Rect outContentInsets, Rect outVisibleInsets,
Configuration outConfig, Surface outSurface)
这个方法中有一句:
Surface surface = win.createSurfaceLocked();
创建Surface,然后继续跟下去,跟到了jni(android_view_Surface.cpp)的如下方法:
static void Surface_init(
JNIEnv* env, jobject clazz,
jobject session,
jint, jstring jname, jint dpy, jint w, jint h, jint format, jint flags)
{
if (session == NULL) {
doThrowNPE(env);
return;
}
SurfaceComposerClient* client =
(SurfaceComposerClient*)env->GetIntField(session, sso.client);
sp<SurfaceControl> surface;
if (jname == NULL) {
surface = client->createSurface(dpy, w, h, format, flags);
} else {
const jchar* str = env->GetStringCritical(jname, 0);
const String8 name(str, env->GetStringLength(jname));
env->ReleaseStringCritical(jname, str);
surface = client->createSurface(name, dpy, w, h, format, flags);
}
if (surface == 0) {
jniThrowException(env, OutOfResourcesException, NULL);
return;
}
setSurfaceControl(env, clazz, surface);
}
郁闷的是这个session又是如何初始化的,同样在android_view_Surface.cpp中:
static void SurfaceSession_init(JNIEnv* env, jobject clazz)
{
sp<SurfaceComposerClient> client = new SurfaceComposerClient;
client->incStrong(clazz);
env->SetIntField(clazz, sso.client, (int)client.get());
}
非常好,那么这个client就是和java层SurfaceSession构成了一一对应关系咯?事实的确如此。看java层的
SurfaceSession的定义,里面仅有的成员变量就是这个client:
public class SurfaceSession {
/** Create a new connection with the surface flinger. */
public SurfaceSession() {
init();
}
/** Forcibly detach native resources associated with this object.
* Unlike destroy(), after this call any surfaces that were created
* from the session will no longer work. The session itself is destroyed.
*/
public native void kill();
/* no user serviceable parts here ... */
@Override
protected void finalize() throws Throwable {
destroy();
}
private native void init();
private native void destroy();
private int mClient;
}
好了,现在回到java层继续看Surface。现在的概念应该很明确了,从本质上来说,Surface是由SurfaceSession创建的。那么SurfaceSession 又是由谁创建的呢? 既然SurfaceSession 是Session的成员变量,那么就顺藤摸瓜去看:
void windowAddedLocked() {
if (mSurfaceSession == null) {
if (WindowManagerService.localLOGV) Slog.v(
WindowManagerService.TAG, "First window added to " + this + ", creating SurfaceSession");
mSurfaceSession = new SurfaceSession();
if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
WindowManagerService.TAG, " NEW SURFACE SESSION " + mSurfaceSession);
mService.mSessions.add(this);
}
mNumWindow++;
}
那么windowAddedLocked又是谁调用的呢?在WIndowState.java中:
void attach() {
if (WindowManagerService.localLOGV) Slog.v(
WindowManagerService.TAG, "Attaching " + this + " token=" + mToken
+ ", list=" + mToken.windows);
mSession.windowAddedLocked();
}
那么这个attach又是谁调用的呢?WindowManagerService.java的一个方法,如下:
public int addWindow(Session session, IWindow client, int seq,
WindowManager.LayoutParams attrs, int viewVisibility,
Rect outContentInsets, InputChannel outInputChannel)
由于这个方法比较长,就不贴了,只看其中最关键的地方,其中有这么一句话:
win.attach();
经过这么一分析,清楚了,SurfaceSession是WindowManagerService在addWindow的时候创建的。而
Surface是在WIndowManagerService进行relayoutWindow时创建的。
- 大小: 54 KB
分享到:
相关推荐
GDI图形图像编程GDI图形图像编程GDI图形图像编程GDI图形图像编程GDI图形图像编程GDI图形图像编程GDI图形图像编程GDI图形图像编程GDI图形图像编程
封装了gdi++ 战时未支持声音 可做一般花的图形效果
GDI界面引擎.rar GDI界面引擎.rar GDI界面引擎.rar GDI界面引擎.rar GDI界面引擎.rar GDI界面引擎.rar
c# GDI 图形移动 wince .net
GDI图形解释GDI图形解释GDI图形解释
基于GDI+的图形绘制,同时支持缩放、拖动等基本功能。
第1章 GDI+ ——下一代图形接口 1.1 理解GDI+ 1.2 探索GDI+ 的功能 1.3 从GDI的角度学习GDI+ 1.4 .NET中的GDI+ 名称空间和类 总结 第2章 第一个GDI+ 应用程序 2.1 绘制表面 2.2 坐标系统 2.3 指南——第一...
一本不可多得的GDI+绘图书籍,网上GDI+介绍其实挺少的,研究GDI+绘图时,浪费了不少时间,找了很久,发现了一本好书,在万分激动的心情下,将此书分享给大家,希望在GDI+绘图上给您一些指导。
GDI+程序设计.pdf,书籍和随书源码。
易语言源码易语言GDI图形渲染源码.rar 易语言源码易语言GDI图形渲染源码.rar 易语言源码易语言GDI图形渲染源码.rar 易语言源码易语言GDI图形渲染源码.rar 易语言源码易语言GDI图形渲染源码.rar 易语言源码...
本程序使用GDI(图形设备接口)来进行windows图形编程,充分利用设备无关位图和面向对象的编程思想,实现了许多功能。比如:从工具栏选择颜色,更改绘图的线条的粗细,各式各样的绘图工具,选择不同工具时鼠标光标的...
GDI图形渲染.rar
GDI+ SDK与图形编程 GDI+ SDK与图形编程 GDI+ SDK与图形编程
GDI图形设计
c#技术文章-GDI图形图像编程;c#系列资料第一季
VC++图形图像处理 GDI编程基础到应用
使用GDI+绘制图形,GDI+的基本概念,GDI+中的基本结构和类,窗体中绘制图形的一些基本概念。
C# GDI图形图像截图例子是用C#实现的 类似于QQ截图功能的一个GDI图形图像的典型例子 值得一看。
GDI图形图像编程
易语言GDI图形渲染源码,GDI图形渲染,取指针,置指针,方法_置指针,new,delete,销毁,创建自窗口句柄,创建自DC,创建自图像,获取DC,释放DC,取混合模式,置混合模式,取渲染原点,置渲染原点,取混合品质,置混合品质,置平滑...