Activity和Service都有Context,這三個類,還有Application,其實是親戚一家子。

Activity因為有了一層Theme,所以中間有個ContextThemeWrapper,相當于它是Service和Application的侄子。
ContextWrapper只是一個包裝類,沒有任何具體的實現,真正的邏輯都在ContextImpl里面。
一個應用包含的Context個數:Service個數+Activity個數+1(Application類本身對應一個Context對象)。
應用程序中包含多個ContextImpl對象,而其內部變量mPackageInfo指向同一個PackageInfo對象。
我們就拿Activity舉例子,看看Activity和Context的聯系和區別。
我們知道,跳轉到一個新的Activity要這么寫:

我們還知道,也可以在Activity中使用getApplicationContext方法獲取Context上下文信息,然后使用Context 的startActivity方法,啟動一個新的Activity:

這二者的區別是什么?我們畫個圖,就看明白了:

因為Context的startActivity方法,我看了在ContextImpl中的源碼實現,仍然是從ActivityThread中取出Instrumentation,然后執行execStartActivity方法,這和使用Activity的startActivity方法的流程是一樣的。
還記得我們前面分析的App啟動流程么?在第五階段,創建App進程的時候,先創建的ActivityThread,再創建的Application。Application的生命周期是跟著整個App走的。
而getApplicationContext得到的Context,就是從ActivityThread中取出來的Application對象,所以這個Context上下文,使用時要當心,容易引起內存泄露。

- 前言
- Android 熱補丁技術——資源的熱修復
- 插件化系列詳解
- Dex分包——MultiDex
- Google官網——配置方法數超過 64K 的應用
- IMOOC熱修復與插件化筆記
- 第1章 class文件與dex文件解析
- Class文件解析
- dex文件解析
- class與dex對比
- 第2章 虛擬機深入講解
- 第3章 ClassLoader原理講解
- 類的加載過程
- ClassLoade源碼分析
- Android中的動態加載
- 第4章 熱修復簡單講解
- 第5章 熱修復AndFix詳解
- 第6章 熱修復Tinker詳解及兩種方式接入
- 第7章 引入熱修復后代碼及版本管理
- 第8章 插件化原理深入講解
- 第9章 使用Small完成插件化
- 第10章 使用Atlas完成插件化
- 第11章 課程整體總結
- DN學院熱修復插件化筆錄
- 插件化
- 熱修復
- Android APP開發應掌握的底層知識
- 概述
- Binder
- AIDL
- AMS
- Activity的啟動和通信原理
- App啟動流程第2篇
- App內部的頁面跳轉
- Context家族史
- Service
- BroadcastReceiver
- ContentProvider
- PMS及App安裝過程