一、Android應用程序啟動的概述
在Android系統中,當我們點擊應用程序圖標時,啟動該應用程序的過程是一個相當複雜的過程,涉及到了諸多系統組件的協同工作。Android系統啟動應用程序的過程可以分為四個階段:Zygote啟動、System Server啟動、Activity Manager啟動和應用程序啟動。下面我們將詳細介紹這四個階段的工作內容。
二、Zygote啟動
Zygote是Android系統中的一個特殊進程,專門用於創建新進程。啟動Zygote進程是Android啟動應用程序的第一步。當我們點擊應用程序圖標時,系統會先啟動Zygote進程。Zygote進程首先會預加載一些常用的Android framework類,以加快界面顯示的速度。當Zygote進程完成初始化工作後,會等待Activity Manager發送請求創建新進程的命令。
三、System Server啟動
System Server是Android系統中的一個服務進程,包含了許多服務組件,如Activity Manager、Package Manager、Window Manager等。在啟動應用程序之前,必須先啟動System Server進程。System Server進程主要負責系統核心服務的啟動和管理。
當Zygote進程收到Activity Manager請求創建新進程的命令時,會fork一個新進程。然後Zygote把自己的狀態複製到新進程中,新進程中就可以直接使用Zygote已經加載好的framework類。同時,新進程還會調用system_server進程提供的服務,如PackageManagerService、SystemService等。這時,System Server進程就會為新進程分配進程ID,並啟動新進程。新進程啟動後,Zygote進程會銷毀原有的進程。
四、Activity Manager啟動
Activity Manager是Android系統中的一個管理Activity的系統服務。當新進程啟動後,Activity Manager進程會通知新進程啟動主Activity。新進程會啟動主Activity以及與主Activity關聯的系統服務,如Service、BroadcastReceiver等。主Activity啟動後,會依次啟動Application、Activity LifeCycle、View、ViewGroup、ActivityThread等對象。當所有對象都啟動完成後,應用程序就可以完全顯示出來。
五、應用程序啟動
應用程序啟動就是在ActivityThread對象的handleLaunchActivity方法中實現的。當Activity Manager通知啟動主Activity時,ActivityThread對象就會調用handleLaunchActivity方法,創建新的Activity,並啟動新的進程。
下面是應用程序啟動的代碼示例:
public class ActivityThread { public static void main(String[] args) { Looper.prepareMainLooper(); ActivityThread thread = new ActivityThread(); thread.attach(false); if (sMainThreadHandler == null) { sMainThreadHandler = thread.getHandler(); } Looper.loop(); } public void attach(boolean system) { sThreadLocal.set(this); if (!system) { ApplicationInfo info = getApplicationInfo(); VMRuntime.registerAppInfo(info); } Instrumentation instrumentation = IMPL.newInstrumentation(); ContextImpl context = ContextImpl.createAppContext(this, getInitialApplication()); mInitialApplication = null; ActivityThreadHandler handler = new ActivityThreadHandler(context.getMainLooper()); handler.sendMessage(handler.obtainMessage(MSG_ATTACH_AGENT, instrumentation)); if (!system) { RuntimeInit.setApplicationObject(context.getProcessName(), context.getApplicationObject()); } try { ActivityManagerNative.getDefault().attachApplication(new ApplicationThread()); } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } } final class ApplicationThread extends ApplicationThreadNative { @Override public void scheduleLaunchActivity(Intent intent, IBinder token, int ident, ActivityInfo info, Configuration curConfig, CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor, Bundle state, PersistableBundle persistentState, List pendingResults, List pendingNewIntents, boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) { ... ActivityClientRecord r = new ActivityClientRecord(); r.token = token; r.ident = ident; r.intent = intent; r.referrer = referrer; r.voiceInteractor = voiceInteractor; r.activityInfo = info; r.compatInfo = compatInfo; r.state = state; r.persistentState = persistentState; r.pendingResults = pendingResults; r.pendingNewIntents = pendingNewIntents; r.startsNotResumed = notResumed; r.isForward = isForward; r.profilerInfo = profilerInfo; ActivityClientRecord existing = mActivities.get(token); if (existing != null) { ... } else { mActivities.put(token, r); ... prePerformCreate(r); mInstrumentation.callActivityOnCreate(r.activity, r.state); ... performResumeActivity(r.token, true, "onCreate"); } ... } } }
六、總結
在Android系統中,應用程序的啟動是一個複雜的過程,涉及到了諸多的系統組件的協同工作。了解Android應用程序啟動的過程,對於我們開發高效的Android應用程序具有重要的幫助。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/257749.html