美文网首页
Activity 的启动

Activity 的启动

作者: Wi1ls努力努力再努力 | 来源:发表于2018-11-27 15:09 被阅读0次

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 生命周期函数

一部分完成。

在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


相关文章

网友评论

      本文标题:Activity 的启动

      本文链接:https://www.haomeiwen.com/subject/dbxgqqtx.html