- 浏览: 23759 次
- 性别:
- 来自: 北京
最新评论
page4
我们看一下ViewRootImpl对象的创建过程, ViewRootImpl类的声明如下:
public final class ViewRootImpl implements ViewParent,
View.AttachInfo.Callbacks, HardwareRenderer.HardwareDrawCallbacks
ViewRootImpl类的构造函数定义如下:
1 public ViewRootImpl(Context context, Display display) {
2 super();
3
4 if (MEASURE_LATENCY) {
5 if (lt == null) {
6 lt = new LatencyTimer(100, 1000);
7 }
8 }
9
10 // Initialize the statics when this class is first instantiated. This is
11 // done here instead of in the static block because Zygote does not
12 // allow the spawning of threads.
13 mWindowSession = WindowManagerGlobal.getWindowSession(context.getMainLooper());
14 mDisplay = display;
15
16 CompatibilityInfoHolder cih = display.getCompatibilityInfo();
17 mCompatibilityInfo = cih != null ? cih : new CompatibilityInfoHolder();
18
19 mThread = Thread.currentThread();
20 mLocation = new WindowLeaked(null);
21 mLocation.fillInStackTrace();
22 mWidth = -1;
23 mHeight = -1;
24 mDirty = new Rect();
25 mTempRect = new Rect();
26 mVisRect = new Rect();
27 mWinFrame = new Rect();
28 mWindow = new W(this);
29 mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion;
30 mInputMethodCallback = new InputMethodCallback(this);
31 mViewVisibility = View.GONE;
32 mTransparentRegion = new Region();
33 mPreviousTransparentRegion = new Region();
34 mFirst = true; // true for the first time the view is added
35 mAdded = false;
36 mAccessibilityManager = AccessibilityManager.getInstance(context);
37 mAccessibilityInteractionConnectionManager =
38 new AccessibilityInteractionConnectionManager();
39 mAccessibilityManager.addAccessibilityStateChangeListener(
40 mAccessibilityInteractionConnectionManager);
41 mAttachInfo = new View.AttachInfo(mWindowSession, mWindow, display, this, mHandler, this);
42 mViewConfiguration = ViewConfiguration.get(context);
43 mDensity = context.getResources().getDisplayMetrics().densityDpi;
44 mNoncompatDensity = context.getResources().getDisplayMetrics().noncompatDensityDpi;
45 mFallbackEventHandler = PolicyManager.makeNewFallbackEventHandler(context);
46 mProfileRendering = Boolean.parseBoolean(
47 SystemProperties.get(PROPERTY_PROFILE_RENDERING, "false"));
48 mChoreographer = Choreographer.getInstance();
49
50 PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
51 mAttachInfo.mScreenOn = powerManager.isScreenOn();
52 loadSystemProperties();
53 }
第13行(ViewRootImpl->ViewRootImpl)会调用WindowManagerGlobal的getWindowSession函数, 关于getWindowSession函数的详细分析可以参考page5文件.
第28行(ViewRootImpl->ViewRootImpl)会创建一个W类型的对象, 并用该对象来初始化成员变量mWindow. 关于W类型的构造过程可以参考page7文件.
第41行(ViewRootImpl->ViewRootImpl)会创建一个AttachInfo对象, 表示ViewRootImpl所依附的Window的信息, 并用该AttachInfo对象初始化成员变量mAttachInfo.
page5
我们分析一下WindowManagerGlobal的getWindowSession函数的实现:
1 public static IWindowSession getWindowSession(Looper mainLooper) {
2 synchronized (WindowManagerGlobal.class) {
3 if (sWindowSession == null) {
4 try {
5 InputMethodManager imm = InputMethodManager.getInstance(mainLooper);
6 IWindowManager windowManager = getWindowManagerService();
7 sWindowSession = windowManager.openSession(
8 imm.getClient(), imm.getInputContext());
9 float animatorScale = windowManager.getAnimationScale(2);
10 ValueAnimator.setDurationScale(animatorScale);
11 } catch (RemoteException e) {
12 Log.e(TAG, "Failed to open window session", e);
13 }
14 }
15 return sWindowSession;
16 }
17 }
第5行(WindowManagerGlobal->getWindowSession)
第6行(WindowManagerGlobal->getWindowSession)会调用getWindowManagerService来得到WindowManager服务, 关于getWindowManagerService函数的详细分析可以参考page6文件.
第7-8行(WindowManagerGlobal->getWindowSession)会用刚刚获得的WindowManagerService调用openSession函数, 其实这会导致和WindowManagerService建立连接. 关于和WindowManagerService建立连接的部分可以参考相关系列的文章.
第15行(WindowManagerGlobal->getWindowSession)会返回和WindowManagerService的Session连接.
page6
WindowManagerGlobal的getWindowManagerService函数定义如下:
1 public static IWindowManager getWindowManagerService() {
2 synchronized (WindowManagerGlobal.class) {
3 if (sWindowManagerService == null) {
4 sWindowManagerService = IWindowManager.Stub.asInterface(
5 ServiceManager.getService("window"));
6 }
7 return sWindowManagerService;
8 }
9 }
WindowManagerGlobal的getWindowManagerService函数的主要逻辑就是通过Binder来获得"window"服务.
我们看一下ViewRootImpl对象的创建过程, ViewRootImpl类的声明如下:
public final class ViewRootImpl implements ViewParent,
View.AttachInfo.Callbacks, HardwareRenderer.HardwareDrawCallbacks
ViewRootImpl类的构造函数定义如下:
1 public ViewRootImpl(Context context, Display display) {
2 super();
3
4 if (MEASURE_LATENCY) {
5 if (lt == null) {
6 lt = new LatencyTimer(100, 1000);
7 }
8 }
9
10 // Initialize the statics when this class is first instantiated. This is
11 // done here instead of in the static block because Zygote does not
12 // allow the spawning of threads.
13 mWindowSession = WindowManagerGlobal.getWindowSession(context.getMainLooper());
14 mDisplay = display;
15
16 CompatibilityInfoHolder cih = display.getCompatibilityInfo();
17 mCompatibilityInfo = cih != null ? cih : new CompatibilityInfoHolder();
18
19 mThread = Thread.currentThread();
20 mLocation = new WindowLeaked(null);
21 mLocation.fillInStackTrace();
22 mWidth = -1;
23 mHeight = -1;
24 mDirty = new Rect();
25 mTempRect = new Rect();
26 mVisRect = new Rect();
27 mWinFrame = new Rect();
28 mWindow = new W(this);
29 mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion;
30 mInputMethodCallback = new InputMethodCallback(this);
31 mViewVisibility = View.GONE;
32 mTransparentRegion = new Region();
33 mPreviousTransparentRegion = new Region();
34 mFirst = true; // true for the first time the view is added
35 mAdded = false;
36 mAccessibilityManager = AccessibilityManager.getInstance(context);
37 mAccessibilityInteractionConnectionManager =
38 new AccessibilityInteractionConnectionManager();
39 mAccessibilityManager.addAccessibilityStateChangeListener(
40 mAccessibilityInteractionConnectionManager);
41 mAttachInfo = new View.AttachInfo(mWindowSession, mWindow, display, this, mHandler, this);
42 mViewConfiguration = ViewConfiguration.get(context);
43 mDensity = context.getResources().getDisplayMetrics().densityDpi;
44 mNoncompatDensity = context.getResources().getDisplayMetrics().noncompatDensityDpi;
45 mFallbackEventHandler = PolicyManager.makeNewFallbackEventHandler(context);
46 mProfileRendering = Boolean.parseBoolean(
47 SystemProperties.get(PROPERTY_PROFILE_RENDERING, "false"));
48 mChoreographer = Choreographer.getInstance();
49
50 PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
51 mAttachInfo.mScreenOn = powerManager.isScreenOn();
52 loadSystemProperties();
53 }
第13行(ViewRootImpl->ViewRootImpl)会调用WindowManagerGlobal的getWindowSession函数, 关于getWindowSession函数的详细分析可以参考page5文件.
第28行(ViewRootImpl->ViewRootImpl)会创建一个W类型的对象, 并用该对象来初始化成员变量mWindow. 关于W类型的构造过程可以参考page7文件.
第41行(ViewRootImpl->ViewRootImpl)会创建一个AttachInfo对象, 表示ViewRootImpl所依附的Window的信息, 并用该AttachInfo对象初始化成员变量mAttachInfo.
page5
我们分析一下WindowManagerGlobal的getWindowSession函数的实现:
1 public static IWindowSession getWindowSession(Looper mainLooper) {
2 synchronized (WindowManagerGlobal.class) {
3 if (sWindowSession == null) {
4 try {
5 InputMethodManager imm = InputMethodManager.getInstance(mainLooper);
6 IWindowManager windowManager = getWindowManagerService();
7 sWindowSession = windowManager.openSession(
8 imm.getClient(), imm.getInputContext());
9 float animatorScale = windowManager.getAnimationScale(2);
10 ValueAnimator.setDurationScale(animatorScale);
11 } catch (RemoteException e) {
12 Log.e(TAG, "Failed to open window session", e);
13 }
14 }
15 return sWindowSession;
16 }
17 }
第5行(WindowManagerGlobal->getWindowSession)
第6行(WindowManagerGlobal->getWindowSession)会调用getWindowManagerService来得到WindowManager服务, 关于getWindowManagerService函数的详细分析可以参考page6文件.
第7-8行(WindowManagerGlobal->getWindowSession)会用刚刚获得的WindowManagerService调用openSession函数, 其实这会导致和WindowManagerService建立连接. 关于和WindowManagerService建立连接的部分可以参考相关系列的文章.
第15行(WindowManagerGlobal->getWindowSession)会返回和WindowManagerService的Session连接.
page6
WindowManagerGlobal的getWindowManagerService函数定义如下:
1 public static IWindowManager getWindowManagerService() {
2 synchronized (WindowManagerGlobal.class) {
3 if (sWindowManagerService == null) {
4 sWindowManagerService = IWindowManager.Stub.asInterface(
5 ServiceManager.getService("window"));
6 }
7 return sWindowManagerService;
8 }
9 }
WindowManagerGlobal的getWindowManagerService函数的主要逻辑就是通过Binder来获得"window"服务.
发表评论
-
Activity与WindowManagerService连接的过程(三)
2018-04-16 16:27 622page11 WindowManagerService ... -
Activity与WindowManagerService连接的过程(二)
2018-04-16 16:36 763page6 WindowManagerGlobal的getW ... -
Activity与WindowManagerService连接的过程(一)
2018-04-16 16:21 983page1 Activity组件在 ... -
Activity的ViewRoot的创建过程(三)
2017-11-06 14:25 738page7 在这篇文章里, 我们分析一下W类的构造过程. W ... -
Activity的ViewRoot的创建过程(一)
2017-11-06 14:27 1078page1 当一个Activity第一次激活的时候会为该Ac ... -
Activity的Window和WindowManager的创建过程(三)
2017-07-05 11:49 1334page9 在这里我们分析一下DisplayManager的 ... -
Activity的Window和WindowManager的创建过程(二)
2017-07-05 11:31 543page5 在这篇文章中, 我们分析一下ContextImp ... -
Activity的Window和WindowManager的创建过程(一)
2017-07-05 11:27 605page1 我们开始分析一下Activity的Window和 ... -
Acitivy创建Context的过程(二)
2017-06-21 14:11 511page4 在这里我们分析一下ContextImpl的ini ... -
Acitivy创建Context的过程(一)
2017-06-21 14:15 635page1 从本篇文章开始,我们分析一下Activity创建 ... -
应用程序进程与SurfaceFlinger的连接过程
2017-06-21 11:49 1056我们从SurfaceComposerClient对象的创建开始 ... -
Android源码之SurfaceFlinger的启动(三)
2017-04-20 11:09 1041page11 我们来看一下SurfaceFlinger ... -
Android源码之SurfaceFlinger的启动(二)
2017-04-18 15:15 869page6 我们看一下Thread的run函数的实现: ... -
Android源码之SurfaceFlinger的启动(一)
2017-04-17 10:07 993page1 在Android系统中, 显示系统在底层是通过S ... -
Android源码之Zygote
2015-12-15 11:45 516当ActivityManagerService启动一个应用程序 ... -
Android源码之Binder(五)
2015-12-04 09:19 1507Service组件在启动时,需要将自己注册到Service M ... -
Android源码之Binder(四)
2015-12-04 09:18 1922case BINDER_SET_MAX_THREADS: ... -
Android源码之Binder(三)
2015-12-04 09:17 908{ int ret; struct binder_pr ... -
Android源码之Binder(二)
2015-12-04 09:15 546分析完Binder驱动程序的打开和内存分配的过程之后,我们看一 ... -
Android源码之Binder(一)
2015-12-04 09:12 993在Android系统中,进程间通信使用的是Binder机制。B ...
相关推荐
1. **启动过程**:在Activity启动的过程中,ActivityThread的handler函数会处理LAUNCH_ACTIVITY消息,此过程中会调用ViewRoot的setView()方法。 2. **绘制请求**:requestLayout()实际上向消息队列发送了一个请求GUI...
创建完后,Activity 需要把创建好的界面显示到屏幕上,调用的流程为:WindowManager 类 ——> ViewRoot 类 ——> WMS 远程接口,这样就完成一个窗口添加到屏幕上。 知识点总结 * ActivityThread 是 Android 应用...
在Kotlin中,我们可以创建一个扩展函数来简化获取根View的过程: ```kotlin fun AppCompatActivity.getRootView(): View { return findViewById(android.R.id.content) } ``` 然后在任何Activity中,只需调用`...
3. **创建Surface**: ViewRoot通过调用`WindowManagerService.addWindow()`来为新窗口创建一个Surface,并将Surface传递给Activity。 4. **绘制视图层次结构**: Activity通过`ViewRoot.setView()`方法设置其视图层次...
在Activity的创建过程中,通过setContentView()方法设置用户界面,将各种View(视图)组件添加至PhoneWindow的ContentParent中。 随着Activity线程的继续执行,到达makeVisible()时,根View(即DecoView)将被加入...
在这个方法里,调用`MediaProjectionManager`的`createScreenCaptureIntent()`来获取一个意图,然后启动一个Activity来显示权限请求对话框。 4. **处理用户授权**:当用户授权后,`onActivityResult()`会被调用。在...
4.1 初识ViewRoot和DecorView 174 4.2 理解MeasureSpec 177 4.2.1 MeasureSpec 177 4.2.2 MeasureSpec和LayoutParams的对应关系 178 4.3 View的工作流程 183 4.3.1 measure过程 183 4.3.2 layout过程 193 ...
接着,Activity的根View会被添加到WindowManager中,此时,`WindowManagerImpl`会创建一个`ViewRoot`来管理这个根View。 **DecorView的创建** DecorView是Window的最顶层View,它是`PhoneWindow`的内部类,继承自`...
该对象会创建一个ViewRoot实例来处理与WMS之间的交互。 - **IWindowSession 和 IWindow 接口:**这些是标准的AIDL接口,用于ViewRoot与WMS之间的通信。IWindowSession用于跨进程通信,而IWindow则被WMS用于调用View...
- **Window创建过程**:了解Activity、Dialog、Toast创建Window的过程。 9. **四大组件的工作过程** - **Activity和服务**:理解它们的启动、停止、绑定等生命周期过程。 - **BroadcastReceiver**:广播接收器的...
4.1 初识ViewRoot和DecorView / 174 4.2 理解MeasureSpec / 177 4.2.1 MeasureSpec / 177 4.2.2 MeasureSpec和LayoutParams的对应关系 / 178 4.3 View的工作流程 / 183 4.3.1 measure过程 / 183 4.3.2...
/ 301 8.2.3 Window的更新过程 / 303 8.3 Window的创建过程 / 304 8.3.1 Activity的Window创建过程 / 304 8.3.2 Dialog的Window创建过程 / 308 8.3.3 Toast的Window创建过程 / 311 第9章 四大组件的工作过程 ...
2. **View与ViewRoot的关联** - 在`handleResumeActivity`时,`Activity`的`onResume`方法被调用。 - `WindowManager`将`DecorView`设置给`ViewRootImpl`。 - 此时`DecorView`加载到了`Window`中。 3. **View的...
可以创建一个Intent,指定ACTION_VIEW并附加一个指向APK文件的URI。然后,使用FLAG_ACTIVITY_NEW_TASK和FLAG_GRANT_READ_URI_PERMISSION标志启动这个Intent,这样在某些情况下可以触发静默安装。但是,这种方法的...
2. **创建Bitmap**: 创建一个与root view相同大小的`Bitmap`对象。可以使用`Bitmap.createBitmap()`方法,传入view的宽度、高度和颜色格式。 3. **准备Canvas**: 创建一个`Canvas`对象,将刚才创建的`Bitmap`作为...
ViewRoot继承自Handler,作为WmS与客户端间通信的枢纽,负责接收来自WmS的指令,执行相应的窗口操作。W类作为Binder的子类,用于实现跨进程通信,确保服务端与客户端之间的数据交换。 **5. WindowManager类** ...
3. **绘制屏幕到位图**:使用`View.draw()`方法,将根视图的内容绘制到之前创建的位图上。这一步完成了实际的截图过程。 4. **保存截图**:截图完成后,使用`Bitmap.compress()`方法,将位图保存为PNG或JPEG文件。...
这个过程通常发生在ActivityThread的handleResumeActivity函数中,通过创建ViewRoot实例并调用setView方法。在这个过程中,Activity注册了InputChannel,使得InputManager可以将键盘事件分发给正确的Activity。注册...