近來回顧了一下關於Activity的生命週期,參看了相關書籍和官方文檔,也有了不小的收穫,對於以前的認知有了很大程度上的改善,在這裏和大家分享一下。
總所周知,Activity的生命週期(onCreate,onStart,onResume,onPause,onStop,onRestart,onDestroy)
上圖是經典的activity生命週期圖,相信不少朋友也都看過。
簡單的說,在一個activity創建的時候生命週期順序onCreate->onStart->onResume,在activity關閉的時候onPause->onStop->onDestroy。當處於棧頂的activity(當前可見的activity),打開新的activity的時候,新的activity透明或部分遮擋當前activity,執行onPause(),完全遮擋執行onStop。而打開新的activity不是瞬間覆蓋當前activity,而是具有動畫效果的漸入,所以先執行onPause再onStop。
知道了Activity的生命週期,那麼Activity是怎麼執行onCreate的呢?
進入Activity的onCreate方法中看到
<span style="font-family:Microsoft YaHei;color:#333333;"> protected void onCreate(@Nullable Bundle savedInstanceState) {
if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);
if (mLastNonConfigurationInstances != null) {
mAllLoaderManagers = mLastNonConfigurationInstances.loaders;
}
if (mActivityInfo.parentActivityName != null) {
if (mActionBar == null) {
mEnableDefaultActionBarUp = true;
} else {
mActionBar.setDefaultDisplayHomeAsUpEnabled(true);
}
}
if (savedInstanceState != null) {
Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
? mLastNonConfigurationInstances.fragments : null);
}
mFragments.dispatchCreate();
getApplication().dispatchActivityCreated(this, savedInstanceState);
if (mVoiceInteractor != null) {
mVoiceInteractor.attachActivity(this);
}
mCalled = true;
}</span>
看到關鍵地方getApplication().dispatchActivityCreated(this, savedInstanceState);
再來看Application的dispatchActivityCreated方法
<span style="font-family:Microsoft YaHei;color:#333333;"> /* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
savedInstanceState);
}
}
}</span>
<span style="font-family:Microsoft YaHei;color:#333333;"> public interface ActivityLifecycleCallbacks {
void onActivityCreated(Activity activity, Bundle savedInstanceState);
void onActivityStarted(Activity activity);
void onActivityResumed(Activity activity);
void onActivityPaused(Activity activity);
void onActivityStopped(Activity activity);
void onActivitySaveInstanceState(Activity activity, Bundle outState);
void onActivityDestroyed(Activity activity);
}</span>
從上面代碼可以看出,Activity的創建是後於Application的onCreate。也就是說onCreate(Application)->onCreate(Activity),而dispatchActivityCreated是作爲管理Activity的存在。
那麼疑問又來了,Application又是什麼時候執行的呢?
這時,我們需要了解AMS----ActivityManagerService,ActivityThread,ApplicationThread三個類。
ActivityManagerService.java 簡稱爲 AMS 功能有:管理所有應用程序的Activity 、內存管理等 。
路徑位於: \frameworks\base\services\java\com\android\server\am\ActivityManagerService.java
說明:該類是一個Binder類,即可實現跨進程通信。因此可以接受從客戶端,例如Instrumentation、Context等調用過來的
信息。ActivityManagerService提供了全局的代理對象,供IPC調用。
ActivityThread.java 路徑位於:\frameworks\base\core\java\android\app\ActivityThread.java
說明: 該類爲應用程序(即APK包)所對應進程(一個進程裏可能有多個應用程序)的主線程類,即我們通常所說的UI線程。
一個ActivityThread類對應於一個進程。最重要的是,每個應用程序的入口是該類中的static main()函數 。
ApplicationThread類是ActivityThread的內部類:
說明:該類是一個Binder類,即可實現跨進程通信。主要用於接受從AMS傳遞過來的消息,繼而做相應處理。
AMS與ActivityThread的通信模型圖如下:
從該模型圖我們得知以下知識點:
第一、 引起調用AMS的對象通常有Context 、 Instrumentatio、ActivityThread等 。
第二、當AMS接受到來自某個應用程序傳來的消息後,在AMS內部處理完畢後,會通過Binder機制回調回該應用程序
所在ApplicationThread服務端類,即ActivityThread.java類。
第三、當ActivityThread接受到AMS傳遞過來的消息後,進行內部處理。如果需要的話,會繼續與AMS通信。
最後,當整個通信完成時,ActivityThread會選擇合適的對象,例如Service、Activity、BroadcastReceiver等去做相應的
處理。
最後我們需要知道,AcitityThread接收到AMS的是什麼消息,以及接收到消息之後,會怎麼做?
在整個系統中,Activity實際上有兩個實體。一個在應用進程中跟應用程序員打交道的Activity,一個是在AMS的中具有管理功能的History Record。應用進程中的Activity都登記ActivityThread實例中的mActivity數組中,而在AM端,HistroytRecord實例放置在mHistroy棧中。mHistory棧是Android管理Activity的場所,放置在棧頂的就是User看到的處於活動狀態的Activity。
Activity與HistrotyRecord的關係圖可以表示如下:
Activity的內核實體是依靠在ProcessRecord的成員變量中,通過ProcessRecord我們可以訪問到所有的屬於該Process的Activity。而在ProcessRecord記錄了與應用進程之間的聯繫:IActivtityThread接口。通過該接口,可以訪問到所對應的Activity的方法。在Launch Activity時,AMS將對應的HistoryRecord作爲token傳遞到客服端和客服端的Activity建立聯繫。在AMS中Activity狀態變化時,將通過該聯繫找到客服端的Activity,從而將消息或者動作傳遞應用程序面對的接口:xxxActivity。
1)發起請求startActivity(intent)
2)Activity Service Manager接收到請求執行StartActivity函數。
建立:HistoryRecord實例r.
將r 加入到mHistory頂。
(3)通過app.thread.scheduleLaunchActvity( app,r)@ActivityThread.java
(4)在App應用中建立新的ActivityRecord。
(5)建立新的Activity對象並放入到ActivityRecord中。
(6)將ActivityRecord加入到mActivites@ActivityThread
(7)發起Activity.onCreate(..),,該onCreate就是在你的應用程序XXXActivity中的onCreate。
部分內容轉自:
Android中ActivityManagerService與應用程序(客戶端)通信模型分析
Android應用框架之Activity
總結:Activity的誕生: startActivity->ActivityManagerService->HistoryRecord->ApplicationThread->ActivityThread->onCreate(Activity)
本文僅供學習和參考,如有錯誤請指出,謝謝。轉載請註明出處