欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

 app應(yīng)用啟動(dòng)方式

1、冷啟動(dòng)

 當(dāng)啟動(dòng)應(yīng)用時(shí),后臺(tái)沒有該應(yīng)用的進(jìn)程,這時(shí)系統(tǒng)會(huì)重新創(chuàng)建一個(gè)新的進(jìn)程分配給該應(yīng)用,這個(gè)啟動(dòng)方式就是冷啟動(dòng)。冷啟動(dòng)因?yàn)橄到y(tǒng)會(huì)重新創(chuàng)建一個(gè)新的進(jìn)程分配給它,所以會(huì)先創(chuàng)建和初始化Application類,再創(chuàng)建和初始化MainActivity類(包括一系列的測(cè)量、布局、繪制),最后顯示在界面上。

2、熱啟動(dòng)

當(dāng)啟動(dòng)應(yīng)用時(shí),后臺(tái)已有該應(yīng)用的進(jìn)程(例:按back鍵、home鍵,應(yīng)用雖然會(huì)退出,但是該應(yīng)用的進(jìn)程是依然會(huì)保留在后臺(tái),可進(jìn)入任務(wù)列表查看),所以在已有進(jìn)程的情況下,這種啟動(dòng)會(huì)從已有的進(jìn)程中來(lái)啟動(dòng)應(yīng)用,這個(gè)方式叫熱啟動(dòng)。熱啟動(dòng)因?yàn)闀?huì)從已有的進(jìn)程中來(lái)啟動(dòng),所以熱啟動(dòng)就不會(huì)走Application這步了,而是直接走M(jìn)ainActivity(包括一系列的測(cè)量、布局、繪制),所以熱啟動(dòng)的過(guò)程只需要?jiǎng)?chuàng)建和初始化一個(gè)MainActivity就行了,而不必創(chuàng)建和初始化Application,因?yàn)橐粋€(gè)應(yīng)用從新進(jìn)程的創(chuàng)建到進(jìn)程的銷毀,Application只會(huì)初始化一次。

 app應(yīng)用啟動(dòng)流程

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

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

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

基于上面的啟動(dòng)流程我們盡量做到如下幾點(diǎn)

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

通過(guò)此文,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Flutter 狀態(tài)管理的實(shí)現(xiàn)

    Flutter 狀態(tài)管理的實(shí)現(xiàn)

    這篇文章主要介紹了Flutter 狀態(tài)管理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Android?WebView預(yù)渲染介紹

    Android?WebView預(yù)渲染介紹

    這篇文章主要介紹了Android?WebView預(yù)渲染介紹,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Android WebView 優(yōu)化之路

    Android WebView 優(yōu)化之路

    Android WebView 優(yōu)化之路,如何才能更有效的對(duì)Android WebView進(jìn)行優(yōu)化,本文將為大家一一舉例,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Android 掃描WIFI權(quán)限詳解

    Android 掃描WIFI權(quán)限詳解

    這篇文章主要為大家介紹了Android 掃描WIFI權(quán)限詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Android錄制聲音文件(音頻)并播放

    Android錄制聲音文件(音頻)并播放

    這篇文章主要為大家詳細(xì)介紹了Android錄制聲音文件并播放音頻文件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Activity/Fragment結(jié)束時(shí)處理異步回調(diào)的解決方案

    Activity/Fragment結(jié)束時(shí)處理異步回調(diào)的解決方案

    這篇文章主要介紹了關(guān)于在Activity/Fragment結(jié)束時(shí)處理異步回調(diào)的解決方案,文中介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-03-03
  • Android系統(tǒng)聯(lián)系人全特效實(shí)現(xiàn)(上)分組導(dǎo)航和擠壓動(dòng)畫(附源碼)

    Android系統(tǒng)聯(lián)系人全特效實(shí)現(xiàn)(上)分組導(dǎo)航和擠壓動(dòng)畫(附源碼)

    本文將為大家講解下Android系統(tǒng)聯(lián)系人全特效實(shí)現(xiàn)之分組導(dǎo)航和擠壓動(dòng)畫,具體實(shí)現(xiàn)及源代碼如下,感興趣的朋友可以參考下哈,希望對(duì)大家學(xué)習(xí)有所幫助
    2013-06-06
  • Android編程簡(jiǎn)單解析JSON格式數(shù)據(jù)的方法示例

    Android編程簡(jiǎn)單解析JSON格式數(shù)據(jù)的方法示例

    這篇文章主要介紹了Android編程簡(jiǎn)單解析JSON格式數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Android編程解析json格式數(shù)據(jù)的實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • Android OnCreate()中獲取控件高度與寬度兩種方法詳解

    Android OnCreate()中獲取控件高度與寬度兩種方法詳解

    這篇文章主要介紹了Android OnCreate()中獲取控件高度與寬度兩種方法詳解的相關(guān)資料,這里提供了兩種方法,大家可以都看下,需要的朋友可以參考下
    2016-12-12
  • Android studio設(shè)計(jì)簡(jiǎn)易計(jì)算器

    Android studio設(shè)計(jì)簡(jiǎn)易計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了Android studio設(shè)計(jì)簡(jiǎn)易計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04

最新評(píng)論