溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Activity啟動(dòng)過程分析

發(fā)布時(shí)間:2020-05-29 16:26:29 來源:網(wǎng)絡(luò) 閱讀:349 作者:sshpp 欄目:移動(dòng)開發(fā)

        

Android的四大組件中除了BroadCastReceiver以外,其他三種組件都必須在AndroidManifest中注冊(cè),對(duì)于BroadCastReceiver來說,它既可以在AndroidManifest中注冊(cè)也可以通過代碼來注冊(cè),在調(diào)用方式上,Activity、Service和BroadCastReceiver需要借助Intent,而ContentProvider則無需借助Intent。

Activity是一種展示型組件,用于向用戶直接展示一個(gè)界面,并且可以接收用戶的輸入信息從而進(jìn)行交互,對(duì)于用戶來說,Activity就是一個(gè)Android應(yīng)用的全部,這是因?yàn)槠渌蠼M件對(duì)用戶來說都是不可感知的。Activity的啟動(dòng)由Intent觸發(fā),其中Intent可以分為顯式Intent和隱式Intent,顯式Intent可以明確地指向一個(gè)Activity組件,隱式Intent則指向一個(gè)或多個(gè)目標(biāo)Activity組件,當(dāng)然也有可能沒有一個(gè)Activity組件處理這個(gè)Intent。

Activity的工作過程

要分析Activity的啟動(dòng)過程,就需要從startActivity方法開始分析,startActivity方法有好幾種重載方式,但是最終都會(huì)調(diào)用startActivityForResult方法,具體代碼如下:

/**     * @hide     */
    @Override
    public void startActivityForResult(
            String who, Intent intent, int requestCode, @Nullable Bundle options) {
        Uri referrer = onProvideReferrer();        if (referrer != null) {
            intent.putExtra(Intent.EXTRA_REFERRER, referrer);
        }
        options = transferSpringboardActivityOptions(options);
        Instrumentation.ActivityResult ar =
            mInstrumentation.execStartActivity(                this, mMainThread.getApplicationThread(), mToken, who,
                intent, requestCode, options);        if (ar != null) {
            mMainThread.sendActivityResult(
                mToken, who, requestCode,
                ar.getResultCode(), ar.getResultData());
        }        cancelInputsAndStartExitTransition(options);
    }

在上面代碼中,要注意的是mMainThread.getApplicationThread()這個(gè)參數(shù),它的類型是ApplicationThread,ApplicationThread是ActivityThread的一個(gè)內(nèi)部類,其實(shí)可以知道的是,ApplicationThread和ActivityThread在Activity啟動(dòng)過程中發(fā)揮著重要的作用。然后看下 mInstrumentation.execStartActivity方法,代碼如下:

 public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options) {
        IApplicationThread whoThread = (IApplicationThread) contextThread;
        Uri referrer = target != null ? target.onProvideReferrer() : null;        if (referrer != null) {
            intent.putExtra(Intent.EXTRA_REFERRER, referrer);
        }        if (mActivityMonitors != null) {            synchronized (mSync) {                final int N = mActivityMonitors.size();                for (int i=0; i<N; i++) {                    final ActivityMonitor am = mActivityMonitors.get(i);                    if (am.match(who, null, intent)) {
                        am.mHits++;                        if (am.isBlocking()) {                            return requestCode >= 0 ? am.getResult() : null;
                        }                        break;
                    }
                }
            }
        }        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;
    }

從上面代碼中可以看出,啟動(dòng)Activity真正的實(shí)現(xiàn)由ActivityManagerNative.getDefault()的startActivity方法來完成的,ActivityManagerService(簡(jiǎn)稱AMS)繼承自ActivityManagerNative,而ActivityManagerNative繼承自Binder并實(shí)現(xiàn)了IActivityManager這個(gè)Binder接口,因此AMS也是一個(gè)Binder,它是IActivityManager的具體實(shí)現(xiàn),其實(shí)ActivityManagerNative.getDefault()具體得到是AMS,在ActivityManagerNative中,AMS這個(gè)Binder對(duì)象采用單例模式對(duì)外提供,第一次調(diào)用它的get方法時(shí)它會(huì)通過create方法來初始化AMS這個(gè)Binder對(duì)象,在后續(xù)的調(diào)用中則直接返回之前創(chuàng)建的對(duì)象。這個(gè)過程源碼如下:

    /**     * Retrieve the system's default/global activity manager.     */
    static public IActivityManager getDefault() {        return gDefault.get();
    }    private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>(){        protected IActivityManager create() {
            IBinder b = ServiceManager.getService("activity");            if (false) {
                Log.v("ActivityManager", "default service binder = " + b);
            }
            IActivityManager am = asInterface(b);            if (false) {
                Log.v("ActivityManager", "default service = " + am);
            }            return am;
        }
    };

看到其中的源碼,可以得知,Activity的啟動(dòng)過程又轉(zhuǎn)移到AMS中,最終只需要分析AMS中的startActivity方法即可。同時(shí),我們也在execStartActivity方法中看到這么一句:checkStartActivityResult(result, intent),直觀應(yīng)該是啟動(dòng)Activity的結(jié)果,具體實(shí)現(xiàn)如下:

 /** @hide */
    public static void checkStartActivityResult(int res, Object intent) {        if (res >= ActivityManager.START_SUCCESS) {            return;
        }        switch (res) {            case ActivityManager.START_INTENT_NOT_RESOLVED:            case ActivityManager.START_CLASS_NOT_FOUND:                if (intent instanceof Intent && ((Intent)intent).getComponent() != null)                    throw new ActivityNotFoundException(                            "Unable to find explicit activity class "
                            + ((Intent)intent).getComponent().toShortString()
                            + "; have you declared this activity in your AndroidManifest.xml?");                throw new ActivityNotFoundException(                        "No Activity found to handle " + intent);            case ActivityManager.START_PERMISSION_DENIED:                throw new SecurityException("Not allowed to start activity "
                        + intent);            case ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT:                throw new AndroidRuntimeException(                        "FORWARD_RESULT_FLAG used while also requesting a result");            case ActivityManager.START_NOT_ACTIVITY:                throw new IllegalArgumentException(                        "PendingIntent is not an activity");            case ActivityManager.START_NOT_VOICE_COMPATIBLE:                throw new SecurityException(                        "Starting under voice control not allowed for: " + intent);            case ActivityManager.START_VOICE_NOT_ACTIVE_SESSION:                throw new IllegalStateException(                        "Session calling startVoiceActivity does not match active session");            case ActivityManager.START_VOICE_HIDDEN_SESSION:                throw new IllegalStateException(                        "Cannot start voice activity on a hidden session");            case ActivityManager.START_CANCELED:                throw new AndroidRuntimeException("Activity could not be started for "
                        + intent);            default:                throw new AndroidRuntimeException("Unknown error code "
                        + res + " when starting " + intent);
        }
    }

作用很明顯,就是檢查啟動(dòng)Activity的結(jié)果,當(dāng)無法正確地啟動(dòng)一個(gè)Activity時(shí),這個(gè)方法會(huì)拋出異常信息,最熟悉的錯(cuò)誤就是Unable to find explicit activity class,have you declared this activity in your AndroidManifest.xml?,當(dāng)啟動(dòng)的Activity沒有在AndroidManifest中注冊(cè)時(shí),就會(huì)拋出這個(gè)異常。

現(xiàn)在看AMS的startActivity這個(gè)方法:

    @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());
    }    @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);        // TODO: Switch to user app stacks here.
        return mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent,
                resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
                profilerInfo, null, null, bOptions, false, userId, null, null);
    }

從中可以看出,Activity的啟動(dòng)過程又轉(zhuǎn)移到mActivityStarter.startActivityMayWait的方法上,在startActivityMayWait方法中又調(diào)用了startActivityLocked方法,然后startActivityLocked方法又調(diào)用了startActivityUncheckedLocked方法,最后調(diào)用了ActivityStack的resumeTopActivitiesLocked,此時(shí)啟動(dòng)過程轉(zhuǎn)移到ActivityStack上。

總結(jié)一下,這其中走的流程圖如下:

Activity啟動(dòng)過程分析

最終,通過源碼分析,從IApplicationThread聲明方法可以看出,內(nèi)部包含了大量的啟動(dòng)、停止Activity的接口,此外還包含了啟動(dòng)和停止服務(wù)的接口。那么IApplicationThread的實(shí)現(xiàn)者到底是什么,答案就是ActivityThread內(nèi)部的ApplicationThread,ApplicationThread的定義如下:

public interface IApplicationThread extends IInterface{
  ......//省略一部分代碼}

我們可以看到IInterface接口有個(gè)類型IBinder:

/** * Base class for Binder interfaces.  When defining a new interface, * you must derive it from IInterface. */public interface IInterface{    /**     * Retrieve the Binder object associated with this interface.     * You must use this instead of a plain cast, so that proxy objects     * can return the correct result.     */
    public IBinder asBinder();
}

最終是通過Binder通信,系統(tǒng)為AIDL文件自動(dòng)生成的代碼,同時(shí)還有會(huì)一個(gè)ApplicationThreadProxy類,這個(gè)類其實(shí)AIDL文件自動(dòng)生成的代理類,進(jìn)而最終Activity的啟動(dòng)過程最終回到ApplicationThread中。ApplicationThread通過scheduleLaunchActivity方法啟動(dòng)Activity。

  // we use token to identify this activity without having to send the
        // activity itself back to the activity manager. (matters more with ipc)
        @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);
        }

具體實(shí)現(xiàn)很簡(jiǎn)單,就是發(fā)送一個(gè)啟動(dòng)Activity的消息交由Handler處理,交給H處理,這個(gè)H具體類的源碼:

private class H extends Handler {        public static final int LAUNCH_ACTIVITY         = 100;        public static final int PAUSE_ACTIVITY          = 101;        public static final int PAUSE_ACTIVITY_FINISHING= 102;        public static final int STOP_ACTIVITY_SHOW      = 103;        public static final int STOP_ACTIVITY_HIDE      = 104;        public static final int SHOW_WINDOW             = 105;        public static final int HIDE_WINDOW             = 106;        public static final int RESUME_ACTIVITY         = 107;        public static final int SEND_RESULT             = 108;        public static final int DESTROY_ACTIVITY        = 109;        public static final int BIND_APPLICATION        = 110;        public static final int EXIT_APPLICATION        = 111;        public static final int NEW_INTENT              = 112;        public static final int RECEIVER                = 113;        public static final int CREATE_SERVICE          = 114;        public static final int SERVICE_ARGS            = 115;        public static final int STOP_SERVICE            = 116;        public static final int CONFIGURATION_CHANGED   = 118;        public static final int CLEAN_UP_CONTEXT        = 119;        public static final int GC_WHEN_IDLE            = 120;        public static final int BIND_SERVICE            = 121;        public static final int UNBIND_SERVICE          = 122;        public static final int DUMP_SERVICE            = 123;        public static final int LOW_MEMORY              = 124;        public static final int ACTIVITY_CONFIGURATION_CHANGED = 125;        public static final int RELAUNCH_ACTIVITY       = 126;        public static final int PROFILER_CONTROL        = 127;        public static final int CREATE_BACKUP_AGENT     = 128;        public static final int DESTROY_BACKUP_AGENT    = 129;        public static final int SUICIDE                 = 130;        public static final int REMOVE_PROVIDER         = 131;        public static final int ENABLE_JIT              = 132;        public static final int DISPATCH_PACKAGE_BROADCAST = 133;        public static final int SCHEDULE_CRASH          = 134;        public static final int DUMP_HEAP               = 135;        public static final int DUMP_ACTIVITY           = 136;        public static final int SLEEPING                = 137;        public static final int SET_CORE_SETTINGS       = 138;        public static final int UPDATE_PACKAGE_COMPATIBILITY_INFO = 139;        public static final int TRIM_MEMORY             = 140;        public static final int DUMP_PROVIDER           = 141;        public static final int UNSTABLE_PROVIDER_DIED  = 142;        public static final int REQUEST_ASSIST_CONTEXT_EXTRAS = 143;        public static final int TRANSLUCENT_CONVERSION_COMPLETE = 144;        public static final int INSTALL_PROVIDER        = 145;        public static final int ON_NEW_ACTIVITY_OPTIONS = 146;        public static final int CANCEL_VISIBLE_BEHIND = 147;        public static final int BACKGROUND_VISIBLE_BEHIND_CHANGED = 148;        public static final int ENTER_ANIMATION_COMPLETE = 149;        public static final int START_BINDER_TRACKING = 150;        public static final int STOP_BINDER_TRACKING_AND_DUMP = 151;        public static final int MULTI_WINDOW_MODE_CHANGED = 152;        public static final int PICTURE_IN_PICTURE_MODE_CHANGED = 153;        public static final int LOCAL_VOICE_INTERACTION_STARTED = 154;        String codeToString(int code) {            if (DEBUG_MESSAGES) {                switch (code) {                    case LAUNCH_ACTIVITY: return "LAUNCH_ACTIVITY";                    case PAUSE_ACTIVITY: return "PAUSE_ACTIVITY";                    case PAUSE_ACTIVITY_FINISHING: return "PAUSE_ACTIVITY_FINISHING";                    case STOP_ACTIVITY_SHOW: return "STOP_ACTIVITY_SHOW";                    case STOP_ACTIVITY_HIDE: return "STOP_ACTIVITY_HIDE";                    case SHOW_WINDOW: return "SHOW_WINDOW";                    case HIDE_WINDOW: return "HIDE_WINDOW";                    case RESUME_ACTIVITY: return "RESUME_ACTIVITY";                    case SEND_RESULT: return "SEND_RESULT";                    case DESTROY_ACTIVITY: return "DESTROY_ACTIVITY";                    case BIND_APPLICATION: return "BIND_APPLICATION";                    case EXIT_APPLICATION: return "EXIT_APPLICATION";                    case NEW_INTENT: return "NEW_INTENT";                    case RECEIVER: return "RECEIVER";                    case CREATE_SERVICE: return "CREATE_SERVICE";                    case SERVICE_ARGS: return "SERVICE_ARGS";                    case STOP_SERVICE: return "STOP_SERVICE";                    case CONFIGURATION_CHANGED: return "CONFIGURATION_CHANGED";                    case CLEAN_UP_CONTEXT: return "CLEAN_UP_CONTEXT";                    case GC_WHEN_IDLE: return "GC_WHEN_IDLE";                    case BIND_SERVICE: return "BIND_SERVICE";                    case UNBIND_SERVICE: return "UNBIND_SERVICE";                    case DUMP_SERVICE: return "DUMP_SERVICE";                    case LOW_MEMORY: return "LOW_MEMORY";                    case ACTIVITY_CONFIGURATION_CHANGED: return "ACTIVITY_CONFIGURATION_CHANGED";                    case RELAUNCH_ACTIVITY: return "RELAUNCH_ACTIVITY";                    case PROFILER_CONTROL: return "PROFILER_CONTROL";                    case CREATE_BACKUP_AGENT: return "CREATE_BACKUP_AGENT";                    case DESTROY_BACKUP_AGENT: return "DESTROY_BACKUP_AGENT";                    case SUICIDE: return "SUICIDE";                    case REMOVE_PROVIDER: return "REMOVE_PROVIDER";                    case ENABLE_JIT: return "ENABLE_JIT";                    case DISPATCH_PACKAGE_BROADCAST: return "DISPATCH_PACKAGE_BROADCAST";                    case SCHEDULE_CRASH: return "SCHEDULE_CRASH";                    case DUMP_HEAP: return "DUMP_HEAP";                    case DUMP_ACTIVITY: return "DUMP_ACTIVITY";                    case SLEEPING: return "SLEEPING";                    case SET_CORE_SETTINGS: return "SET_CORE_SETTINGS";                    case UPDATE_PACKAGE_COMPATIBILITY_INFO: return "UPDATE_PACKAGE_COMPATIBILITY_INFO";                    case TRIM_MEMORY: return "TRIM_MEMORY";                    case DUMP_PROVIDER: return "DUMP_PROVIDER";                    case UNSTABLE_PROVIDER_DIED: return "UNSTABLE_PROVIDER_DIED";                    case REQUEST_ASSIST_CONTEXT_EXTRAS: return "REQUEST_ASSIST_CONTEXT_EXTRAS";                    case TRANSLUCENT_CONVERSION_COMPLETE: return "TRANSLUCENT_CONVERSION_COMPLETE";                    case INSTALL_PROVIDER: return "INSTALL_PROVIDER";                    case ON_NEW_ACTIVITY_OPTIONS: return "ON_NEW_ACTIVITY_OPTIONS";                    case CANCEL_VISIBLE_BEHIND: return "CANCEL_VISIBLE_BEHIND";                    case BACKGROUND_VISIBLE_BEHIND_CHANGED: return "BACKGROUND_VISIBLE_BEHIND_CHANGED";                    case ENTER_ANIMATION_COMPLETE: return "ENTER_ANIMATION_COMPLETE";                    case MULTI_WINDOW_MODE_CHANGED: return "MULTI_WINDOW_MODE_CHANGED";                    case PICTURE_IN_PICTURE_MODE_CHANGED: return "PICTURE_IN_PICTURE_MODE_CHANGED";                    case LOCAL_VOICE_INTERACTION_STARTED: return "LOCAL_VOICE_INTERACTION_STARTED";
                }
            }            return Integer.toString(code);
        }        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;

                    r.packageInfo = getPackageInfoNoCheck(
                            r.activityInfo.applicationInfo, r.compatInfo);                    handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
                    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;                case PAUSE_ACTIVITY: {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
                    SomeArgs args = (SomeArgs) msg.obj;                    handlePauseActivity((IBinder) args.arg1, false,
                            (args.argi1 & USER_LEAVING) != 0, args.argi2,
                            (args.argi1 & DONT_REPORT) != 0, args.argi3);                    maybeSnapshot();
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;                case PAUSE_ACTIVITY_FINISHING: {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
                    SomeArgs args = (SomeArgs) msg.obj;                    handlePauseActivity((IBinder) args.arg1, true, (args.argi1 & USER_LEAVING) != 0,
                            args.argi2, (args.argi1 & DONT_REPORT) != 0, args.argi3);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;                case STOP_ACTIVITY_SHOW: {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStop");
                    SomeArgs args = (SomeArgs) msg.obj;                    handleStopActivity((IBinder) args.arg1, true, args.argi2, args.argi3);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;                case STOP_ACTIVITY_HIDE: {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStop");
                    SomeArgs args = (SomeArgs) msg.obj;                    handleStopActivity((IBinder) args.arg1, false, args.argi2, args.argi3);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;                case SHOW_WINDOW:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityShowWindow");                    handleWindowVisibility((IBinder)msg.obj, true);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case HIDE_WINDOW:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityHideWindow");                    handleWindowVisibility((IBinder)msg.obj, false);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case RESUME_ACTIVITY:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityResume");
                    SomeArgs args = (SomeArgs) msg.obj;                    handleResumeActivity((IBinder) args.arg1, true, args.argi1 != 0, true,
                            args.argi3, "RESUME_ACTIVITY");
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case SEND_RESULT:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityDeliverResult");                    handleSendResult((ResultData)msg.obj);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case DESTROY_ACTIVITY:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityDestroy");                    handleDestroyActivity((IBinder)msg.obj, msg.arg1 != 0,
                            msg.arg2, false);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case BIND_APPLICATION:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");
                    AppBindData data = (AppBindData)msg.obj;                    handleBindApplication(data);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case EXIT_APPLICATION:                    if (mInitialApplication != null) {
                        mInitialApplication.onTerminate();
                    }
                    Looper.myLooper().quit();                    break;                case NEW_INTENT:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityNewIntent");                    handleNewIntent((NewIntentData)msg.obj);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case RECEIVER:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastReceiveComp");                    handleReceiver((ReceiverData)msg.obj);                    maybeSnapshot();
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case CREATE_SERVICE:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, ("serviceCreate: " + String.valueOf(msg.obj)));                    handleCreateService((CreateServiceData)msg.obj);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case BIND_SERVICE:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceBind");                    handleBindService((BindServiceData)msg.obj);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case UNBIND_SERVICE:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceUnbind");                    handleUnbindService((BindServiceData)msg.obj);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case SERVICE_ARGS:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, ("serviceStart: " + String.valueOf(msg.obj)));                    handleServiceArgs((ServiceArgsData)msg.obj);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case STOP_SERVICE:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceStop");                    handleStopService((IBinder)msg.obj);                    maybeSnapshot();
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case CONFIGURATION_CHANGED:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "configChanged");
                    mCurDefaultDisplayDpi = ((Configuration)msg.obj).densityDpi;
                    mUpdatingSystemConfig = true;                    handleConfigurationChanged((Configuration)msg.obj, null);
                    mUpdatingSystemConfig = false;
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case CLEAN_UP_CONTEXT:
                    ContextCleanupInfo cci = (ContextCleanupInfo)msg.obj;
                    cci.context.performFinalCleanup(cci.who, cci.what);                    break;                case GC_WHEN_IDLE:                    scheduleGcIdler();                    break;                case DUMP_SERVICE:                    handleDumpService((DumpComponentInfo)msg.obj);                    break;                case LOW_MEMORY:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "lowMemory");                    handleLowMemory();
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case ACTIVITY_CONFIGURATION_CHANGED:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityConfigChanged");                    handleActivityConfigurationChanged((ActivityConfigChangeData) msg.obj,
                            msg.arg1 == 1 ? REPORT_TO_ACTIVITY : !REPORT_TO_ACTIVITY);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case PROFILER_CONTROL:                    handleProfilerControl(msg.arg1 != 0, (ProfilerInfo)msg.obj, msg.arg2);                    break;                case CREATE_BACKUP_AGENT:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backupCreateAgent");                    handleCreateBackupAgent((CreateBackupAgentData)msg.obj);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case DESTROY_BACKUP_AGENT:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backupDestroyAgent");                    handleDestroyBackupAgent((CreateBackupAgentData)msg.obj);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case SUICIDE:
                    Process.killProcess(Process.myPid());                    break;                case REMOVE_PROVIDER:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "providerRemove");                    completeRemoveProvider((ProviderRefCount)msg.obj);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case ENABLE_JIT:                    ensureJitEnabled();                    break;                case DISPATCH_PACKAGE_BROADCAST:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastPackage");                    handleDispatchPackageBroadcast(msg.arg1, (String[])msg.obj);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case SCHEDULE_CRASH:                    throw new RemoteServiceException((String)msg.obj);                case DUMP_HEAP:                    handleDumpHeap(msg.arg1 != 0, (DumpHeapData)msg.obj);                    break;                case DUMP_ACTIVITY:                    handleDumpActivity((DumpComponentInfo)msg.obj);                    break;                case DUMP_PROVIDER:                    handleDumpProvider((DumpComponentInfo)msg.obj);                    break;                case SLEEPING:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "sleeping");                    handleSleeping((IBinder)msg.obj, msg.arg1 != 0);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case SET_CORE_SETTINGS:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "setCoreSettings");                    handleSetCoreSettings((Bundle) msg.obj);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case UPDATE_PACKAGE_COMPATIBILITY_INFO:                    handleUpdatePackageCompatibilityInfo((UpdateCompatibilityData)msg.obj);                    break;                case TRIM_MEMORY:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "trimMemory");                    handleTrimMemory(msg.arg1);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case UNSTABLE_PROVIDER_DIED:                    handleUnstableProviderDied((IBinder)msg.obj, false);                    break;                case REQUEST_ASSIST_CONTEXT_EXTRAS:                    handleRequestAssistContextExtras((RequestAssistContextExtras)msg.obj);                    break;                case TRANSLUCENT_CONVERSION_COMPLETE:                    handleTranslucentConversionComplete((IBinder)msg.obj, msg.arg1 == 1);                    break;                case INSTALL_PROVIDER:                    handleInstallProvider((ProviderInfo) msg.obj);                    break;                case ON_NEW_ACTIVITY_OPTIONS:
                    Pair<IBinder, ActivityOptions> pair = (Pair<IBinder, ActivityOptions>) msg.obj;                    onNewActivityOptions(pair.first, pair.second);                    break;                case CANCEL_VISIBLE_BEHIND:                    handleCancelVisibleBehind((IBinder) msg.obj);                    break;                case BACKGROUND_VISIBLE_BEHIND_CHANGED:                    handleOnBackgroundVisibleBehindChanged((IBinder) msg.obj, msg.arg1 > 0);                    break;                case ENTER_ANIMATION_COMPLETE:                    handleEnterAnimationComplete((IBinder) msg.obj);                    break;                case START_BINDER_TRACKING:                    handleStartBinderTracking();                    break;                case STOP_BINDER_TRACKING_AND_DUMP:                    handleStopBinderTrackingAndDump((ParcelFileDescriptor) msg.obj);                    break;                case MULTI_WINDOW_MODE_CHANGED:                    handleMultiWindowModeChanged((IBinder) msg.obj, msg.arg1 == 1);                    break;                case PICTURE_IN_PICTURE_MODE_CHANGED:                    handlePictureInPictureModeChanged((IBinder) msg.obj, msg.arg1 == 1);                    break;                case LOCAL_VOICE_INTERACTION_STARTED:                    handleLocalVoiceInteractionStarted((IBinder) ((SomeArgs) msg.obj).arg1,
                            (IVoiceInteractor) ((SomeArgs) msg.obj).arg2);                    break;
            }
            Object obj = msg.obj;            if (obj instanceof SomeArgs) {
                ((SomeArgs) obj).recycle();
            }            if (DEBUG_MESSAGES) Slog.v(TAG, "<<< done: " + codeToString(msg.what));
        }        private void maybeSnapshot() {            if (mBoundApplication != null && SamplingProfilerIntegration.isEnabled()) {                // convert the *private* ActivityThread.PackageInfo to *public* known
                // android.content.pm.PackageInfo
                String packageName = mBoundApplication.info.mPackageName;
                android.content.pm.PackageInfo packageInfo = null;                try {
                    Context context = getSystemContext();                    if(context == null) {
                        Log.e(TAG, "cannot get a valid context");                        return;
                    }
                    PackageManager pm = context.getPackageManager();                    if(pm == null) {
                        Log.e(TAG, "cannot get a valid PackageManager");                        return;
                    }
                    packageInfo = pm.getPackageInfo(
                            packageName, PackageManager.GET_ACTIVITIES);
                } catch (NameNotFoundException e) {
                    Log.e(TAG, "cannot get package info for " + packageName, e);
                }
                SamplingProfilerIntegration.writeSnapshot(mBoundApplication.processName, packageInfo);
            }
        }
    }

在LAUNCH_ACTIVITY中,可以看到這么一句handleLaunchActivity(r, null, "LAUNCH_ACTIVITY"),最終是交由handleLaunchActivity方法實(shí)現(xiàn),它的源碼是:

 private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {        // If we are getting ready to gc after going to the background, well
        // we are back active so skip it.
        unscheduleGcIdler();
        mSomeActivitiesChanged = true;        if (r.profilerInfo != null) {
            mProfiler.setProfiler(r.profilerInfo);
            mProfiler.startProfiling();
        }        // Make sure we are running with the most recent config.
        handleConfigurationChanged(null, null);        if (localLOGV) Slog.v(
            TAG, "Handling launch of " + r);        // Initialize before creating the activity
        WindowManagerGlobal.initialize();

        Activity a = performLaunchActivity(r, customIntent);        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);            if (!r.activity.mFinished && r.startsNotResumed) {                // The activity manager actually wants this one to start out paused, because it
                // needs to be visible but isn't in the foreground. We accomplish this by going
                // through the normal startup (because activities expect to go through onResume()
                // the first time they run, before their window is displayed), and then pausing it.
                // However, in this case we do -not- need to do the full pause cycle (of freezing
                // and such) because the activity manager assumes it can just retain the current
                // state it has.
                performPauseActivityIfNeeded(r, reason);                // We need to keep around the original state, in case we need to be created again.
                // But we only do this for pre-Honeycomb apps, which always save their state when
                // pausing, so we can not have them save their state when restarting from a paused
                // state. For HC and later, we want to (and can) let the state be saved as the
                // normal part of stopping the activity.
                if (r.isPreHoneycomb()) {
                    r.state = oldState;
                }
            }
        } else {            // If there was an error, for any reason, tell the activity manager to stop us.
            try {
                ActivityManagerNative.getDefault()
                    .finishActivity(r.token, Activity.RESULT_CANCELED, null,
                            Activity.DONT_FINISH_TASK_WITH_ACTIVITY);
            } catch (RemoteException ex) {                throw ex.rethrowFromSystemServer();
            }
        }
    }

進(jìn)而performLaunchActivity方法最終完成了Activity對(duì)象的創(chuàng)建和啟動(dòng)過程,并且ActivityThread通過handleResumeActivity方法來調(diào)用被啟動(dòng)Activity的onResume這一生命周期方法。

那么performLaunchActivity方法主要完成如下幾件事:

  • 從ActivityClientRecord中獲取啟動(dòng)的Activity的組件信息

  • 通過Instrumentation的newActivity方法使用類加載器創(chuàng)建Activity對(duì)象

  • 通過LoadedApk的makeApplication方法來嘗試創(chuàng)建Application對(duì)象。值得注意的是在makeApplication方法中如果Application已經(jīng)被創(chuàng)建過了,那么就不會(huì)再重復(fù)創(chuàng)建了,這也意味著一個(gè)應(yīng)用只有一個(gè)Application對(duì)象。同時(shí),Application創(chuàng)建完畢后,系統(tǒng)會(huì)調(diào)用Application的onCreate方法。

  • 創(chuàng)建ContextImpl對(duì)象并通過Activity的attach方法來完成一些重要數(shù)據(jù)的初始化

  • 調(diào)用Activity的onCreate方法

源碼如下:

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {        // System.out.println("##### [" + System.currentTimeMillis() + "] ActivityThread.performLaunchActivity(" + r + ")");

        ActivityInfo aInfo = r.activityInfo;        if (r.packageInfo == null) {
            r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,
                    Context.CONTEXT_INCLUDE_CODE);
        }

        ComponentName component = r.intent.getComponent();        if (component == null) {
            component = r.intent.resolveActivity(
                mInitialApplication.getPackageManager());
            r.intent.setComponent(component);
        }        if (r.activityInfo.targetActivity != null) {
            component = new ComponentName(r.activityInfo.packageName,
                    r.activityInfo.targetActivity);
        }

        Activity activity = null;        try {
            java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
            activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
            StrictMode.incrementExpectedActivityCount(activity.getClass());
            r.intent.setExtrasClassLoader(cl);
            r.intent.prepareToEnterProcess();            if (r.state != null) {
                r.state.setClassLoader(cl);
            }
        } catch (Exception e) {            if (!mInstrumentation.onException(activity, e)) {                throw new RuntimeException(                    "Unable to instantiate activity " + component
                    + ": " + e.toString(), e);
            }
        }        try {
            Application app = r.packageInfo.makeApplication(false, mInstrumentation);            if (localLOGV) Slog.v(TAG, "Performing launch of " + r);            if (localLOGV) Slog.v(
                    TAG, r + ": app=" + app
                    + ", appName=" + app.getPackageName()
                    + ", pkg=" + r.packageInfo.getPackageName()
                    + ", comp=" + r.intent.getComponent().toShortString()
                    + ", dir=" + r.packageInfo.getAppDir());            if (activity != null) {
                Context appContext = createBaseContextForActivity(r, activity);
                CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
                Configuration config = new Configuration(mCompatConfiguration);                if (r.overrideConfig != null) {
                    config.updateFrom(r.overrideConfig);
                }                if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "
                        + r.activityInfo.name + " with config " + config);
                Window window = null;                if (r.mPendingRemoveWindow != null && r.mPreserveWindow) {
                    window = r.mPendingRemoveWindow;
                    r.mPendingRemoveWindow = null;
                    r.mPendingRemoveWindowManager = null;
                }
                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 (customIntent != null) {
                    activity.mIntent = customIntent;
                }
                r.lastNonConfigurationInstances = null;
                activity.mStartedActivity = false;                int theme = r.activityInfo.getThemeResource();                if (theme != 0) {
                    activity.setTheme(theme);
                }

                activity.mCalled = false;                if (r.isPersistable()) {
                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                } else {
                    mInstrumentation.callActivityOnCreate(activity, r.state);
                }                if (!activity.mCalled) {                    throw new SuperNotCalledException(                        "Activity " + r.intent.getComponent().toShortString() +                        " did not call through to super.onCreate()");
                }
                r.activity = activity;
                r.stopped = true;                if (!r.activity.mFinished) {
                    activity.performStart();
                    r.stopped = false;
                }                if (!r.activity.mFinished) {                    if (r.isPersistable()) {                        if (r.state != null || r.persistentState != null) {
                            mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,
                                    r.persistentState);
                        }
                    } else if (r.state != null) {
                        mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
                    }
                }                if (!r.activity.mFinished) {
                    activity.mCalled = false;                    if (r.isPersistable()) {
                        mInstrumentation.callActivityOnPostCreate(activity, r.state,
                                r.persistentState);
                    } else {
                        mInstrumentation.callActivityOnPostCreate(activity, r.state);
                    }                    if (!activity.mCalled) {                        throw new SuperNotCalledException(                            "Activity " + r.intent.getComponent().toShortString() +                            " did not call through to super.onPostCreate()");
                    }
                }
            }
            r.paused = true;

            mActivities.put(r.token, r);

        } catch (SuperNotCalledException e) {            throw e;

        } catch (Exception e) {            if (!mInstrumentation.onException(activity, e)) {                throw new RuntimeException(                    "Unable to start activity " + component
                    + ": " + e.toString(), e);
            }
        }        return activity;
    }

所以借用一張流程圖,總體流程時(shí)序:

Activity啟動(dòng)過程分析    


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI