Calvin's Tech Space

          成于堅(jiān)忍,毀于浮躁

             :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
          啟動(dòng)activity:
          **android.process.acore進(jìn)程
          1.Acticity.startActivityForResult()
          2.Instrumention.execStartActivity();
          3.ActivityManagerNative.getDefault()
                          .startActivity()
            3.1 ActivityManagerNative.getDefault()返回的是ActivityManagerProxy的實(shí)例,
            它只是一個(gè)代理類,這個(gè)代理類實(shí)際上代理的是IBinder b = ServiceManager.getService("activity");
            這個(gè)Service。
            3.2 這個(gè)Service是什么時(shí)候添加進(jìn)來的呢?
            在SystemServer.java的run()中有調(diào)用
            ActivityManagerService.setSystemProcess();
                ServiceManager.addService("activity", m);
                這里還會(huì)添加許多系統(tǒng)關(guān)鍵服務(wù)。
                (TODO:查看在SystemServer的Log輸出)
               
          **system_process進(jìn)程
          4 ActivityManagerNative
              |--ActivityManagerService
             
              在ActivityManagerNative的onTransact方法中最終提供了服務(wù):
              case START_ACTIVITY_TRANSACTION:
                ActivityManagerService.startActivity();
                  --startActivityLocked(IApplicationThread caller,
                      Intent intent, String resolvedType,
                      Uri[] grantedUriPermissions,
                      int grantedMode, ActivityInfo aInfo, IBinder resultTo,
                      String resultWho, int requestCode,
                      int callingPid, int callingUid, boolean onlyIfNeeded,
                      boolean componentSpecified)
                    --startActivityUncheckedLocked(r, sourceRecord,
                          grantedUriPermissions, grantedMode, onlyIfNeeded, true)
                    在這個(gè)方法里面檢查權(quán)限,解析intent中的Flag。。。
                    --startActivityLocked(HistoryRecord r, boolean newTask)
                      --resumeTopActivityLocked(HistoryRecord prev)
                        --startSpecificActivityLocked(HistoryRecord r,boolean andResume, boolean checkConfig)
                          --startProcessLocked(String processName,ApplicationInfo info, boolean knownToBeDead, int intentFlags,String hostingType, ComponentName hostingName)
                            --startProcessLocked(ProcessRecord app,String hostingType, String hostingNameStr)
                              在這里啟動(dòng)一個(gè)進(jìn)程用來host這個(gè)應(yīng)用
                              int pid = Process.start("android.app.ActivityThread",
                              mSimpleProcessManagement ? app.processName : null, uid, uid,
                              gids, debugFlags, null);
                             
          ActivityManagerService.java
          --startSpecificActivityLocked(HistoryRecord r,boolean andResume, boolean checkConfig)
            --realStartActivityLocked(HistoryRecord r,ProcessRecord app, boolean andResume, boolean checkConfig)
              --app.thread.scheduleLaunchActivity                                   //scheduleLaunchActivity()@IApplicationThread.java
                --scheduleLaunchActivity()@ActivityThread.java                      //這里實(shí)際是ApplicationThreadNative提供的服務(wù)
                  --handleMessage()@H$ActivityThread.java
                    --handleLaunchActivity()@ActivityThread.java
                      --Activity performLaunchActivity(ActivityRecord r, Intent customIntent)@ActivityThread.java  //這時(shí)真正的Activity對(duì)象被構(gòu)造出來
                        --mInstrumentation.newActivity()                            //通過反射構(gòu)造出Activity對(duì)象
                        --activity.attach()                                         //初始化Activity,生成一個(gè)window對(duì)象,設(shè)置各種狀態(tài)等等
                        --mInstrumentation.callActivityOnCreate(activity, r.state);  //調(diào)用Activity的onCreate()方法
                     
                        到這里,我們自己寫的activity的onCreate()方法已經(jīng)被系統(tǒng)調(diào)用了,接下來依次回調(diào)生命周期方法:
                        --activity.performStart();
                          --mInstrumentation.callActivityOnStart(this);
                        --mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
                        --mInstrumentation.callActivityOnPostCreate(activity, r.state);
                        --mActivities.put(r.token, r);                               //將這個(gè)activity入棧
                       
                      然后就要調(diào)用onResume()方法了:
                      --handleResumeActivity(IBinder token, boolean clearHide, boolean isForward)
                        --performResumeActivity(token, clearHide);
                          --r.activity.performResume();
                            --performRestart()@Activity.java;
                              --mInstrumentation.callActivityOnRestart(this);
                              --mInstrumentation.callActivityOnStart(this);
                          --mInstrumentation.callActivityOnResume(this);
                          onResume()已經(jīng)調(diào)用完畢,一個(gè)activity的邏輯處理結(jié)束了,但是這時(shí)候屏幕上還不會(huì)顯示任何東西,因?yàn)閂iew還沒有添加進(jìn)去
                         
                         
                        --r.window.getDecorView();                                   //開始把DecorView添加進(jìn)Window
                        --wm.addView(decor, l);
                     
                      至此一個(gè)Activity啟動(dòng)結(jié)束。
          posted on 2010-11-23 14:59 calvin 閱讀(4223) 評(píng)論(1)  編輯  收藏 所屬分類: Android

          Feedback

          # re: [原]Activity啟動(dòng)過程分析 2011-07-08 21:26 mark in working
          寫的很好,向您學(xué)習(xí)!  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 东宁县| 延长县| 察哈| 上蔡县| 黄龙县| 广宗县| 凭祥市| 双流县| 苍山县| 阿合奇县| 昭通市| 瑞安市| 杭锦后旗| 城固县| 个旧市| 唐山市| 禹城市| 凭祥市| 揭西县| 民权县| 康保县| 汤阴县| 化德县| 忻城县| 定日县| 瑞金市| 汾西县| 靖江市| 庆城县| 玉田县| 建湖县| 永顺县| 涞水县| 肥西县| 安仁县| 天柱县| 宣威市| 桃江县| 霍城县| 台南县| 东安县|