activity及其窗口显示流程

时序图预览

activity及其窗口显示流程图

activity的启动流程可参考:activity启动流程图

关键代码分析

ActivityThread 接收框架 (ActivityTaskManagerService ATMS) 回调,开始启动一个新的 Activity,这时候一般情况下新activity将会执行生命周期函数从 onCreate 到 onResume。这个过程大致可分为两部分,第一点是创建窗口 view,并实例化 activity 自身设置的布局。第二点是将属于这个 activity 的 view 树添加到 WMS 中,申请 surface,然后进行内容绘制并将窗口显示在屏幕上。首先看看第一部分,view 树实例化的过程:

ActivityThread

public Activity handleLaunchActivity(ActivityClientRecord r,
        PendingTransactionActions pendingActions, 
        Intent customIntent) {
    ...
    //初始化WindowManagerGlobal,进程单例,用于向WMS添加窗口view
    WindowManagerGlobal.initialize();

    //执行activity的实例化、attach
    final Activity a = performLaunchActivity(r, customIntent);
    ...
    return a;
}

private Activity performLaunchActivity(ActivityClientRecord r, 
          Intent customIntent) {
    ...
    //创建activity context
    ContextImpl appContext = createBaseContextForActivity(r);
    Activity activity = null;
    try {
        java.lang.ClassLoader cl = appContext.getClassLoader();
        //反射实例化要启动的activity
        activity = mInstrumentation.newActivity(
                cl, component.getClassName(), r.intent);
    } catch (Exception e) {
    }
    
    try {
        //进程application,一般已经初始化(进程启动阶段 bindApplication, 
        //回调handleLaunchActivity()之前)
        Application app = r.packageInfo.makeApplicationInner(
                                          false, mInstrumentation);
        //记录activity实例
        synchronized (mResourcesManager) {
            mActivities.put(r.token, r);
        }

            // 初始化activity资源相关类加载器,必须和application context一致
            appContext.getResources().addLoaders(
                    app.getResources().getLoaders().toArray(
                        new ResourcesLoader[0]));
            appContext.setOuterContext(activity);
            //初始化activity的成员变量,如window, FragmentController等
            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.activityConfigCallback,
                    r.assistToken, r.shareableActivityToken);
            ...
            //回调activity生命周期 onCreate()
            if (r.isPersistable()) {
                mInstrumentation.callActivityOnCreate(
                        activity, r.state, r.persistentState);
            } else {
                mInstrumentation.callActivityOnCreate(
                        activity, r.state);
            }
        //activiy 处于onCreate阶段
        r.setState(ON_CREATE);
    } catch (SuperNotCalledException e) {
    }
    return activity;
}

Activity
final void attach(Context context, ActivityThread aThread,
        Instrumentation instr, IBinder token, int ident,
        Application application, Intent intent, ActivityInfo info,
        CharSequence title, Activity parent, String id,
        NonConfigurationInstances lastNonConfigurationInstances,
        Configuration config, String referrer, 
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值