Application和Activity创建

此源码基于 API 30


一:Android main   Application和Activity创建

1. ActivityThread extends ClientTransactionHandler

   main()->
    Looper.prepareMainLooper();
    ActivityThread thread = new ActivityThread();
        thread.attach(false, startSeq);
    Looper.loop();

   attach() ->
    final IActivityManager mgr = ActivityManager.getService();
            try {
                mgr.attachApplication(mAppThread, startSeq);
            } catch (RemoteException ex) {
                throw ex.rethrowFromSystemServer();
            }

2. ActivityManagerService
   
    attachApplication()->attachApplicationLocked()->
            
            1.thread.bindApplication() ->sendMessage(H.BIND_APPLICATION, data);
            ->handleBindApplication()->LoadedApk.makeApplication()
                    ->mActivityThread.mInstrumentation.newApplication();
                    ->Application app = getFactory(context.getPackageName()) 
                            .instantiateApplication(cl, className);
                            app.attach(context);
            ->mInstrumentation.callApplicationOnCreate(app);
            -> Application.onCreate();
            
            2. ActivityTaskManagerService.attachApplication()->
                RootWindowContainer.attachApplication()->
                startActivityForAttachedApplicationIfNeeded()->
                ActivityStackSupervisor .realStartActivityLocked()->
                    ClientTransaction.obtain()->
                    clientTransaction.addCallback(LaunchActivityItem);  ****
                    if (andResume) {
                                      lifecycleItem = ResumeActivityItem .obtain(dc.isNextTransitionForward());  ****
                                 } else {
                                      lifecycleItem = PauseActivityItem.obtain();
                                }
                ClientLifecycleManager.scheduleTransaction(clientTransaction)->
                    transaction.schedule();->
                    ApplicationThread.scheduleTransaction()->
                    (ActivityThread | ClientTransactionHandler).scheduleTransaction()->
                    sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);->
                    mTransactionExecutor.execute(transaction);->
                        executeCallbacks(transaction);
                        executeLifecycleState(transaction);
                                        

                    
                    executeCallbacks()-> LaunchActivityItem .execute()->client.handleLaunchActivity()->
                            performLaunchActivity()->
                                activity = mInstrumentation.newActivity();                              
                                Application app = r.packageInfo.makeApplication(false, mInstrumentation);
                                
                                activity.attach()  ***
                                    mWindow = new PhoneWindow window view 
                                    installDecor();->generateDecor()->new DecorView()
                                    
                                mInstrumentation.callActivityOnCreate(activity, r.state);
                                activity.performCreate(icicle, persistentState);  ****
                                    if (persistentState != null) {
                                                    onCreate(icicle, persistentState);
                                         } else {
                                                    onCreate(icicle);
                                         }
                                    onCreate() -> dispatchActivityCreated(savedInstanceState);
                                setState(ON_CREATE);

                        
                    executeLifecycleState()->ResumeActivityItem.execute()->
                                  ActivityThread. handleResumeActivity()->
                                    performResumeActivity()->
                                        r.activity.performResume()  *** 
                                            callActivityOnResume()->activity.onResume();->
                                        setState(ON_RESUME)->
                            //window 添加 DecorView
                               r.window = r.activity.getWindow();
                                     View decor = r.window.getDecorView();
                                        decor.setVisibility(View.INVISIBLE);
                                        ViewManager wm = a.getWindowManager();  
                                     wm.addView(decor, l);    ***
                                      //最后显示                
                                    activity.makeVisible(); ->mDecor.setVisibility(View.VISIBLE);
                                //****
                                ViewManager wm = a.getWindowManager();
                                        mWindowManager = mWindow.getWindowManager();
                                         PhoneWindow.getWindowManager() -> mWindowManager 
                                         mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);
                                        createLocalWindowManager() ->new WindowManagerImpl->
                                            WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance() 
                                        addView()->mGlobal.addView
                            //最终wm.addView -> mGlobal.addView  ****
                                mGlobal.addView()->
                                    1.ViewRootImpl root; 创建 
                                        root = new ViewRootImpl(view.getContext(), display);
                                    2.
                                    mViews.add(view);
                                                mRoots.add(root);
                                                mParams.add(wparams);
                                    //ViewRootImpl 和DecorView() 关联  
                                    3.root. setView(view, wparams, panelParentView);
                                        1.requestLayout()
                                        2.mWindowSession.addToDisplayAsUser(): 
                                            WindowManagerService .addWindow()
                                            //添加到WindowManagerService 管理
                                    
                                        //View 测量 布局 绘制 
                                        requestLayout();   ****
                                              1.checkThread();//检查是不是在主线程
                                               2.scheduleTraversals()
                                            //开启同步屏障                    
                                            mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
                                                        //编舞者执行 mTraversalRunnable,
                                            mChoreographer.postCallback(
                                                                 Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
                                            
                                            mChoreographer
                                                //threadLocal存储
                                                sSfThreadInstance.get()                                             
                                                ThreadLocal<Choreographer> sSfThreadInstance =  new ThreadLocal<Choreographer>()
                                                mHandler = new FrameHandler(looper);                                                    
                                                //接收底层vsync信号
                                                mDisplayEventReceiver  =FrameDisplayEventReceiver
                                                CallbackQueue[]         
                                                ///放入队列
                                                postCallback()->postCallbackDelayedInternal()->
                                                mCallbackQueues[callbackType].addCallbackLocked(dueTime, action, token);        
                                                 if (dueTime <= now) {
                                                    //每16ms刷新一次
                                                                  scheduleFrameLocked(now);->scheduleVsync()->nativeScheduleVsync()
                                                    
                                                         } else {
                                                                Message msg = mHandler.obtainMessage(MSG_DO_SCHEDULE_CALLBACK, action);
                                                                 msg.arg1 = callbackType;
                                                                  msg.setAsynchronous(true);
                                                                   mHandler.sendMessageAtTime(msg, dueTime);
                                                          }
                                            FrameDisplayEventReceiver
                                                //接收 底层信号
                                                onVsync()->Message msg = Message.obtain(mHandler, this);->
                                                mHandler.sendMessageAtTime(msg,no)
                                                run()->doFrame()->
                                                //取出CallbackQueue里的  最终执行 TraversalRunnable的run方法
                                                ->doCallbacks ->CallbackRecord.run()  ->TraversalRunnable.run

                                            TraversalRunnable
                                                doTraversal()-
                                                //移除同步屏障
                                                -> mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);
                                                ->performTraversals();->
                                                    performMeasure()->
                                                        mView.measure()
                                                    performLayout()->
                                                        host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight());
                                                    performDraw()->
                                                        draw()
                            ViewRootImpl impl = r.window.getDecorView().getViewRootImpl();                                              


















最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358