最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android APP啟動方式、啟動流程及啟動優(yōu)化分析

 更新時間:2016年09月26日 08:50:22   投稿:lqh  
這篇文章主要介紹了Android APP啟動方式、啟動流程及啟動優(yōu)化分析的相關資料,需要的朋友可以參考下

本文章向大家介紹Android app應用啟動的一些相關知識,包括app啟動方式、app啟動流程和app啟動優(yōu)化等知識!

 app應用啟動方式

1、冷啟動

 當啟動應用時,后臺沒有該應用的進程,這時系統(tǒng)會重新創(chuàng)建一個新的進程分配給該應用,這個啟動方式就是冷啟動。冷啟動因為系統(tǒng)會重新創(chuàng)建一個新的進程分配給它,所以會先創(chuàng)建和初始化Application類,再創(chuàng)建和初始化MainActivity類(包括一系列的測量、布局、繪制),最后顯示在界面上。

2、熱啟動

當啟動應用時,后臺已有該應用的進程(例:按back鍵、home鍵,應用雖然會退出,但是該應用的進程是依然會保留在后臺,可進入任務列表查看),所以在已有進程的情況下,這種啟動會從已有的進程中來啟動應用,這個方式叫熱啟動。熱啟動因為會從已有的進程中來啟動,所以熱啟動就不會走Application這步了,而是直接走MainActivity(包括一系列的測量、布局、繪制),所以熱啟動的過程只需要創(chuàng)建和初始化一個MainActivity就行了,而不必創(chuàng)建和初始化Application,因為一個應用從新進程的創(chuàng)建到進程的銷毀,Application只會初始化一次。

 app應用啟動流程

為方便排版,去掉部分方法中的參數(shù):

  1. 從Activity類的startActivity()方法開始,這個方法會調用Activity類中的public void startActivityForResult()方法
  2. startActivityForResult()方法會調用Instrumentation類中的public ActivityResult execStartActivity()方法,這個方法加上了{@hide}對外是不可見的
  3. execStartActivity()方法中有如下的調用語句ActivityManagerNative.getDefault().startActivity(),它調用了IActivityManager類中的startActivity()方法
  4. 但IActivityManager其實只是一個接口,這里實際調用的是public abstract classActivityManagerNative這個類(它繼承自Binder類)的內部類ActivityManagerProxy中的public int startActivity()方法,ActivityManagerProxy實現(xiàn)了IActivityManager接口
  5. ActivityManagerProxy類的public int startActivity()方法中有如下代碼,mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0),這里mRemote是一個IBinder對象,這個對象在ActivityManagerProxy構造方法中實例化,實際由外部類ActivityManagerNative的static public IActivityManager asInterface(IBinder obj)方法實例化,asInterface(IBinder obj)方法中參數(shù)實際在ActivityManagerNative類的static public IActivityManager getDefault()方法中,由ServiceManager.getService("activity")實例化
  6. mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0)這條語句通過IBinder的transact()方法,將方法中的參數(shù)跨進程傳遞給ActivityManagerService類
  7. 以上除ActivityManagerService類之外的類都位于android.app包下
  8. 下面進入ActivityManagerService類,它位于源碼的/frameworks/base/services/java/com/android/server/am/路徑下,包名是com.android.server.am
  9. ActivityManagerService繼承了ActivityManagerNative類,從ActivityManagerProxy類的mRemote.transact()傳遞過來的參數(shù),被傳遞到ActivityManagerService類的onTransact()方法來處理
  10. ActivityManagerService類的onTransact()方法實際上通過super.onTransact(code, data, reply, flags)這條語句又調用了ActivityManagerNative類中的onTransact()方法
  11. super.onTransact(code, data, reply, flags)這條語句會調用到ActivityManagerService類的public final int startActivity()方法
  12. ActivityManagerService類的startActivity()方法會調用到ActivityStack類的startActivityMayWait()方法
  13. ActivityStack類位于com.android.server.am包下,startActivityMayWait()方法final int startActivityLocked()方法
  14. startActivityLocked()方法最后會調用final boolean resumeTopActivityLocked()方法
  15. resumeTopActivityLocked()方法會調用private final void startSpecificActivityLocked()方法
  16. startSpecificActivityLocked()方法會調用startProcessLocked()方法
  17. startProcessLocked()方法會調用android.os.Process類的public static final int start()方法
  18. int pid = Process.start("android.app.ActivityThread", mSimpleProcessManagement ? app.processName : null, uid, uid, gids, debugFlags, null)
  19. 下面進入android.os包下的Process類中
  20. start()方法會調用private static int startViaZygote()方法
  21. startViaZygote()方法會調用private static int zygoteSendArgsAndGetPid()方法
  22. zygoteSendArgsAndGetPid()方法會使用socket與zygote進程通信
  23. sZygoteSocket = new LocalSocket();
  24. sZygoteSocket.connect(new LocalSocketAddress(ZYGOTE_SOCKET, LocalSocketAddress.Namespace.RESERVED));
  25. 下面進入com.android.internal.os包下的ZygoteInit類
  26. ZygoteInit類里面含有LocalSocketServer的實例,會與上面提到的zygoteSendArgsAndGetPid()方法使用socket進行通信
  27. 實際邏輯在ZygoteConnection這個類中的boolean runOnce()方法中
  28. runOnce()方法會調用dalvik.system.Zygote這個類中的靜態(tài)方法forkAndSpecialize()
  29. 下面進入dalvik.system包中的Zygote類
  30. forkAndSpecialize()最終調用了native的方法native public static int forkAndSpecialize()
  31. 在c代碼中開啟應用程序的進程
  32. 應用的進程從android.app包下的ActivityThread類開始運行
  33. ActivityThread類中含有main()方法
  34. ActivityThread.main()是應用的啟動入口,在應用程序啟動的時候就會調用

 app的啟動優(yōu)化:

基于上面的啟動流程我們盡量做到如下幾點

  1. Application的創(chuàng)建過程中盡量少的進行耗時操作
  2. 如果用到SharePreference,盡量在異步線程中操作
  3. 減少布局的層次,并且生命周期回調的方法中盡量減少耗時的操作

通過此文,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • Android編程實現(xiàn)加載等待ProgressDialog的方法

    Android編程實現(xiàn)加載等待ProgressDialog的方法

    這篇文章主要介紹了Android編程實現(xiàn)加載等待ProgressDialog的方法,實例分析了Android中加載等待類ProgressDialog的具體使用方法,需要的朋友可以參考下
    2015-12-12
  • Flutter開發(fā)之動態(tài)權限的使用

    Flutter開發(fā)之動態(tài)權限的使用

    眾所周知,Android在6.0版本后將權限修改成了動態(tài)權限,而iOS則一直使用的是動態(tài)權限,所以在Flutter應用開發(fā)中如果涉及到一些危險權限,就需要進行動態(tài)申請,本文就詳細的介紹一下,感興趣的可以了解一下
    2021-09-09
  • Android如何通過命令行操作Sqlite3數(shù)據(jù)庫的方法

    Android如何通過命令行操作Sqlite3數(shù)據(jù)庫的方法

    這篇文章主要介紹了Android如何通過命令行操作Sqlite3數(shù)據(jù)庫的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Android橫豎屏幕切換小結

    Android橫豎屏幕切換小結

    這篇文章主要介紹了Android橫豎屏切換小結的相關資料,需要的朋友可以參考下
    2016-02-02
  • Android自定義TextBanner實現(xiàn)自動滾動

    Android自定義TextBanner實現(xiàn)自動滾動

    這篇文章主要為大家詳細介紹了Android自定義TextBanner實現(xiàn)自動滾動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Android自定義View實現(xiàn)拖拽效果

    Android自定義View實現(xiàn)拖拽效果

    這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)拖拽效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Android中ImageCropper矩形、圓形 裁剪框的實現(xiàn)方法

    Android中ImageCropper矩形、圓形 裁剪框的實現(xiàn)方法

    這篇文章主要給大家介紹了關于Android中ImageCropper矩形、圓形 裁剪框的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2018-07-07
  • Android攔截并獲取WebView內部POST請求參數(shù)的實現(xiàn)方法

    Android攔截并獲取WebView內部POST請求參數(shù)的實現(xiàn)方法

    這篇文章主要介紹了Android攔截并獲取WebView內部POST請求參數(shù) 的實現(xiàn)方法,本文通過兩種方案給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • android實現(xiàn)上滑屏幕隱藏底部菜單欄的示例

    android實現(xiàn)上滑屏幕隱藏底部菜單欄的示例

    這篇文章主要介紹了android實現(xiàn)上滑屏幕隱藏底部菜單欄的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Android運用BroadcastReceiver實現(xiàn)強制下線

    Android運用BroadcastReceiver實現(xiàn)強制下線

    本篇文章主要介紹了Android運用BroadcastReceiver實現(xiàn)強制下線,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評論

衢州市| 鹿邑县| 浪卡子县| 奇台县| 来安县| 金川县| 新沂市| 石阡县| 剑河县| 乌恰县| 中超| 基隆市| 南木林县| 平顶山市| 栖霞市| 灵璧县| 呼伦贝尔市| 海晏县| 岳阳县| 洮南市| 梅河口市| 晋江市| 甘孜| 遂溪县| 土默特左旗| 长寿区| 虎林市| 天津市| 溆浦县| 沅陵县| 循化| 防城港市| 多伦县| 阜南县| 珠海市| 灵石县| 商城县| 都兰县| 靖州| 宁晋县| 南丰县|