恢弘志士之气,不宜妄自菲薄。这篇文章主要讲述Android黄油计划之Choreographer原理解析相关的知识,希望能为你提供帮助。
搞客户端开发,
时间也有点了,
但是每次想起来,
总感觉自己掌握的东西零零散散,
没有一点集在的感觉,
应用层的懂,
framework的也懂,
框架啥的了解一点,
分层的思想也有一些,
JVM的原理啊,
内存分配和管理啊,
运行机制啊啥的也知道一点,
每次下班或者没事了,
就在考虑,
自己应该有一个主攻方向,
往这个方向集中发展一下,
首选的几个目标应该是非常清楚的,
我们要掌握android,
那么关于android的View机制、动画原理这些都是必须要掌握的,
所以呢,
自己想在这几个方面花些时间,
好好研究一下,
这样才能使自己更具竞争力。
【Android黄油计划之Choreographer原理解析】好了,
不管是要了解View机制,
还是android动画,
我们应该都需要有Choreographer的知识,
明白系统刷新机制到底是怎么样的,
这样才能对其他方面有更好的辅助。本章博客,
我们就来学习一下Android中的Choreographer的运行机制。
我们都知道,
应用层的一个Activity对应一个根View(
也就是一个DecorView)
、一个WindowState、一个ViewRootImpl,
每个对象都非常重要,
都是在Activity添加过程中重量级的对象,
DecorView是当前Activity的根View,
它里面管理着当前界面的View树;
WindowState对象是当前Activity窗口在系统侧WindowManagerService中代理对象;
ViewRootImpl则肩负着View的标准三步曲的处理和事件分发,
而View绘制也是由Choreographer指导的,
Choreographer的英文意思就是编舞者、舞蹈指挥,
看着非常形象。那我们就从Choreographer对象的构建开始说起吧,
它的构建是在ViewRootImpl的构造方法中的,
代码如下:
public ViewRootImpl(Context context, Display display) {
mContext =
context;
mWindowSession =
WindowManagerGlobal.getWindowSession();
mDisplay =
display;
mBasePackageName =
context.getBasePackageName();
mDisplayAdjustments =
display.getDisplayAdjustments();
mThread =
Thread.currentThread();
mLocation =
new WindowLeaked(null);
mLocation.fillInStackTrace();
mWidth =
-1;
mHeight =
-1;
mDirty =
new Rect();
mTempRect =
new Rect();
mVisRect =
new Rect();
mWinFrame =
new Rect();
mWindow =
new W(this);
mTargetSdkVersion =
context.getApplicationInfo().targetSdkVersion;
mViewVisibility =
View.GONE;
mTransparentRegion =
new Region();
mPreviousTransparentRegion =
new Region();
// [+
LEUI-9331]
mPreBlurParams =
new BlurParams();
// [-LEUI-9331]
mFirst =
true;
// true for the first time the view is added
mAdded =
false;
mAttachInfo =
new View.AttachInfo(mWindowSession, mWindow, display, this, mHandler, this);
mAccessibilityManager =
AccessibilityManager.getInstance(context);
mAccessibilityInteractionConnectionManager =
new AccessibilityInteractionConnectionManager();
mAccessibilityManager.addAccessibilityStateChangeListener(
mAccessibilityInteractionConnectionManager);
mHighContrastTextManager =
new HighContrastTextManager();
mAccessibilityManager.addHighTextContrastStateChangeListener(
mHighContrastTextManager);
mViewConfiguration =
ViewConfiguration.get(context);
mDensity =
context.getResources().getDisplayMetrics().densityDpi;
mNoncompatDensity =
context.getResources().getDisplayMetrics().noncompatDensityDpi;
mFallbackEventHandler =
new PhoneFallbackEventHandler(context);
mChoreographer =
Choreographer.getInstance();
mDisplayManager =
(DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
loadSystemProperties();
/**
* M: increase instance count and check log property to determine
* whether to enable/disable log system. @
{
*/
mIdent =
sIdent+
+
;
checkViewRootImplLogProperty();
if (LOCAL_LOGV) {
enableLog(true, "
a"
);
}if (DEBUG_LIFECYCLE) {
Log.v(TAG, "
ViewRootImpl construct: context =
"
+
context +
"
, mThread =
"
+
mThread
+
"
, mChoreographer =
"
+
mChoreographer +
"
, mTraversalRunnable =
"
+
mTraversalRunnable +
"
, this =
"
+
this);
}
}
推荐阅读
- Android Service IPC通信之Messenger机制
- 安卓开发平台搭建
- 安卓五种数据存储的方式
- 四则运算安卓客户端UI截图(部分)
- Java静态绑定和动态绑定
- 如何理解操作系统中的固定(或静态)分区()
- PHP编码标准是什么(详细介绍)
- 40个Python面试题和答案合集
- Java如何使用命令行参数(命令行程序)