原文出處——>[Android應用程序窗口(Activity)的窗口對象(Window)的創建過程分析](http://blog.csdn.net/luoshengyang/article/details/8223770)
在前文中,我們分析了Android應用程序窗口的運行上下文環境的創建過程。由此可知,每一個Activity組件都有一個關聯的ContextImpl對象,同時,它還關聯有一個Window對象,用來描述一個具體的應用程序窗口。由此又可知,Activity只不過是一個高度抽象的UI組件,它的具體UI實現其實是由其它的一系列對象來實現的。在本文中,我們就將詳細分析Android應用程序窗口對象的創建過程。
從前面Android應用程序窗口(Activity)實現框架簡要介紹和學習計劃一文可以知道,在PHONE平臺上,與Activity組件所關聯的窗口對象的實際類型為PhoneWindow,后者是從Window類繼承下來的。Activity、Window和PhoneWindow三個類的關系可以參考Android應用程序窗口(Activity)實現框架簡要介紹和學習計劃一文中的圖3和圖5。為了方便接下來描述類型為PhoneWindow的應用程序窗口的創建過程,我們將這兩個圖拿過來,如以下的圖1和圖2所示:
:-: 
圖1 Activity和Window的類關系圖
:-: 
圖2 Window和PhoneWindow的類關系圖
上述兩個圖中所涉及到的類的描述可以參考Android應用程序窗口(Activity)實現框架簡要介紹和學習計劃一文,本文主要從Android應用程序窗口的創建過程來理解Activity、Window和PhoneWindow三個類的關系。
從Android應用程序窗口(Activity)的運行上下文環境(Context)的創建過程分析一文又可以知道,與Activity組件所關聯的一個PhoneWindow對象是從Activity類的成員函數attach中創建的,如圖3所示:
:-: 
圖3 Android應用程序窗口的創建過程
這個過程可以分為9個步驟,接下來我們就詳細分析每一個步驟。
**Step 1. Activity.attach**
~~~
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks {
......
private Window mWindow;
......
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,
Object lastNonConfigurationInstance,
HashMap<String,Object> lastNonConfigurationChildInstances,
Configuration config) {
......
mWindow = PolicyManager.makeNewWindow(this);
mWindow.setCallback(this);
if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
mWindow.setSoftInputMode(info.softInputMode);
}
......
mWindow.setWindowManager(null, mToken, mComponent.flattenToString());
......
}
......
}
~~~
這個函數定義在文件frameworks/base/core/java/android/app/Activity.java中。
在前面Android應用程序窗口(Activity)的運行上下文環境(Context)的創建過程分析一文中,我們已經分析過這個函數的實現了,這里我們只關注與應用程序窗口創建相關的代碼。
函數首先調用PolicyManager類的靜態成員函數makeNewWindow來創建一個類型為PhoneWindow的應用程序窗口,并且保存在Activity類的成員變量mWindow中。有了這個類型為PhoneWindow的應用程序窗口,函數接下來還會調用它的成員函數setCallback、setSoftInputMode和setWindowManager來設置窗口回調接口、軟鍵盤輸入區域的顯示模式和本地窗口管理器。
PhoneWindow類的成員函數setCallback、setSoftInputMode和setWindowManager都是從父類Window繼承下來的,因此,接下來我們就繼續分析PolicyManager類的靜態成員函數makeNewWindow,以及Window類的成員函數setCallback、setSoftInputMode和setWindowManager的實現。
**Step 2. PolicyManager.makeNewWindow**
~~~
public final class PolicyManager {
private static final String POLICY_IMPL_CLASS_NAME =
"com.android.internal.policy.impl.Policy";
private static final IPolicy sPolicy;
static {
// Pull in the actual implementation of the policy at run-time
try {
Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME);
sPolicy = (IPolicy)policyClass.newInstance();
} catch (ClassNotFoundException ex) {
throw new RuntimeException(
POLICY_IMPL_CLASS_NAME + " could not be loaded", ex);
} catch (InstantiationException ex) {
throw new RuntimeException(
POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex);
} catch (IllegalAccessException ex) {
throw new RuntimeException(
POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex);
}
}
......
// The static methods to spawn new policy-specific objects
public static Window makeNewWindow(Context context) {
return sPolicy.makeNewWindow(context);
}
......
}
~~~
這個函數定義在文件frameworks/base/core/java/com/android/internal/policy/PolicyManager.java中。
PolicyManager是一個窗口管理策略類,它在第一次被使用的時候,就會創建一個Policy類實例,并且保存在靜態成員變量sPolicy中,以后PolicyManager類的窗口管理策略就是通過這個Policy類實例來實現的,例如,PolicyManager類的靜態成員函數makeNewWindow就是通過調用這個Policy類實例的成員函數makeNewWindow來創建一個具體的應用程序窗口的。
接下來,我們就繼續分析Policy類的成員函數makeNewWindow的實現。
**Step 3. Policy.makeNewWindow**
~~~
public class Policy implements IPolicy {
......
public PhoneWindow makeNewWindow(Context context) {
return new PhoneWindow(context);
}
......
}
~~~
這個函數定義在文件frameworks/base/policy/src/com/android/internal/policy/impl/Policy.java中。
Policy類的成員函數makeNewWindow的實現很簡單,它只是創建了一個PhoneWindow對象,然后返回給調用者。
接下來,我們就繼續分析PhoneWindow類的構造函數的實現,以便可以了解一個類型為PhoneWindow的應用程序窗口的創建過程。
**Step 4. new PhoneWindow**
~~~
public class PhoneWindow extends Window implements MenuBuilder.Callback {
......
// This is the top-level view of the window, containing the window decor.
private DecorView mDecor;
// This is the view in which the window contents are placed. It is either
// mDecor itself, or a child of mDecor where the contents go.
private ViewGroup mContentParent;
......
private LayoutInflater mLayoutInflater;
......
public PhoneWindow(Context context) {
super(context);
mLayoutInflater = LayoutInflater.from(context);
}
......
}
~~~
這個函數定義在文件frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java中。
PhoneWindow類的構造函數很簡單,它首先調用父類Window的構造函數來執行一些初始化操作,接著再調用LayoutInflater的靜態成員函數from創建一個LayoutInflater實例,并且保存在成員變量mLayoutInflater中。這樣,PhoneWindow類以后就可以通過成員變量mLayoutInflater來創建應用程序窗口的視圖,這個視圖使用類型為DecorView的成員變量mDecor來描述。PhoneWindow類還有另外一個類型為ViewGroup的成員變量mContentParent,用來描述一個視圖容器,這個容器存放的就是成員變量mDecor所描述的視圖的內容,不過這個容器也有可能指向的是mDecor本身。在后面的文章中,我們再詳細分析類型為PhoneWindow的應用程序窗口的視圖的創建過程。
Window的構造函數定義在文件frameworks/base/core/java/android/view/Window.java中,它的實現很簡單,只是初始化了其成員變量mContext,如下所示:
~~~
public abstract class Window {
......
private final Context mContext;
......
public Window(Context context) {
mContext = context;
}
......
}
~~~
從前面的調用過程可以知道,參數context描述的是正在啟動的Activity組件,將它保存在Window類的成員變量mContext之后,Window類就可以通過它來訪問與Activity組件相關的資源了。
這一步執行完成之后,回到前面的Step 1中,即Activity類的成員函數attach中,接下來就會繼續調用前面所創建的PhoneWindow對象從父類Window繼承下來的成員函數setCallback來設置窗口回調接口,因此,接下來我們就繼續分析Window類的成員函數setCallback的實現。
**Step 5. Window.setCallback**
~~~
public abstract class Window {
......
private Callback mCallback;
......
/**
* Set the Callback interface for this window, used to intercept key
* events and other dynamic operations in the window.
*
* @param callback The desired Callback interface.
*/
public void setCallback(Callback callback) {
mCallback = callback;
}
......
}
~~~
這個函數定義在文件frameworks/base/core/java/android/view/Window.java中。
正在啟動的Activity組件會將它所實現的一個Callback接口設置到與它所關聯的一個PhoneWindow對象的父類Window的成員變量mCallback中去,這樣當這個PhoneWindow對象接收到系統給它分發的IO輸入事件,例如,鍵盤和觸摸屏事件,轉發給與它所關聯的Activity組件處理,這一點可以參考前面Android應用程序鍵盤(Keyboard)消息處理機制分析一文。
這一步執行完成之后,回到前面的Step 1中,即Activity類的成員函數attach中,接下來就會繼續調用前面所創建的PhoneWindow對象從父類Window繼承下來的成員函數setSoftInputMode來設置應用程序窗口的軟鍵盤輸入區域的顯示模式,因此,接下來我們就繼續分析Window類的成員函數setSoftInputMode的實現。
**Step 6. Window.setSoftInputMode**
~~~
public abstract class Window {
......
private boolean mHasSoftInputMode = false;
......
public void setSoftInputMode(int mode) {
final WindowManager.LayoutParams attrs = getAttributes();
if (mode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
attrs.softInputMode = mode;
mHasSoftInputMode = true;
} else {
mHasSoftInputMode = false;
}
if (mCallback != null) {
mCallback.onWindowAttributesChanged(attrs);
}
}
......
}
~~~
這個函數定義在文件frameworks/base/core/java/android/view/Window.java中。
參數mode有SOFT_INPUT_STATE_UNSPECIFIED、SOFT_INPUT_STATE_UNCHANGED、SOFT_INPUT_STATE_HIDDEN、SOFT_INPUT_STATE_ALWAYS_HIDDEN、SOFT_INPUT_STATE_VISIBLE和SOFT_INPUT_STATE_ALWAYS_VISIBLE一共六個取值,用來描述窗口的軟鍵盤輸入區域的顯示模式,它們的含義如下所示:
1. SOFT_INPUT_STATE_UNSPECIFIED:沒有指定軟鍵盤輸入區域的顯示狀態。
2. SOFT_INPUT_STATE_UNCHANGED:不要改變軟鍵盤輸入區域的顯示狀態。
3. SOFT_INPUT_STATE_HIDDEN:在合適的時候隱藏軟鍵盤輸入區域,例如,當用戶導航到當前窗口時。
4. SOFT_INPUT_STATE_ALWAYS_HIDDEN:當窗口獲得焦點時,總是隱藏軟鍵盤輸入區域。
5. SOFT_INPUT_STATE_VISIBLE:在合適的時候顯示軟鍵盤輸入區域,例如,當用戶導航到當前窗口時。
6. SOFT_INPUT_STATE_ALWAYS_VISIBLE:當窗口獲得焦點時,總是顯示軟鍵盤輸入區域。
當參數mode的值不等于SOFT_INPUT_STATE_UNSPECIFIED時,就表示當前窗口被指定軟鍵盤輸入區域的顯示模式,這時候Window類的成員函數setSoftInputMode就會將成員變量mHasSoftInputMode的值設置為true,并且將這個顯示模式保存在用來描述窗口布局屬性的一個WindowManager.LayoutParams對象的成員變量softInputMode中,否則的話,就會將成員變量mHasSoftInputMode的值設置為false。
設置完成窗口的軟鍵盤輸入區域的顯示模式之后,如果Window類的成員變量mCallback指向了一個窗口回調接口,那么Window類的成員函數setSoftInputMode還會調用它的成員函數onWindowAttributesChanged來通知與窗口所關聯的Activity組件,它的窗口布局屬性發生了變化。
這一步執行完成之后,回到前面的Step 1中,即Activity類的成員函數attach中,接下來就會繼續調用前面所創建的PhoneWindow對象從父類Window繼承下來的成員函數setWindowManager來設置應用程序窗口的本地窗口管理器,因此,接下來我們就繼續分析Window類的成員函數setWindowManager的實現。
Step 7. Window.setWindowManager
~~~
public abstract class Window {
......
private WindowManager mWindowManager;
private IBinder mAppToken;
private String mAppName;
......
public void setWindowManager(WindowManager wm,
IBinder appToken, String appName) {
mAppToken = appToken;
mAppName = appName;
if (wm == null) {
wm = WindowManagerImpl.getDefault();
}
mWindowManager = new LocalWindowManager(wm);
}
......
}
~~~
這個函數定義在文件frameworks/base/core/java/android/view/Window.java中。
參數appToken用來描述當前正在處理的窗口是與哪一個Activity組件關聯的,它是一個Binder代理對象,引用了在ActivityManagerService這一側所創建的一個類型為ActivityRecord的Binder本地對象。從前面Android應用程序的Activity啟動過程簡要介紹和學習計劃一系列文章可以知道,每一個啟動起來了的Activity組件在ActivityManagerService這一側,都有一個對應的ActivityRecord對象,用來描述該Activity組件的運行狀態。這個Binder代理對象會被保存在Window類的成員變量mAppToken中,這樣當前正在處理的窗口就可以知道與它所關聯的Activity組件是什么。
參數appName用來描述當前正在處理的窗口所關聯的Activity組件的名稱,這個名稱會被保存在Window類的成員變量mAppName中。
參數wm用來描述一個窗口管理器。從前面的調用過程可以知道, 這里傳進來的參數wm的值等于null,因此,函數首先會調用WindowManagerImpl類的靜態成員函數getDefault來獲得一個默認的窗口管理器。有了這個窗口管理器之后,函數接著再使用它來創建一個本地窗口管理器,即一個LocalWindowManager對象,用來維護當前正在處理的應用程序窗口。
接下來,我們首先分析WindowManagerImpl類的靜態成員函數getDefault的實現,接著再分析本地窗口管理器的創建過程,即LocalWindowManager類的構造函數的實現。
**Step 8. WindowManagerImpl.getDefault**
~~~
public class WindowManagerImpl implements WindowManager {
......
public static WindowManagerImpl getDefault()
{
return mWindowManager;
}
......
private static WindowManagerImpl mWindowManager = new WindowManagerImpl();
}
~~~
這個函數定義在文件frameworks/base/core/java/android/view/WindowManagerImpl.java中。
WindowManagerImpl類的靜態成員函數getDefault的實現很簡單,它只是將靜態成員變量mWindowManager所指向的一個WindowManagerImpl對象返回給調用者,這個WindowManagerImpl對象實現了WindowManager接口,因此,它就可以用來管理應用程序窗口。
這一步執行完成之后,回到前面的Step 7中,即Window類的成員函數setWindowManager中,接下來就會使用前面所獲得一個WindowManagerImpl對象來創建一個本地窗口管理器,即一個LocalWindowManager對象。
**Step 9. new LocalWindowManager**
~~~
public abstract class Window {
......
private final Context mContext;
......
private class LocalWindowManager implements WindowManager {
LocalWindowManager(WindowManager wm) {
mWindowManager = wm;
mDefaultDisplay = mContext.getResources().getDefaultDisplay(
mWindowManager.getDefaultDisplay());
}
......
private final WindowManager mWindowManager;
private final Display mDefaultDisplay;
}
......
}
~~~
這個函數定義在文件frameworks/base/core/java/android/view/Window.java中。
LocalWindowManager類的構造函數首先將參數wm所描述的一個WindowManagerImpl對象保存它的成員變量mWindowManager中,這樣以后就將窗口管理工作交給它來處理。
LocalWindowManager類的構造函數接著又通過成員變量mWindowManager所描述的一個WindowManagerImpl對象的成員函數getDefaultDisplay來獲得一個Display對象,用來描述系統屏幕屬性。
由于前面所獲得的Display對象描述的是全局的屏幕屬性,而當前正在處理的窗口可能配置了一些可自定義的屏幕屬性,因此,LocalWindowManager類的構造函數需要進一步地調整前面所獲得的Display對象所描述的屏幕屬性,以便可以適合當前正在處理的窗口使用。LocalWindowManager類的構造函數首先通過外部類Window的成員變量mContext的成員函數getResources來獲得一個Resources對象,接著再調用這個Resources對象的成員函數getDefaultDisplay來調整前面所獲得的Display對象所描述的屏幕屬性。最終調整完成的Display對象就保存在LocalWindowManager類的成員變量mDefaultDisplay中。
從前面的Step 4可以知道,類Window的成員變量mContext描述的是與當前窗口所關聯的一個Activity組件。Activity類的成員函數getResources是從父類ContextWrapper繼續下來的,它實現在文件frameworks/base/core/java/android/content/ContextWrapper.java中,如下所示:
~~~
public class ContextWrapper extends Context {
Context mBase;
......
@Override
public Resources getResources()
{
return mBase.getResources();
}
......
}
~~~
從前面Android應用程序窗口(Activity)的運行上下文環境(Context)的創建過程分析一文可以知道,ContextWrapper類的成員變量mBase指向的是一個ContextImpl對象,用來描述一個Activity組件的運行上下文環境。通過調用這個ContextImpl對象的成員函數getResources,就可以獲得與一個Resources對象,而通過這個Resources對象,就可以訪問一個Activity組件的資源信息,從而可以獲得它所配置的屏幕屬性。
至此,我們就分析完成一個Activity組件所關聯的應用程序窗口對象的創建過程了。從分析的過程可以知道:
1. 一個Activity組件所關聯的應用程序窗口對象的類型為PhoneWindow。
2. 這個類型為PhoneWindow的應用程序窗口是通過一個類型為LocalWindowManager的本地窗口管理器來維護的。
3. 這個類型為LocalWindowManager的本地窗口管理器又是通過一個類型為WindowManagerImpl的窗口管理器來維護應用程序窗口的。
4. 這個類型為PhoneWindow的應用程序窗口內部有一個類型為DecorView的視圖對象,這個視圖對象才是真正用來描述一個Activity組件的UI的。
在接下來的一篇文章中,我們將繼續分析應用程序窗口內部的視圖對象的創建過程,敬請關注!
- 前言
- Android組件設計思想
- Android源代碼開發和調試環境搭建
- Android源代碼下載和編譯
- Android源代碼情景分析法
- Android源代碼調試分析法
- 手把手教你為手機編譯ROM
- 在Ubuntu上下載、編譯和安裝Android最新源代碼
- 在Ubuntu上下載、編譯和安裝Android最新內核源代碼(Linux Kernel)
- 如何單獨編譯Android源代碼中的模塊
- 在Ubuntu上為Android系統編寫Linux內核驅動程序
- 在Ubuntu上為Android系統內置C可執行程序測試Linux內核驅動程序
- 在Ubuntu上為Android增加硬件抽象層(HAL)模塊訪問Linux內核驅動程序
- 在Ubuntu為Android硬件抽象層(HAL)模塊編寫JNI方法提供Java訪問硬件服務接口
- 在Ubuntu上為Android系統的Application Frameworks層增加硬件訪問服務
- 在Ubuntu上為Android系統內置Java應用程序測試Application Frameworks層的硬件服務
- Android源代碼倉庫及其管理工具Repo分析
- Android編譯系統簡要介紹和學習計劃
- Android編譯系統環境初始化過程分析
- Android源代碼編譯命令m/mm/mmm/make分析
- Android系統鏡像文件的打包過程分析
- 從CM刷機過程和原理分析Android系統結構
- Android系統架構概述
- Android系統整體架構
- android專用驅動
- Android硬件抽象層HAL
- Android應用程序組件
- Android應用程序框架
- Android用戶界面架構
- Android虛擬機之Dalvik虛擬機
- Android硬件抽象層
- Android硬件抽象層(HAL)概要介紹和學習計劃
- Android專用驅動
- Android Logger驅動系統
- Android日志系統驅動程序Logger源代碼分析
- Android應用程序框架層和系統運行庫層日志系統源代碼分析
- Android日志系統Logcat源代碼簡要分析
- Android Binder驅動系統
- Android進程間通信(IPC)機制Binder簡要介紹和學習計劃
- 淺談Service Manager成為Android進程間通信(IPC)機制Binder守護進程之路
- 淺談Android系統進程間通信(IPC)機制Binder中的Server和Client獲得Service Manager接口之路
- Android系統進程間通信(IPC)機制Binder中的Server啟動過程源代碼分析
- Android系統進程間通信(IPC)機制Binder中的Client獲得Server遠程接口過程源代碼分析
- Android系統進程間通信Binder機制在應用程序框架層的Java接口源代碼分析
- Android Ashmem驅動系統
- Android系統匿名共享內存Ashmem(Anonymous Shared Memory)簡要介紹和學習計劃
- Android系統匿名共享內存Ashmem(Anonymous Shared Memory)驅動程序源代碼分析
- Android系統匿名共享內存Ashmem(Anonymous Shared Memory)在進程間共享的原理分析
- Android系統匿名共享內存(Anonymous Shared Memory)C++調用接口分析
- Android應用程序進程管理
- Android應用程序進程啟動過程的源代碼分析
- Android系統進程Zygote啟動過程的源代碼分析
- Android系統默認Home應用程序(Launcher)的啟動過程源代碼分析
- Android應用程序消息機制
- Android應用程序消息處理機制(Looper、Handler)分析
- Android應用程序線程消息循環模型分析
- Android應用程序輸入事件分發和處理機制
- Android應用程序鍵盤(Keyboard)消息處理機制分析
- Android應用程序UI架構
- Android系統的開機畫面顯示過程分析
- Android幀緩沖區(Frame Buffer)硬件抽象層(HAL)模塊Gralloc的實現原理分析
- SurfaceFlinger
- Android系統Surface機制的SurfaceFlinger服務
- SurfaceFlinger服務簡要介紹和學習計劃
- 啟動過程分析
- 對幀緩沖區(Frame Buffer)的管理分析
- 線程模型分析
- 渲染應用程序UI的過程分析
- Android應用程序與SurfaceFlinger服務的關系
- 概述和學習計劃
- 連接過程分析
- 共享UI元數據(SharedClient)的創建過程分析
- 創建Surface的過程分析
- 渲染Surface的過程分析
- Android應用程序窗口(Activity)
- 實現框架簡要介紹和學習計劃
- 運行上下文環境(Context)的創建過程分析
- 窗口對象(Window)的創建過程分析
- 視圖對象(View)的創建過程分析
- 與WindowManagerService服務的連接過程分析
- 繪圖表面(Surface)的創建過程分析
- 測量(Measure)、布局(Layout)和繪制(Draw)過程分析
- WindowManagerService
- WindowManagerService的簡要介紹和學習計劃
- 計算Activity窗口大小的過程分析
- 對窗口的組織方式分析
- 對輸入法窗口(Input Method Window)的管理分析
- 對壁紙窗口(Wallpaper Window)的管理分析
- 計算窗口Z軸位置的過程分析
- 顯示Activity組件的啟動窗口(Starting Window)的過程分析
- 切換Activity窗口(App Transition)的過程分析
- 顯示窗口動畫的原理分析
- Android控件TextView的實現原理分析
- Android視圖SurfaceView的實現原理分析
- Android應用程序UI硬件加速渲染
- 簡要介紹和學習計劃
- 環境初始化過程分析
- 預加載資源地圖集服務(Asset Atlas Service)分析
- Display List構建過程分析
- Display List渲染過程分析
- 動畫執行過程分析
- Android應用程序資源管理框架
- Android資源管理框架(Asset Manager)
- Asset Manager 簡要介紹和學習計劃
- 編譯和打包過程分析
- Asset Manager的創建過程分析
- 查找過程分析
- Dalvik虛擬機和ART虛擬機
- Dalvik虛擬機
- Dalvik虛擬機簡要介紹和學習計劃
- Dalvik虛擬機的啟動過程分析
- Dalvik虛擬機的運行過程分析
- Dalvik虛擬機JNI方法的注冊過程分析
- Dalvik虛擬機進程和線程的創建過程分析
- Dalvik虛擬機垃圾收集機制簡要介紹和學習計劃
- Dalvik虛擬機Java堆創建過程分析
- Dalvik虛擬機為新創建對象分配內存的過程分析
- Dalvik虛擬機垃圾收集(GC)過程分析
- ART虛擬機
- Android ART運行時無縫替換Dalvik虛擬機的過程分析
- Android運行時ART簡要介紹和學習計劃
- Android運行時ART加載OAT文件的過程分析
- Android運行時ART加載類和方法的過程分析
- Android運行時ART執行類方法的過程分析
- ART運行時垃圾收集機制簡要介紹和學習計劃
- ART運行時Java堆創建過程分析
- ART運行時為新創建對象分配內存的過程分析
- ART運行時垃圾收集(GC)過程分析
- ART運行時Compacting GC簡要介紹和學習計劃
- ART運行時Compacting GC堆創建過程分析
- ART運行時Compacting GC為新創建對象分配內存的過程分析
- ART運行時Semi-Space(SS)和Generational Semi-Space(GSS)GC執行過程分析
- ART運行時Mark-Compact( MC)GC執行過程分析
- ART運行時Foreground GC和Background GC切換過程分析
- Android安全機制
- SEAndroid安全機制簡要介紹和學習計劃
- SEAndroid安全機制框架分析
- SEAndroid安全機制中的文件安全上下文關聯分析
- SEAndroid安全機制中的進程安全上下文關聯分析
- SEAndroid安全機制對Android屬性訪問的保護分析
- SEAndroid安全機制對Binder IPC的保護分析
- 從NDK在非Root手機上的調試原理探討Android的安全機制
- APK防反編譯
- Android視頻硬解穩定性問題探討和處理
- Android系統的智能指針(輕量級指針、強指針和弱指針)的實現原理分析
- Android應用程序安裝過程源代碼分析
- Android應用程序啟動過程源代碼分析
- 四大組件源代碼分析
- Activity
- Android應用程序的Activity啟動過程簡要介紹和學習計劃
- Android應用程序內部啟動Activity過程(startActivity)的源代碼分析
- 解開Android應用程序組件Activity的"singleTask"之謎
- Android應用程序在新的進程中啟動新的Activity的方法和過程分析
- Service
- Android應用程序綁定服務(bindService)的過程源代碼分析
- ContentProvider
- Android應用程序組件Content Provider簡要介紹和學習計劃
- Android應用程序組件Content Provider應用實例
- Android應用程序組件Content Provider的啟動過程源代碼分析
- Android應用程序組件Content Provider在應用程序之間共享數據的原理分析
- Android應用程序組件Content Provider的共享數據更新通知機制分析
- BroadcastReceiver
- Android系統中的廣播(Broadcast)機制簡要介紹和學習計劃
- Android應用程序注冊廣播接收器(registerReceiver)的過程分析
- Android應用程序發送廣播(sendBroadcast)的過程分析