美文网首页
四大组件——Activity 工作流程

四大组件——Activity 工作流程

作者: 设计失 | 来源:发表于2018-09-11 17:00 被阅读9次

    首先来看下这张图

    Activity.png



    从源码分析

    从startActivity 开始,到最后执行的是 startActivityForResult 方法,我们看下这个方法中具体操作:

    public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
            if (mParent == null) {
                // 到 InstrumentationInstrumentation 
                Instrumentation.ActivityResult ar =
                    mInstrumentation.execStartActivity(
                        this, mMainThread.getApplicationThread(), mToken, this,
                        intent, requestCode, options);
                if (ar != null) {
                    // 
                    mMainThread.sendActivityResult(
                        mToken, mEmbeddedID, requestCode, ar.getResultCode(),
                        ar.getResultData());
                }
                if (requestCode >= 0) {
                    // 有返回结果
                    mStartedActivity = true;
                }
    
                cancelInputsAndStartExitTransition(options);
                // 清除闪烁
            } else {
                // API13 已经用Fragment代替了多个Activity
                if (options != null) {
                    mParent.startActivityFromChild(this, intent, requestCode, options);
                } else {
                   // ActivityGroup 一个屏幕多个Activity 已废除
                    mParent.startActivityFromChild(this, intent, requestCode);
                }
            }
        }
    

    从上面可以看到startActivity 执行之后调用了 Instrumentation 中的 execStartActivity 方法,接下来我们看看这个方法执行的代码:

    public ActivityResult execStartActivity(Context who, 
                                            IBinder contextThread, 
                                            IBinder token, 
                                            String target,
                                            Intent intent, 
                                            int requestCode,
                                             Bundle options) {
                                             
    ... 省略
            try {
                intent.migrateExtraStreamToClipData();
                intent.prepareToLeaveProcess();
                // 开始执行
                int result = ActivityManagerNative.getDefault()
                    .startActivity(whoThread, who.getBasePackageName(), intent,
                            intent.resolveTypeIfNeeded(who.getContentResolver()),
                            token, target, requestCode, 0, null, options);
                checkStartActivityResult(result, intent);
            } catch (RemoteException e) {
                throw new RuntimeException("Failure from system", e);
            }
            return null;
        }
    

    可以看到这里执行了ActivityManagerNative.getDefault().startActivity(), 看下ActivityManagerNative这个类是个什么东西:

    public abstract class ActivityManagerNative 
                            extends Binder 
                            implements IActivityManager{
        ...省略
        static public IActivityManager getDefault() {
            return gDefault.get();
    }
    
    

    可以看到ActivityManagerNative 这个类是一个Binder对象,实现了IActivityManager, 而ActivityManagerSErvice继承了ActivityManagerNative ,所以AMS同样是一个Binder

    IActivityManager:

    public interface IActivityManager extends IInterface {
    ...
    }
    

    在ActivityManagerNative这个类又相继的调用了 startActivityAsUser 这个方法

     @Override
        public final int startActivityAsUser(IApplicationThread caller, 
                                             String callingPackage,
                                             Intent intent, 
                                             IBinder resultTo, 
                                             String resultWho, 
                                             int requestCode,
                                             int startFlags, 
                                             Bundle options, 
                                             int userId) {
            enforceNotIsolatedCaller("startActivity");
            userId = handleIncomingUser(Binder.getCallingPid(), 
                                        Binder.getCallingUid(),
                                        userId,false,
                                        ALLOW_FULL_ONLY, "startActivity", null);
            // 切换到用户的activity栈
            return mStackSupervisor.startActivityMayWait(
                                      caller, -1, callingPackage, 
                                      intent,resolvedType, null, null,
                                      resultTo, resultWho, requestCode, startFlags,
                                      profilerInfo, null, null, options, false, userId, null, null);
    

    接下来调用了 startActivityMayWait() 这个方法,该方法是ActivityStackSuperisor类中的方法,

    
        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, WaitResult outResult, Configuration config,
                Bundle options, boolean ignoreTargetSecurity, int userId,
                IActivityContainer iContainer, TaskRecord inTask) {
    
            ...省略
                int res = startActivityLocked(caller, intent, resolvedType, aInfo,
                        voiceSession, voiceInteractor, resultTo, resultWho,
                        requestCode, callingPid, callingUid, callingPackage,
                        realCallingPid, realCallingUid, startFlags, options, ignoreTargetSecurity,
                        componentSpecified, null, container, inTask);
    
            ... 省略
        }
    

    接下来调用了startActivityLocked 这个方法,startActivityLocked这个方法又调用了 startActivityUncheckedLocked方法, 而他又调用了 ActivityStackresumeTopActivityLocked, 这个时候已经从ActivityStackSupervisor中转移到了 ActivityStack 这个栈中,接下来我们看下resumeTopActivityLocked这个方法:

    final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) {
            if (mStackSupervisor.inResumeTopActivity) {
                // 不再递归.
                return false;
            }
    
            boolean result = false;
            try {
                // 保护反递归.
                mStackSupervisor.inResumeTopActivity = true;
                if (mService.mLockScreenShown == ActivityManagerService.LOCK_SCREEN_LEAVING) {
                    mService.mLockScreenShown = ActivityManagerService.LOCK_SCREEN_HIDDEN;
                    mService.updateSleepIfNeededLocked();
                }
                result = resumeTopActivityInnerLocked(prev, options);
            } finally {
                mStackSupervisor.inResumeTopActivity = false;
            }
            return result;
        }
    
    

    从这个方法中,我们知道他又调用了 resumeTopActivityInnerLocked() 方法, 而resumeTopActivityInnerLocked 又调用了mStackSupervisor.startSpecificActivityLocked(next, true, true); 整个过程是一环套一环的,我们看下这个方法做了什么操作:

         void startSpecificActivityLocked(ActivityRecord r,
                boolean andResume, boolean checkConfig) {
            // 判断当前界面的Application是否在运行
            ProcessRecord app = mService.getProcessRecordLocked(r.processName,
                    r.info.applicationInfo.uid, true);
    
            r.task.stack.setLaunchTime(r);
    
            if (app != null && app.thread != null) {
                try {
                    if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
                            || !"android".equals(r.info.packageName)) {
                        // Don't add this if it is a platform component that is marked
                        // to run in multiple processes, because this is actually
                        // part of the framework so doesn't make sense to track as a
                        // separate apk in the process.
                        app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode,
                                mService.mProcessStats);
                    }
                    // 真正调用的地方
                    realStartActivityLocked(r, app, andResume, checkConfig);
                    return;
                } catch (RemoteException e) {
                    Slog.w(TAG, "Exception when starting activity "
                            + r.intent.getComponent().flattenToShortString(), e);
                }
    
                // If a dead object exception was thrown -- fall through to
                // restart the application.
            }
    
            mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
                    "activity", r.intent.getComponent(), false, false, true);
        }
    

    再看下 realStartActivityLocked

    app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
                        System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
                        new Configuration(stack.mOverrideConfig), r.compat, r.launchedFromPackage,
                        task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,
                        newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);
    

    可以看到是由app来调用,那app.thread是什么类型呢? 通过源码我们看到app.thread其实是IApplicationThread ,它包含了大量操作Activity的接口,而他的实现类ApplicationThreadNative,ApplicationThread 继承了ApplicationThreadNative,ApplicationThreadNative是ActivityThread中的一个内部类,所以上面调用了这么多方法,最终却是在ApplicationThread中启动Activity,具体是通过scheduleLaunchActivity() 方法:

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

    看到有sendMessage()这个方法,最终调用下面的方法:

     private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {
            if (DEBUG_MESSAGES) Slog.v(
                TAG, "SCHEDULE " + what + " " + mH.codeToString(what)
                + ": " + arg1 + " / " + obj);
            Message msg = Message.obtain();
            msg.what = what;
            msg.obj = obj;
            msg.arg1 = arg1;
            msg.arg2 = arg2;
            if (async) {
                msg.setAsynchronous(true);
            }
            mH.sendMessage(msg);
        }
    

    可以看到是由mH发送消息,而mH是一个H类,该类是ActivityThread中的内部类,具体如下:

     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;
    
            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";
                    }
                }
                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);
                        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");
                        handlePauseActivity((IBinder)msg.obj, false, (msg.arg1&1) != 0, msg.arg2,
                                (msg.arg1&2) != 0);
                        maybeSnapshot();
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case PAUSE_ACTIVITY_FINISHING:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
                        handlePauseActivity((IBinder)msg.obj, true, (msg.arg1&1) != 0, msg.arg2,
                                (msg.arg1&1) != 0);
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case STOP_ACTIVITY_SHOW:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStop");
                        handleStopActivity((IBinder)msg.obj, true, msg.arg2);
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case STOP_ACTIVITY_HIDE:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStop");
                        handleStopActivity((IBinder)msg.obj, false, msg.arg2);
                        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");
                        handleResumeActivity((IBinder) msg.obj, true, msg.arg1 != 0, true);
                        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");
                        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");
                        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;
                        handleConfigurationChanged((Configuration)msg.obj, null);
                        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);
                        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;
                }
                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);
                }
            }
        }
    

    可以看到H中处理启动Activity的方式是调用了handleLaunchActivity方法:

      private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
            // 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);
    
          ...省略
        }
    

    接着是处理performLaunchActivity() :

    private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
            // System.out.println("##### [" + System.currentTimeMillis() + "] ActivityThread.performLaunchActivity(" + r + ")");
            //  如下获取到需要启动的Activity的组件信息
            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);
            }
    
            // 通过Instrumentation 方法newActivity中的类加载器来创建Activity对象
            // cl.loadClass(className).newInstance();
            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对象
                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) {
                    // 创建ContextImpl对象并通过Activity的attach方法完成数据的初始化
                    Context appContext = createBaseContextForActivity(r, activity);
                    CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
                    Configuration config = new Configuration(mCompatConfiguration);
                    if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "
                            + r.activityInfo.name + " with config " + config);
                    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);
    
                    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()) {
                        // 接下来直接调用activity的onCreate 方法,到此,Activity初始化完成
                        mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                    } else {
                        mInstrumentation.callActivityOnCreate(activity, r.state);
                    }
                    ... 省略
            return activity;
        }
    

    ContextImpl是非常重要的一个类,它是Context的具体实现,具体可以查看源码。

    参考: 《Android开发艺术探索》

    相关文章

      网友评论

          本文标题:四大组件——Activity 工作流程

          本文链接:https://www.haomeiwen.com/subject/wtwugftx.html