1. 程式人生 > >Android深入四大元件(一)應用程式啟動過程

Android深入四大元件(一)應用程式啟動過程

前言

在此前的文章中,我講過了Android系統啟動流程和Android應用程序啟動過程,這一篇順理成章來學習Android 7.0的應用程式的啟動過程。分析應用程式的啟動過程其實就是分析根Activity的啟動過程。

1.Launcher請求ActivityManageService

Android系統啟動流程(四)Launcher啟動過程與系統啟動流程這篇文章我講過Launcher啟動後會將已安裝應用程式的快捷圖示顯示到介面上,當我們點選應用程式的快捷圖示時就會呼叫Launcher的startActivitySafely方法,如下所示。
packages/apps/Launcher3/src/com/android/launcher3/Launcher.java

  public boolean startActivitySafely(View v, Intent intent, Object tag) {
      ...
        try {
            success = startActivity(v, intent, tag);
        } catch (ActivityNotFoundException e) {
            Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
            Log.e(TAG, "Unable to launch. tag="
+ tag + " intent=" + intent, e); } return success; }

startActivitySafely函式中主要就是呼叫了startActivity函式:
packages/apps/Launcher3/src/com/android/launcher3/Launcher.java

 private boolean startActivity(View v, Intent intent, Object tag) {
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//1
try { ... if (user == null || user.equals(UserHandleCompat.myUserHandle())) { StrictMode.VmPolicy oldPolicy = StrictMode.getVmPolicy(); try { StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll() .penaltyLog().build()); startActivity(intent, optsBundle);//2 } finally { StrictMode.setVmPolicy(oldPolicy); } } else { launcherApps.startActivityForProfile(intent.getComponent(), user, intent.getSourceBounds(), optsBundle); } return true; } catch (SecurityException e) { ... } return false; }

在註釋1處設定Flag為Intent.FLAG_ACTIVITY_NEW_TASK,這樣根Activity會在新的任務棧中啟動。在註釋2處呼叫了startActivity函式:
frameworks/base/core/java/android/app/Activity.java

Override
public void startActivity(Intent intent, @Nullable Bundle options) {
    if (options != null) {
        startActivityForResult(intent, -1, options);
    } else {
        startActivityForResult(intent, -1);
    }
}

startActivity會呼叫startActivityForResult函式,其中第二個引數為-1,表示Launcher不需要知道Activity啟動的結果,startActivityForResult函式的程式碼如下所示。
frameworks/base/core/java/android/app/Activity.java

 public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options) {
        if (mParent == null) {
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
         ...
        } else {
         ...
        }
    }

mParent是Activity型別的,表示當前Activity的父類。因為目前根Activity還沒有創建出來,因此,mParent == null成立。接著呼叫Instrumentation的execStartActivity方法,Instrumentation主要用來監控應用程式和系統的互動,execStartActivity方法的程式碼如下所示。
frameworks/base/core/java/android/app/Instrumentation.java

public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options) {
      ...
        try {
            intent.migrateExtraStreamToClipData();
            intent.prepareToLeaveProcess(who);
            int result = ActivityManagerNative.getDefault()
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, options);
            checkStartActivityResult(result, intent);
        } catch (RemoteException e) {
            throw new RuntimeException("Failure from system", e);
        }
        return null;
    }

首先會呼叫ActivityManagerNative的getDefault來獲取ActivityManageService(以後簡稱為AMS)的代理物件,接著呼叫它的startActivity方法。首先我們先來檢視ActivityManagerNative的getDefault方法做了什麼:
frameworks/base/core/java/android/app/ActivityManagerNative.java

  static public IActivityManager getDefault() {
        return gDefault.get();
    }

    private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
        protected IActivityManager create() {
            IBinder b = ServiceManager.getService("activity");//1
            if (false) {
                Log.v("ActivityManager", "default service binder = " + b);
            }
            IActivityManager am = asInterface(b);//2
            if (false) {
                Log.v("ActivityManager", "default service = " + am);
            }
            return am;
        }
    };
}

getDefault方法呼叫了gDefault的get方法,我們接著往下看,gDefault 是一個Singleton類。註釋1處得到名為”activity”的Service代理物件,也就是ActivityManagerService的代理物件。接著在註釋2處將它封裝成ActivityManagerProxy(以後簡稱為AMP)型別物件,並將它儲存到gDefault中,此後呼叫ActivityManagerNative的getDefault方法就會直接獲得AMS的代理AMP物件。
回到Instrumentation類的execStartActivity方法中,從上面得知就是呼叫AMP的startActivity,其中AMP是ActivityManagerNative的內部類,程式碼如下所示。
frameworks/base/core/java/android/app/ActivityManagerNative.java

 public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,
            String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
        data.writeString(callingPackage);
        intent.writeToParcel(data, 0);
        data.writeString(resolvedType);
        data.writeStrongBinder(resultTo);
        data.writeString(resultWho);
        data.writeInt(requestCode);
        data.writeInt(startFlags);
        if (profilerInfo != null) {
            data.writeInt(1);
            profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
        } else {
            data.writeInt(0);
        }
        if (options != null) {
            data.writeInt(1);
            options.writeToParcel(data, 0);
        } else {
            data.writeInt(0);
        }
        mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);//1
        reply.readException();
        int result = reply.readInt();
        reply.recycle();
        data.recycle();
        return result;
    }

首先會將傳入的引數寫入到Parcel型別的data中。在註釋1處通過IBinder物件mRemote想AMS傳送一個START_ACTIVITY_TRANSACTION型別的程序間通訊請求。那麼服務端AMS就會從Binder執行緒池中讀取我們客戶端發來的資料,最終會呼叫ActivityManagerNative的onTransact方法中執行,如下所示。
frameworks/base/core/java/android/app/ActivityManagerNative.java

 @Override
    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
            throws RemoteException {
        switch (code) {
        case START_ACTIVITY_TRANSACTION:
        {
    ...
            int result = startActivity(app, callingPackage, intent, resolvedType,
                    resultTo, resultWho, requestCode, startFlags, profilerInfo, options);
            reply.writeNoException();
            reply.writeInt(result);
            return true;
        }
    }    

onTransact中會呼叫AMS的startActivity方法,如下所示。
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

   @Override
    public final int startActivity(IApplicationThread caller, String callingPackage,
            Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
        return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
                resultWho, requestCode, startFlags, profilerInfo, bOptions,
                UserHandle.getCallingUserId());
    }

為了便於理解,給出Launcher到AMS呼叫過程的時序圖。

2.ActivityManageService到ApplicationThread的呼叫流程

AMS的startActivity方法中return了startActivityAsUser方法:
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

   @Override
    public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
            Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
        enforceNotIsolatedCaller("startActivity");
        userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
                userId, false, ALLOW_FULL_ONLY, "startActivity", null);
        return mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent,
                resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
                profilerInfo, null, null, bOptions, false, userId, null, null);

startActivityAsUser方法中又return了mActivityStarter的startActivityMayWait方法,程式碼如下所示。
frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java

   final int startActivityMayWait(IApplicationThread caller, int callingUid,
            String callingPackage, Intent intent, String resolvedType,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            IBinder resultTo, String resultWho, int requestCode, int startFlags,
            ProfilerInfo profilerInfo, IActivityManager.WaitResult outResult, Configuration config,
            Bundle bOptions, boolean ignoreTargetSecurity, int userId,
            IActivityContainer iContainer, TaskRecord inTask) {
      ...
            int res = startActivityLocked(caller, intent, ephemeralIntent, resolvedType,
                    aInfo, rInfo, voiceSession, voiceInteractor,
                    resultTo, resultWho, requestCode, callingPid,
                    callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
                    options, ignoreTargetSecurity, componentSpecified, outRecord, container,
                    inTask);

        ...
            return res;
        }
    }

又呼叫了startActivityLocked方法,程式碼如下所示。
frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java

 final int startActivityLocked(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
            String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
            String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
            ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
            ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container,
            TaskRecord inTask) {
       ...

        doPendingActivityLaunchesLocked(false);

       ...
        return err;
    }

startActivityLocked函式程式碼非常多,我們只需要關注doPendingActivityLaunchesLocked方法,程式碼如下所示。
frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java

 final void doPendingActivityLaunchesLocked(boolean doResume) {
        while (!mPendingActivityLaunches.isEmpty()) {
            final PendingActivityLaunch pal = mPendingActivityLaunches.remove(0);
            final boolean resume = doResume && mPendingActivityLaunches.isEmpty();
            try {
                final int result = startActivityUnchecked(
                        pal.r, pal.sourceRecord, null, null, pal.startFlags, resume, null, null);
                postStartActivityUncheckedProcessing(
                        pal.r, result, mSupervisor.mFocusedStack.mStackId, mSourceRecord,
                        mTargetStack);
            } catch (Exception e) {
                Slog.e(TAG, "Exception during pending activity launch pal=" + pal, e);
                pal.sendErrorResult(e.getMessage());
            }
        }
    }

接著又呼叫startActivityUnchecked方法:
frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java

 private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask) {
      ...  
         mSupervisor.resumeFocusedStackTopActivityLocked();  
      ... 
        return START_SUCCESS;
    }

startActivityUnchecked方法中呼叫了ActivityStackSupervisor型別的mSupervisor的resumeFocusedStackTopActivityLocked方法,如下所示。
frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

 boolean resumeFocusedStackTopActivityLocked(
            ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
        if (targetStack != null && isFocusedStack(targetStack)) {
            return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
        }
        final ActivityRecord r = mFocusedStack.topRunningActivityLocked();
        if (r == null || r.state != RESUMED) {
            mFocusedStack.resumeTopActivityUncheckedLocked(null, null);//1
        }
        return false;
    }

在註釋1處又呼叫了ActivityStack型別mFocusedStack的resumeTopActivityUncheckedLocked方法:
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java

 boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
...
        try {
           ...
            result = resumeTopActivityInnerLocked(prev, options);
        } finally {
            mStackSupervisor.inResumeTopActivity = false;
        }
        return result;
    }

緊接著檢視ActivityStack的resumeTopActivityInnerLocked方法:
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java

 private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
       ...
            mStackSupervisor.startSpecificActivityLocked(next, true, true);
        }
         if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
        return true; 

resumeTopActivityInnerLocked方法程式碼非常多,我們只需要關注呼叫了ActivityStackSupervisor型別mStackSupervisor的startSpecificActivityLocked方法,程式碼如下所示。
frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

  void startSpecificActivityLocked(ActivityRecord r,
            boolean andResume, boolean checkConfig) {
        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
                r.info.applicationInfo.uid, true);
        r.task.stack.setLaunchTime(r);
        if (app != null && app.thread != null) {//1
            try {
                if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
                        || !"android".equals(r.info.packageName)) {
                    app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode,
                            mService.mProcessStats);
                }
                realStartActivityLocked(r, app, andResume, checkConfig);//2
                return;
            } catch (RemoteException e) {
                Slog.w(TAG, "Exception when starting activity "
                        + r.intent.getComponent().flattenToShortString(), e);
            }
        }
        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
                "activity", r.intent.getComponent(), false, false, true);
    }

在註釋1處如果當前Activity所在的Application執行的話,會執行註釋2處的程式碼。realStartActivityLocked方法的程式碼如下所示。
frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

  final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
            boolean andResume, boolean checkConfig) throws RemoteException {
     ...
            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
                    System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
                    new Configuration(task.mOverrideConfig), r.compat, r.launchedFromPackage,
                    task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,
                    newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);

    ...      

        return true;
    }

這裡的 app.thread指的是IApplicationThread,它的實現是ActivityThread的內部類ApplicationThread,其中ApplicationThread繼承了ApplicationThreadNative,而ApplicationThreadNative繼承了Binder並實現了IApplicationThread介面。
講到這裡再給出ActivityManageService到ApplicationThread呼叫過程的時序圖,如下圖所示。

3.ActivityThread啟動Activity

Android應用程式程序啟動過程(前篇)這篇文章中提到過ActivityThread,在應用程式程序啟動時會建立ActivityThread例項。ActivityThread作為應用程式程序的核心類,它是如何啟動應用程式(Activity)的呢?我們接著往下看。
根據上文接著檢視ApplicationThread的scheduleLaunchActivity方法,程式碼如下所示。
frameworks/base/core/java/android/app/ActivityThread.java

        @Override
        public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
                ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
                CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
                int procState, Bundle state, PersistableBundle persistentState,
                List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
                boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) {
         updateProcessState(procState, false);
            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.pendingIntents = pendingNewIntents;
            r.startsNotResumed = notResumed;
            r.isForward = isForward;
            r.profilerInfo = profilerInfo;
            r.overrideConfig = overrideConfig;
            updatePendingConfiguration(curConfig);
            sendMessage(H.LAUNCH_ACTIVITY, r);
        }

scheduleLaunchActivity方法會將啟動Activity的引數封裝成ActivityClientRecord ,sendMessage方法向H類傳送型別為LAUNCH_ACTIVITY的訊息,並將ActivityClientRecord 傳遞過去,sendMessage方法的程式碼如下所示。
frameworks/base/core/java/android/app/ActivityThread.java

  private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {
     ...
        mH.sendMessage(msg);
    }

這裡mH指的是H,它是ActivityThread的內部類並繼承Handler,H的程式碼如下所示。
frameworks/base/core/java/android/app/ActivityThread.java

  private class H extends Handler {
        public static final int LAUNCH_ACTIVITY         = 100;
        public static final int PAUSE_ACTIVITY          = 101;
  ...
  public void handleMessage(Message msg) {
            if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
            switch (msg.what) {
                case LAUNCH_ACTIVITY: {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
                    final ActivityClientRecord r = (ActivityClientRecord) msg.obj;//1
                    r.packageInfo = getPackageInfoNoCheck(
                            r.activityInfo.applicationInfo, r.compatInfo);//2
                    handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");//3
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;
                case RELAUNCH_ACTIVITY: {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityRestart");
                    ActivityClientRecord r = (ActivityClientRecord)msg.obj;
                    handleRelaunchActivity(r);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;
              ...
  }     

檢視H的handleMessage方法中對LAUNCH_ACTIVITY的處理,在註釋1處將傳過來的msg的成員變數obj轉換為ActivityClientRecord。
在註釋2處通過getPackageInfoNoCheck方法獲得LoadedApk型別的物件並賦值給ActivityClientRecord 的成員變數packageInfo 。應用程式程序要啟動Activity時需要將該Activity所屬的APK載入進來,而LoadedApk就是用來描述已載入的APK檔案。
在註釋3處呼叫handleLaunchActivity方法,程式碼如下所示。
frameworks/base/core/java/android/app/ActivityThread.java

  private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
      ...
        Activity a = performLaunchActivity(r, customIntent);//1
        if (a != null) {
            r.createdConfig = new Configuration(mConfiguration);
            reportSizeConfigurations(r);
            Bundle oldState = r.state;
            handleResumeActivity(r.token, false, r.isForward,
                    !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);//1

            if (!r.activity.mFinished && r.startsNotResumed) {      
                performPauseActivityIfNeeded(r, reason);
                if (r.isPreHoneycomb()) {
                    r.state = oldState;
                }
            }
        } else {
            try {
                ActivityManagerNative.getDefault()
                    .finishActivity(r.token, Activity.RESULT_CANCELED, null,
                            Activity.DONT_FINISH_TASK_WITH_ACTIVITY);
            } catch (RemoteException ex) {
                throw ex.rethrowFromSystemServer();
            }
        }
    }

註釋1處的performLaunchActivity方法用來啟動Activity ,註釋2處的程式碼用來將Activity 的狀態置為Resume。如果該Activity為null則會通知ActivityManager停止啟動Activity。來檢視performLaunchActivity方法做了什麼:
frameworks/base/core/java/android/app/ActivityThread.java

  private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
  ...
        ActivityInfo aInfo = r.activityInfo;//1
        if (r.packageInfo == null) {
            r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,
                    Context.CONTEXT_INCLUDE_CODE);//2
        }
        ComponentName component = r.intent.getComponent();//3
      ...
        Activity activity = null;
        try {
            java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
            activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);//4
           ...
            }
        } catch (Exception e) {
         ...
        }
        try {
            Application app = r.packageInfo.makeApplication(false, mInstrumentation);//5

        ...
            if (activity != null) {
                Context appContext = createBaseContextForActivity(r, activity);//6
         ...
                }
                /**
                *7
                */
                activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor, window);

              ...
                if (r.isPersistable()) {
                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);//8
                } else {
                    mInstrumentation.callActivityOnCreate(activity, r.state);
                }
                ...
        }
        return activity;
}        

註釋1處用來獲取ActivityInfo,在註釋2處獲取APK檔案的描述類LoadedApk。註釋3處獲取要啟動的Activity的ComponentName類,ComponentName類中儲存了該Activity的包名和類名。註釋4處根據ComponentName中儲存的Activity類名,用類載入器來建立該Activity的例項。註釋5處用來建立Application,makeApplication方法內部會呼叫Application的onCreate方法。註釋6處用來建立要啟動Activity的上下文環境。註釋7處呼叫Activity的attach方法初始化Activity,attach方法中會建立Window物件(PhoneWindow)並與Activity自身進行關聯。註釋8處會呼叫Instrumentation的callActivityOnCreate方法來啟動Activity:
frameworks/base/core/java/android/app/Instrumentation.java

   public void callActivityOnCreate(Activity activity, Bundle icicle,
            PersistableBundle persistentState) {
        prePerformCreate(activity);
        activity.performCreate(icicle, persistentState);//1
        postPerformCreate(activity);
    }

註釋1處呼叫了Activity的performCreate方法,程式碼如下所示。
frameworks/base/core/java/android/app/Activity.java

  final void performCreate(Bundle icicle) {
        restoreHasCurrentPermissionRequest(icicle);
        onCreate(icicle);
        mActivityTransitionState.readState(icicle);
        performCreateCommon();
    }

performCreate方法中會呼叫Activity的onCreate方法,這樣Activity就啟動了,即應用程式就啟動了。
應用程式啟動過程就講到這裡,最後附上ActivityThread啟動Activity的時序圖。

歡迎關注我的微信公眾號,第一時間獲得部落格更新提醒,以及更多成體系的Android相關原創技術乾貨。
掃一掃下方二維碼或者長按識別二維碼,即可關注。