public class PhoneWindow流程 {
/*** ##android/app/ActivityThread.java**/
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
ActivityInfo aInfo = r.activityInfo;
ContextImpl appContext = createBaseContextForActivity(r);
java.lang.ClassLoader cl = appContext.getClassLoader();
//通过 ClassLoader load类名 加载出来,然后反射
Activity activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
//最后执行 (Activity) cl.loadClass(className).newInstance();
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
//最后执行 (Application) cl.loadClass(className).newInstance();
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config,
r.referrer, r.voiceInteractor, window, r.configCallback,
r.assistToken);
//这个attach见下面
mInstrumentation.callActivityOnCreate(activity, r.state);
//起这个默认activity的onCreate方法
return activity;
}
/***##android/app/ActivityThread.java**/
private void attach(boolean system, long startSeq) {
mWindow = new PhoneWindow(this, window, activityConfigCallback);
mWindow.setWindowControllerCallback(mWindowControllerCallback);
mWindow.setWindowManager(
(WindowManager) context.getSystemService(Context.WINDOW_SERVICE),
mToken, mComponent.flattenToString(),
(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
//这样和WindowManager 建立关系
}
/***看完phonewindow创建完 我们看怎么显示view **/
/***##android/app/ActivityThread.java**/
public void setContentView(View view) {
getWindow().setContentView(view); //Window mWindow
}
/***com/android/internal/policy/PhoneWindow.java**/
public void setContentView(int layoutResID) {
if (mContentParent == null) {
installDecor(); // //创建DecorView对象和mContentParent对象
} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
mContentParent.removeAllViews();
}
if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,
getContext());
transitionTo(newScene); ////Activity转场动画相关
} else {
mLayoutInflater.inflate(layoutResID, mContentParent);
}
}
/***com/android/internal/policy/PhoneWindow.java**/
private void installDecor() {
if (mDecor == null) {
//调用该方法创建new一个DecorView
mDecor = generateDecor(-1);
} else {
mDecor.setWindow(this);
}
// 根据主题theme设置对应的xml布局文件以及Feature(包括style,layout,转场动画,属性等)到DecorView中
if (mContentParent == null) {
mContentParent = generateLayout(mDecor);
}
}
/***com/android/internal/policy/PhoneWindow.java**/
protected DecorView generateDecor(int featureId) {
return new DecorView(context, featureId, this, getAttributes());
}
/***com/android/internal/policy/PhoneWindow.java**/
protected ViewGroup generateLayout(DecorView decor) {
// Apply data from current theme.
//获取当前的主题,加载默认资源和布局
TypedArray a = getWindowStyle();
//根据theme的设定,找到对应的Feature(包括style,layout,转场动画,属性等)
requestFeature(FEATURE_NO_TITLE);//无titleBar
setFlags(FLAG_FULLSCREEN, FLAG_FULLSCREEN & (~getForcedWindowFlags()));//设置全屏
setFlags(FLAG_TRANSLUCENT_STATUS, FLAG_TRANSLUCENT_STATUS & (~getForcedWindowFlags()));//透明状态栏
//从布局中获取`ID_ANDROID_CONTENT`,并关联至contentParent
ViewGroup contentParent = (ViewGroup) findViewById(ID_ANDROID_CONTENT);
//配置完成,DecorView根据已有属性调整布局状态
mDecor.finishChanging();
return contentParent;
}
}
PhoneWindow
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 先从ActivityThread入手,Activity的启动先调用performLaunchActivity, 进...
- PhoneWindow DecorView 和 View之间的关系如图所示 在activity中,通常我们通过 s...