Activity 的启动最后转到目标进程的 ActivityThread 处理
关键类是ActivityThread$H
- handleLaunchActivity( )@ActivityThread
- performLaunchActivity( )@ActivityThread
- 主要工作
- newActivity( )@Instrumentation通过反射实例化目标 Activity
- r.packageInfo.makeApplication( )内部通过Instrumentation 进行反射实例化同时调用createContext( )@ContextImpl 创建 Context 并且将 Application 绑定到 Context ,然后通过callApplicationOnCreate( )Instrumentation 调用 Application 的 onCreate( ) 生命周期函数
- createBaseContextForActivity( )@ActivityThread通过调用createActivityContext( )@ContextImpl 创建 Activiy 绑定到 Context
- attach( )@Activity
- attachBaseContext( )将Context 绑定到 Activity
- performStart( )@Activity
- mWindow = new PhoneWindow() 创建 PhoneWindow
- mWindow.setWindowManager( )
- callActivityOnCreate( )@Instrumentation 调用onCreate( )@Activity 生命周期函数
- callActivityOnPostCreate( )@Instrumentation 调用onPostCreate( )Activity 生命周期函数
- performLaunchActivity( )@ActivityThread
一部分完成。
在onCreate( )@Instrumentation 中,一般会进行setContentView( )
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_man);
}
public void setContentView(int layutResId)@PhoneWindow
关键函数installDecor( );
- mDecor = generateDecor( ) 直接new DecorView( )[extends FrameLayout]
- mContentParent = generateLayout(mDecor)根据不同的主体配置选择不同的layoutResId
- View in=mLayoutInflater.inflate(layoutResorce,null)
- decor.addView(int, new ViewGroup.LayoutParams());
- mContentRoot = (ViewGroup) in
- contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);根据配置选择的layoutResId 都包含一个com.android.internal.R.id.content的 FrameLayout
- mLayoutInflater.inflate(layoutResID[自己传入的],mCOntentParent)
至此,
1.生成一个Decor 的 FrameLayout 作为顶层的布局,作为mDecor;
2.根据不同的配置选择不同的系统资源文件实例化一个布局作为mContentRoot 添加到 mDecor;这个 mContentRoot 根据选择的主题等可能含有 Title,Bar 等其他 SystemUI,统一的是均含有com.android.internal.R.id.content 的 FrameLayout 的子 View
3.在 mContentRoot中选择id 为com.android.internal.R.id.content 的 子 View,FrameLayout 作为mContentParent;
3.实例化用户传入的布局layoutResID,作为子 View 添加到 mContentParent 中
二部分完成。
在一部分完成后,即onCreate( );onPostCreate( );onStart( )完毕后,
- handleResumeActivity( )
- callActivityOnResume( )@mInstrumentation
View decor = r.window.getDecorView( );
ViewManager wm = a.getWindowManager( );
a.mDecor = decor;
wm.addVeiew(decor, l);//关键函数,这里的 wm 是WindowManagerImpl 类
addView( )@WindowManagerImpl
public void addView(View view,ViewGroup.LayoutParams params){
mGlobal.addView(view, params, mDisplay, mParentWindow);
}
addView( )@WimdowManagerGlobal
public void addView(View view, ViewGroup.LayoutParams params, Display diaplay, Window parentWindow){
ViewRootImpl root;
view panelParentView =null;
...
root = new ViewRootImpl(view.getContext( ), diaplay);
view.setLayoutParams(wmarams);
mViews.add(view);
mRoots.add(root);
mParams.add(wparams);
root.setView(view, wparams, panelParentView);
}
setView( )@ViewRootImpl
网友评论