温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Activity启动过程分析

发布时间:2020-05-29 16:26:29 来源:网络 阅读:356 作者:sshpp 栏目:移动开发

        

Android的四大组件中除了BroadCastReceiver以外,其他三种组件都必须在AndroidManifest中注册,对于BroadCastReceiver来说,它既可以在AndroidManifest中注册也可以通过代码来注册,在调用方式上,Activity、Service和BroadCastReceiver需要借助Intent,而ContentProvider则无需借助Intent。

Activity是一种展示型组件,用于向用户直接展示一个界面,并且可以接收用户的输入信息从而进行交互,对于用户来说,Activity就是一个Android应用的全部,这是因为其他三大组件对用户来说都是不可感知的。Activity的启动由Intent触发,其中Intent可以分为显式Intent和隐式Intent,显式Intent可以明确地指向一个Activity组件,隐式Intent则指向一个或多个目标Activity组件,当然也有可能没有一个Activity组件处理这个Intent。

Activity的工作过程

要分析Activity的启动过程,就需要从startActivity方法开始分析,startActivity方法有好几种重载方式,但是最终都会调用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()这个参数,它的类型是ApplicationThread,ApplicationThread是ActivityThread的一个内部类,其实可以知道的是,ApplicationThread和ActivityThread在Activity启动过程中发挥着重要的作用。然后看下 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;
    }

从上面代码中可以看出,启动Activity真正的实现由ActivityManagerNative.getDefault()的startActivity方法来完成的,ActivityManagerService(简称AMS)继承自ActivityManagerNative,而ActivityManagerNative继承自Binder并实现了IActivityManager这个Binder接口,因此AMS也是一个Binder,它是IActivityManager的具体实现,其实ActivityManagerNative.getDefault()具体得到是AMS,在ActivityManagerNative中,AMS这个Binder对象采用单例模式对外提供,第一次调用它的get方法时它会通过create方法来初始化AMS这个Binder对象,在后续的调用中则直接返回之前创建的对象。这个过程源码如下:

    /**     * 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的启动过程又转移到AMS中,最终只需要分析AMS中的startActivity方法即可。同时,我们也在execStartActivity方法中看到这么一句:checkStartActivityResult(result, intent),直观应该是启动Activity的结果,具体实现如下:

 /** @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);
        }
    }

作用很明显,就是检查启动Activity的结果,当无法正确地启动一个Activity时,这个方法会抛出异常信息,最熟悉的错误就是Unable to find explicit activity classhave you declared this activity in your AndroidManifest.xml?,当启动的Activity没有在AndroidManifest中注册时,就会抛出这个异常。

现在看AMS的startActivity这个方法:

    @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的启动过程又转移到mActivityStarter.startActivityMayWait的方法上,在startActivityMayWait方法中又调用了startActivityLocked方法,然后startActivityLocked方法又调用了startActivityUncheckedLocked方法,最后调用了ActivityStack的resumeTopActivitiesLocked,此时启动过程转移到ActivityStack上。

总结一下,这其中走的流程图如下:

Activity启动过程分析

最终,通过源码分析,从IApplicationThread声明方法可以看出,内部包含了大量的启动、停止Activity的接口,此外还包含了启动和停止服务的接口。那么IApplicationThread的实现者到底是什么,答案就是ActivityThread内部的ApplicationThread,ApplicationThread的定义如下:

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

我们可以看到IInterface接口有个类型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通信,系统为AIDL文件自动生成的代码,同时还有会一个ApplicationThreadProxy类,这个类其实AIDL文件自动生成的代理类,进而最终Activity的启动过程最终回到ApplicationThread中。ApplicationThread通过scheduleLaunchActivity方法启动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);
        }

具体实现很简单,就是发送一个启动Activity的消息交由Handler处理,交给H处理,这个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方法实现,它的源码是:

 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();
            }
        }
    }

进而performLaunchActivity方法最终完成了Activity对象的创建和启动过程,并且ActivityThread通过handleResumeActivity方法来调用被启动Activity的onResume这一生命周期方法。

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

  • 从ActivityClientRecord中获取启动的Activity的组件信息

  • 通过Instrumentation的newActivity方法使用类加载器创建Activity对象

  • 通过LoadedApk的makeApplication方法来尝试创建Application对象。值得注意的是在makeApplication方法中如果Application已经被创建过了,那么就不会再重复创建了,这也意味着一个应用只有一个Application对象。同时,Application创建完毕后,系统会调用Application的onCreate方法。

  • 创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化

  • 调用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;
    }

所以借用一张流程图,总体流程时序:

Activity启动过程分析    


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI