Application,Activity,Service的建立流程(1)

Context簡介

Context的中文意思是上下文,能夠簡單的理解爲運行環境,提供一些很是Base的接口,例如獲取資源管理器,App緩存目錄等 緩存

從Context源碼中得出Context是個抽象類,其功能的實現應該交給了其子類,那麼咱們就看看Context的繼承關係
此圖源自自郭霖大神的Blog 從源碼能夠看出,Context有兩個直接的子類ContextWrapper和ContextImpl,而且Application,Service,Activity都繼承ContextWrapper,下面咱們看看ContextWrapper的源碼:
從源碼能夠看出,ContextWrapper把功能都委託給mBase來作(代理模式) 讓咱們再來Context的另一個實現類ContextImpl的源碼:
從源碼能夠看出,ContextImpl實現了Context的全部功能。綜上咱們能夠推斷ContextWrapper中的mBase應該是ContextImpl對象,下面經過Application,Activity,Service的建立流程來證明這個推斷。

Application的建立流程

這張圖主要展現了啓動Activity,Service的簡要過程,在啓動Activity,Service的同時也會建立Application a. ActivityThread就是咱們常說的UI線程,它負責Activity,Service,Application的調度等工做,感興趣的朋友能夠閱讀下他的源碼. b. ApplicationThread是ActivityThread的一個內部類,本質上是一個IBinder對象,他的主要做用是用於AMS(ActivityManagerService的簡稱)與ActivityThread通訊,例如AMS在處理完Server端ActivityRecord的建立,棧管理後經過ApplicationThread來通知ActivityThread能夠建立對應的Activity和執行Activity的生命週期了。

下面咱們從AMS回調啓動Activity的流程來看下Application的建立流程
  1. AMS會經過調用ApplicationThread的scheduleLaunchActivity(...)來告訴ActivityThread它能夠建立Activity了
  2. 而後發送LAUNCH_ACTIVITY消息出去
  3. 接着調用 handleLaunchActivity(...)
  4. 而後調用performLauncherActivity(...)
    咱們關注下createBaseContextForActivity(...),他建立了CotnextImpl對象,接着調用Activity的attach(...),把ContextImpl對象傳了進去,從而證實了Activity內部對應的mBase就是ContextImpl。
  5. 而後調用了LoadedApk的makeApplication(...)
    若是mApplication不爲null則直接返回它,mApplication是LoadedApk中的一個全局對象,一個APP進程只會建立一次。而後建立ContextImpl對象,而且在調用Intrumentation的newApplication(...)的時候傳了進去,接着調用了Intrmentation的callApplicationOnCreate(...) 接下來咱們看看Intrumentation的newApplication(...)和callApplicationOnCreate(...)作了什麼
    從代碼中咱們能夠看出,Application建立後,調用了attach(...),把ContextImpl對象傳了進去,也就證實了Application內部對應的mBase就是ContextImpl,同時在attach方法中調用了執行了Application的生命週期方法attachBaseContext(...)
    從代碼中能夠看出,callApplicationOnCreate執行了Application生命週期方法onCreate(...)
上面的代碼都是在UI線程執行的,所以不要在Application的生命週期方法attachBaseContext(...)和onCreate(...)作耗時操做
相關文章
相關標籤/搜索