04 January 2015

小米01月第一周工作记录


01.04

左图,Surface就像是UI的画布,而App则像是在Surface上作画,无论其用哪种技术。

右图,Surface向SurfaceFlinger提供数据,而SurfaceFlinger则混合数据。

在 ActivityThread.java 的 performLauchActivity(ActivityRecord r,Intent customIntent) 方法中 Instrumentation 通过反射机制创建 Activity,关键代码为

activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);

在方法 newActivity中,new 出 Activity 后调用方法 activity.attach(...) (Activity.java) 将 Activity 与 Window 进行关联。

window 是在 activity.attach(...) 中使用 mWindow = PolicyManager.makeNewWindow(this) 创建的。 mWindow 的真正类型是 PhoneWindow。

在 Activity.java 中使用 mWindow.setWindowManager(...) 将 Window 与 WindowManager 进行关联。而 mWindowManager 的真实类型是 LocalWindowManager ,LocalWindowManager 又使用代理 Proxy 模式,将任务委托给 WindowManagerImpl 处理。

在 ActivityThread.java 的 handleResumeActivity(IBinder token, boolean clearHide,boolean isForward) 方法中使用 wm.addView(decor,layoutParams) 进行了DecorView与ViewManager关联。

wm.addView(decor,layoutParams) 中使用了 ViewRoot ,下面介绍 ViewRoot。

  • ViewRoot 继承了 Hanlder ,能处理消息。

  • ViewRoot 有一个 Surface 类型的成员变量 mSurface

  • ViewRoot 还有一个用于 Binder 通信的 IWindow.Stub 类型和一个 View 类型的 mView 变量。

Surface 就是实实在在的画布。

ViewRoot 生成函数中将建立 Activity 的 ViewRoot 和 WindowManagerService 的关系。之后会有和 WindowsManagerService 的跨进程通信,Activity 的显示不单纯是自己的事。

WindowManagerService 是由 System_Server 启动, SurfaceFlinger 服务也在这个进程中。

Activity 的显示就是由 ViewRoot 在它的 performTraversals 函数中完成。

整个 Activity 的绘图流程就是从 mSurface 中lock一块 Canvas ,然后交给 mView 去自由发挥,完了unlock。 ,


01.05

android:inputType=""属性有text,mutiText等,text默认的是一行,会覆盖singleLine属性,设置多行一行时要注意。

UI心得,透明许多时候能成为实现效果的捷径。

canvas画文字时可以指定对齐方式,常用的如 mTextRecordPaint.setTextAlign(Paint.Align.CENTER); 居中对齐,这样就不用计算文字的宽高了。


01.06

android:duplicateParentState 指的是当前控件是否跟随父控件的(点击、焦点等)状态, 常与 ListView 一起使用

ImageView的属性 android:scaleType 可以设定图片是否居中,是否适应 View宽高 等样式。

你又理解了Git是如何跟踪修改的,每次修改,如果不 add 到暂存区,那就不会加入到 commit 中。


01.08

初识 Surface

01.11 - 01.16

打了一个星期的酱油

CountDownTimer 可以用于实现定时器