Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Activity 啟動流程

Activity 啟動流程

編輯:關於Android編程

Activity的啟動;

Intent intent = new Intent(this,A.class);

startActivity(intent);

startActivity方法有好幾種加載方式 但是最終都會調用startActivityForResult方法

\

注意; mMainThread.getApplication 的類型是 ApplicationThread 類型。

ApplicationThread 是ActivityThread 一個內部類。

ApplicationThread 與ActivityThread 在Activity 啟動過程中發揮著很重要的作用。

\

\

通過以上代碼可以看出 Activity的真正啟動是通過 ActivityManagerNative.getDefault().startActivity(….) 方法啟動,

ActivityManagerService extends ActivityManagerNative;

ActivityManagerNative extends Binder implements IActivityManager

而 ActivityManagerNative.getDefault() 其實是一個IActivityManager 類型的Binder 因此具體的 startActivity的實現是在 ActivityManagerService中實現的。

\

\

而ActivityManagerService 這個Binder對象 是一個單例模式

第一次調用get時會調用create方法創建改對象,之後則返回之前創建的對象。

通過上述分析 Activity的啟動是通過ActivityManagerNative.getDefault().start(…) 啟動,進而轉化為 ActivityManagerService 中。

\

\

可以看出 startActivity 的啟動流程又轉移到了 ActivitySupervisor中的startActivityMayWait中,

接著 startActivityMayWait中調用了 StartActivityLocked ,startActivityLocked 緊接著調用了 startActivityUncheckedLocked ,然後 startActivityUnCheckLocked 調用了

ActivityStack 類中的resumeTopActivitiesLocked 方法

\

在 resumeTopActivityLocked方法中 調用了 resumeTopActivityInnerLocked方法, 而 resumeTopActivityInnerLocked方法中 又調用了

ActivityStackSupervisor 中的 startSpecificActivityLocked方法。

\

 

\

在 startSpecificActivityLocked 方法中又調用了 realStartActivityLocked方法

在ActivityStartSupervisor以及 ActivityStack 中 的調用流程

\

在 realStartActivityLocked 中又調用了scheduleaunchActivity 方法

改方法 :

\

 

 

 

而 app.thread 的類型為 IApplicationThread 改接口中主要是實現了大量的Activity以及service 啟動停止相關的功能

\

那麼 IApplicationThread 接口的實現是什麼呢?

答案就是ActivityThread 的內部類ApplicationThread 中實現了IApplicationThread

\

可以看出 ApplicationThread 實現了 ApplicationThreadNative 而 ApplicationThreadNative 繼承 Binder 同時實現了 IApplicationThread

繞了一圈 可以看出 activity的啟動最終還是需要 ApplicationThread 來實現。

在ApplicationThread 中 通過scheduleLaunchActivity 方式實現。

\

而 內部的實現很簡單 就是發送一個啟動Activity的Handle 來解決

接著 看一些 接受 消息的 Handler H

\

 

從 H類中可以看出 activity的啟動 是通過handleLaunchActivity 來實現的。

\

從以上代碼可以看出 performLaunchActivity 方法 最終完成 Activity 對象的創建和 啟動

performLaunchActivity 的主要作用

1:從ActivityClientRecord中 獲取待啟動的Activity組件信息

\

2:通過 Instrumentation 的newActivity方法使用類加載器去創建Activity對象

\

3:通過LoadedApk的makeApplication 方法去嘗試創建Application

\

通過上述代碼可以看出

如果Application已經被創建了那麼就不會再去創建,這樣就保證了一個應用只有一個Application

4: 創建 ContextImpl 對象並通過Activity的Attach方法去完成一些重要數據的初始化

\

5: 調用Activity的onCreate 方法。\

至此 Activity 啟動。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved