Android APP啟動方式、啟動流程及啟動優(yōu)化分析
本文章向大家介紹Android app應(yīng)用啟動的一些相關(guān)知識,包括app啟動方式、app啟動流程和app啟動優(yōu)化等知識!
app應(yīng)用啟動方式
1、冷啟動
當(dāng)啟動應(yīng)用時,后臺沒有該應(yīng)用的進程,這時系統(tǒng)會重新創(chuàng)建一個新的進程分配給該應(yīng)用,這個啟動方式就是冷啟動。冷啟動因為系統(tǒng)會重新創(chuàng)建一個新的進程分配給它,所以會先創(chuàng)建和初始化Application類,再創(chuàng)建和初始化MainActivity類(包括一系列的測量、布局、繪制),最后顯示在界面上。
2、熱啟動
當(dāng)啟動應(yīng)用時,后臺已有該應(yīng)用的進程(例:按back鍵、home鍵,應(yīng)用雖然會退出,但是該應(yīng)用的進程是依然會保留在后臺,可進入任務(wù)列表查看),所以在已有進程的情況下,這種啟動會從已有的進程中來啟動應(yīng)用,這個方式叫熱啟動。熱啟動因為會從已有的進程中來啟動,所以熱啟動就不會走Application這步了,而是直接走MainActivity(包括一系列的測量、布局、繪制),所以熱啟動的過程只需要創(chuàng)建和初始化一個MainActivity就行了,而不必創(chuàng)建和初始化Application,因為一個應(yīng)用從新進程的創(chuàng)建到進程的銷毀,Application只會初始化一次。
app應(yīng)用啟動流程
為方便排版,去掉部分方法中的參數(shù):
- 從Activity類的startActivity()方法開始,這個方法會調(diào)用Activity類中的public void startActivityForResult()方法
- startActivityForResult()方法會調(diào)用Instrumentation類中的public ActivityResult execStartActivity()方法,這個方法加上了{@hide}對外是不可見的
- execStartActivity()方法中有如下的調(diào)用語句ActivityManagerNative.getDefault().startActivity(),它調(diào)用了IActivityManager類中的startActivity()方法
- 但IActivityManager其實只是一個接口,這里實際調(diào)用的是public abstract classActivityManagerNative這個類(它繼承自Binder類)的內(nèi)部類ActivityManagerProxy中的public int startActivity()方法,ActivityManagerProxy實現(xiàn)了IActivityManager接口
- ActivityManagerProxy類的public int startActivity()方法中有如下代碼,mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0),這里mRemote是一個IBinder對象,這個對象在ActivityManagerProxy構(gòu)造方法中實例化,實際由外部類ActivityManagerNative的static public IActivityManager asInterface(IBinder obj)方法實例化,asInterface(IBinder obj)方法中參數(shù)實際在ActivityManagerNative類的static public IActivityManager getDefault()方法中,由ServiceManager.getService("activity")實例化
- mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0)這條語句通過IBinder的transact()方法,將方法中的參數(shù)跨進程傳遞給ActivityManagerService類
- 以上除ActivityManagerService類之外的類都位于android.app包下
- 下面進入ActivityManagerService類,它位于源碼的/frameworks/base/services/java/com/android/server/am/路徑下,包名是com.android.server.am
- ActivityManagerService繼承了ActivityManagerNative類,從ActivityManagerProxy類的mRemote.transact()傳遞過來的參數(shù),被傳遞到ActivityManagerService類的onTransact()方法來處理
- ActivityManagerService類的onTransact()方法實際上通過super.onTransact(code, data, reply, flags)這條語句又調(diào)用了ActivityManagerNative類中的onTransact()方法
- super.onTransact(code, data, reply, flags)這條語句會調(diào)用到ActivityManagerService類的public final int startActivity()方法
- ActivityManagerService類的startActivity()方法會調(diào)用到ActivityStack類的startActivityMayWait()方法
- ActivityStack類位于com.android.server.am包下,startActivityMayWait()方法final int startActivityLocked()方法
- startActivityLocked()方法最后會調(diào)用final boolean resumeTopActivityLocked()方法
- resumeTopActivityLocked()方法會調(diào)用private final void startSpecificActivityLocked()方法
- startSpecificActivityLocked()方法會調(diào)用startProcessLocked()方法
- startProcessLocked()方法會調(diào)用android.os.Process類的public static final int start()方法
- int pid = Process.start("android.app.ActivityThread", mSimpleProcessManagement ? app.processName : null, uid, uid, gids, debugFlags, null)
- 下面進入android.os包下的Process類中
- start()方法會調(diào)用private static int startViaZygote()方法
- startViaZygote()方法會調(diào)用private static int zygoteSendArgsAndGetPid()方法
- zygoteSendArgsAndGetPid()方法會使用socket與zygote進程通信
- sZygoteSocket = new LocalSocket();
- sZygoteSocket.connect(new LocalSocketAddress(ZYGOTE_SOCKET, LocalSocketAddress.Namespace.RESERVED));
- 下面進入com.android.internal.os包下的ZygoteInit類
- ZygoteInit類里面含有LocalSocketServer的實例,會與上面提到的zygoteSendArgsAndGetPid()方法使用socket進行通信
- 實際邏輯在ZygoteConnection這個類中的boolean runOnce()方法中
- runOnce()方法會調(diào)用dalvik.system.Zygote這個類中的靜態(tài)方法forkAndSpecialize()
- 下面進入dalvik.system包中的Zygote類
- forkAndSpecialize()最終調(diào)用了native的方法native public static int forkAndSpecialize()
- 在c代碼中開啟應(yīng)用程序的進程
- 應(yīng)用的進程從android.app包下的ActivityThread類開始運行
- ActivityThread類中含有main()方法
- ActivityThread.main()是應(yīng)用的啟動入口,在應(yīng)用程序啟動的時候就會調(diào)用
app的啟動優(yōu)化:
基于上面的啟動流程我們盡量做到如下幾點
- Application的創(chuàng)建過程中盡量少的進行耗時操作
- 如果用到SharePreference,盡量在異步線程中操作
- 減少布局的層次,并且生命周期回調(diào)的方法中盡量減少耗時的操作
通過此文,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Activity/Fragment結(jié)束時處理異步回調(diào)的解決方案
這篇文章主要介紹了關(guān)于在Activity/Fragment結(jié)束時處理異步回調(diào)的解決方案,文中介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03Android系統(tǒng)聯(lián)系人全特效實現(xiàn)(上)分組導(dǎo)航和擠壓動畫(附源碼)
本文將為大家講解下Android系統(tǒng)聯(lián)系人全特效實現(xiàn)之分組導(dǎo)航和擠壓動畫,具體實現(xiàn)及源代碼如下,感興趣的朋友可以參考下哈,希望對大家學(xué)習(xí)有所幫助2013-06-06Android編程簡單解析JSON格式數(shù)據(jù)的方法示例
這篇文章主要介紹了Android編程簡單解析JSON格式數(shù)據(jù)的方法,結(jié)合實例形式分析了Android編程解析json格式數(shù)據(jù)的實現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下2017-08-08Android OnCreate()中獲取控件高度與寬度兩種方法詳解
這篇文章主要介紹了Android OnCreate()中獲取控件高度與寬度兩種方法詳解的相關(guān)資料,這里提供了兩種方法,大家可以都看下,需要的朋友可以參考下2016-12-12