Activity启动流程(下)

作者: 此生红黑 | 来源:发表于2016-06-12 23:50 被阅读996次
    1.前言

    Activity启动流程(上)这篇文章的结尾说到activity启动的流程进入到ActivityManagerService以socket方式通过Zygote进程孵化一个应用进程并执行应用进程的main方法,而这个应用进程的入口函数main方法在ActivityThread类中,因此ActivityThread类就顺理成章的成为了应用程序的主线程。下面我们结合ActivityThread来继续分析activity启动流程。

    2.activity启动流程(下)

    关于ActivityThread的main方法,在Android 异步消息处理机制曾经提到过,当时主要是分析了异步消息机制,现在我们再来看看main方法里面还有什么值得注意的:

    public static void main(String[] args) {
          ......
          //1.创建消息机制的Loop,同时也会创建消息队列
          Looper.prepareMainLooper();
    
          //4.创建ActivityThread实例,并初始化thread
          ActivityThread thread = new ActivityThread();
          thread.attach(false);
    
          if (sMainThreadHandler == null) {//2.获得handler对象
              sMainThreadHandler = thread.getHandler();
          }
          ......
    
          //3.进入消息循环
          Looper.loop();
    
          throw new RuntimeException("Main thread loop unexpectedly exited");
      }
    

    注释1.2.3,曾经详细提到过,主要是构建了一个异步消息机制,当其他线程需要和主线程交互的时候,可以通过主线程的handler往messageQueue中发送消息,通过handler来处理,这里不再过多说明了。下面重点看下注释4:说到这里,记得第一次看ActivityThread的main方法时,觉得很困惑,main方法为什么这么简单,感觉什么都没有。“应用程序不是在这里启动的吗?为什么找不到activity启动的代码呢?”在分析了Android异步消息机制机制之后,这个困扰已久的问题终于解开了,答案就在注释4的地方。我们可以大胆推测,在thread.attach(false)肯定执行了一系列的逻辑,然后向主线程的messageQueue中发送消息,通过主线程的handler处理问题,其中包括activity的启动。那下面就来具体瞧一瞧,我们的推测是否正确。
    接下来我们看下ActivityThread 的attach方法,分析ActivityThread 是如何初始化的:

    private void attach(boolean system) {
            sCurrentActivityThread = this;
            mSystemThread = system;
            if (!system) {
    
            ......
                //1.得到ActivityManagerService在应用进程的代理对象
                final IActivityManager mgr = ActivityManagerNative.getDefault();
                try {
                    //2.通过binder跨进程调用ActivityManagerService的attachApplication方法
                    mgr.attachApplication(mAppThread);
                } catch (RemoteException ex) {
                    // Ignore
                }
            ......
            } else {
            ......
    
           
        }
    

    这段代码有两段注释,先看注释1,同Activity启动流程(上)分析的一样,注释1处会得到一个ActivityManagerService在应用进程的代理对象mgr,然后再注释2处,通过binder进程间调用到ActivityManagerService的attachApplication方法中:

    @Override
        public final void attachApplication(IApplicationThread thread) {
            synchronized (this) {
                ......
                attachApplicationLocked(thread, callingPid);
                ......
            }
        }
    

    接着调用ActivityManagerService的attachApplication方法:

    private final boolean attachApplicationLocked(IApplicationThread thread,
                int pid) {
    
            ......
           
            
            try {
            ......
                //1.启动Application
                thread.bindApplication(processName, appInfo, providers, app.instrumentationClass,
                        profilerInfo, app.instrumentationArguments, app.instrumentationWatcher,
                        app.instrumentationUiAutomationConnection, testMode, enableOpenGlTrace,
                        enableTrackAllocation, isRestrictedBackupMode || !normalMode, app.persistent,
                        new Configuration(mConfiguration), app.compat,
                        getCommonServicesLocked(app.isolated),
                        mCoreSettingsObserver.getCoreSettingsLocked());
            ......
            } catch (Exception e) {
            ......
                return false;
            }
    
            ......
            if (normalMode) {
                try {
                    //2.启动activity
                    if (mStackSupervisor.attachApplicationLocked(app)) {
                        didSomething = true;
                    }
                } catch (Exception e) {
                    Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
                    badApp = true;
                }
            }
    
            ......
    
            return true;
        }
    

    这段代码我们还是看两个注释的地方:注释1处会启动Application(调用Application的oncreat方法),2处会启动一个activity(执行activity的启动过程的生命周期方法)。下面我们详细分析这两个过程。

    Application启动的流程

    先看注释1处thread的bindApplication方法,在这之前我们先要弄清楚thread是个啥?回到attachApplicationLocked的参数列表中,thread是一个IApplicationThread 类型的一个变量,实质上是ApplicationThread这个binder对象在ActivityManagerService的代理。因此thread的bindApplication方法最终会进入ApplicationThread的bindApplication方法:

    public final void bindApplication(String processName, ApplicationInfo appInfo,
                    List<ProviderInfo> providers, ComponentName instrumentationName,
                    ProfilerInfo profilerInfo, Bundle instrumentationArgs,
                    IInstrumentationWatcher instrumentationWatcher,
                    IUiAutomationConnection instrumentationUiConnection, int debugMode,
                    boolean enableOpenGlTrace, boolean isRestrictedBackupMode, boolean persistent,
                    Configuration config, CompatibilityInfo compatInfo, Map<String, IBinder> services,
                    Bundle coreSettings) {
    
                ......
    
                AppBindData data = new AppBindData();
                data.processName = processName;
                data.appInfo = appInfo;
                data.providers = providers;
                data.instrumentationName = instrumentationName;
                data.instrumentationArgs = instrumentationArgs;
                data.instrumentationWatcher = instrumentationWatcher;
                data.instrumentationUiAutomationConnection = instrumentationUiConnection;
                data.debugMode = debugMode;
                data.enableOpenGlTrace = enableOpenGlTrace;
                data.restrictedBackupMode = isRestrictedBackupMode;
                data.persistent = persistent;
                data.config = config;
                data.compatInfo = compatInfo;
                data.initProfilerInfo = profilerInfo;
                //通过handler类型的变量mH发送消息到主线程
                sendMessage(H.BIND_APPLICATION, data);
            }
    
    

    这里有一点需要注意,在Activity启动过程及界面绘制流程解析开篇这篇文章中说过,binder service会单独运行在一个线程,所以在我们这里,ApplicationThread当做binder service,它的方法都是运行在非主线程,从而与主线程(一个异步线程)之间的通信需要通过handler来处理。我们来看下ApplicationThread的sendMessage方法分析是否通过主线程的handler来发送与处理消息,最终调用到ApplicationThread4个参数的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是一个Handler类型的变量,且是ActivityThread的一个成员变量,因此可以向主线程的messageQueue中发送消息。然后会通过mH来处理这个消息:

    public void handleMessage(Message msg) {
            ......
                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 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;
            ......
                 
                }
            ......
            }
    
    

    mH的handleMessage方法根据不同的消息标示,处理不同的消息。这里的标示是BIND_APPLICATION,因此会进入ActivityThread的handleBindApplication方法:

    private void handleBindApplication(AppBindData data) {
    
            ......
    
            //1.保证了一个应用程序只有一个Instrumentation实例
            if (data.instrumentationName != null) {
            ......
    
            } else {
                //2.创建一个Instrumentation管理activity的生命周期
                mInstrumentation = new Instrumentation();
            }
    
            ......
    
            try {
                // If the app is being launched for full backup or restore, bring it up in
                // a restricted environment with the base application class.
               //3.创建一个Application实例,一个应用程序只有一个Application实例
                Application app = data.info.makeApplication(data.restrictedBackupMode, null);
                mInitialApplication = app;
    
            ......
    
                try {
                    //4.调用Application的oncreate方法
                    mInstrumentation.callApplicationOnCreate(app);
                } catch (Exception e) {
                    if (!mInstrumentation.onException(app, e)) {
                        throw new RuntimeException(
                            "Unable to create application " + app.getClass().getName()
                            + ": " + e.toString(), e);
                    }
                }
            } finally {
                StrictMode.setThreadPolicy(savedPolicy);
            }
        }
    

    这段代码有4个注释的地方需要看一下,首先注释1.2处,会创建一个Instrumentation对象的实例。还记得在Activity的启动流程(上)曾经说过,Instrumentation对象会管理Activity的生命周期方法,所以在执行Activity的生命周期方法时会先创建一个Instrumentation实例用来管理Activity的周期方法,且Instrumentation在应用程序中只持有一个实例。注释3处,创建了一个Application实例,这也很好理解,在开发中我们都知道一个应用Application代表一个应用程序,且Application先于Activity加载到内存中。稍后会分析Application实例是如何创建的,为什么一个应用程序只有一个Application实例。注释4处会调用Application的oncreate方法,这也是我们平时开发中一个应用最先执行的方法,通常我们会在这个方法中完成一些初始化的操作。

    public void callApplicationOnCreate(Application app) {
           //直接执行了Application的onCreate方法
            app.onCreate();
        }
    

    下面我们再来详细的分析,application是如何创建的,为什么一个应用只有一个application实例。
    注释3处的data.info实际上是一个LoadedApk,然后调用LoadedApk的makeApplication方法创建一个application实例:

    public Application makeApplication(boolean forceDefaultAppClass,
                Instrumentation instrumentation) {
            //如果mApplication不为空,直接返回mApplication,这也就解释了为什么一个应用程序只有一个Application实例
            if (mApplication != null) {
                return mApplication;
            }
    
            Application app = null;
    
    
            ......
    
            try {
                java.lang.ClassLoader cl = getClassLoader();
                if (!mPackageName.equals("android")) {
                    initializeJavaContextClassLoader();
                }
                //1.创建一个ContextImpl 对象
                ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
                 //2.通过Instrumentation的newApplication方法创建一个application实例
                app = mActivityThread.mInstrumentation.newApplication(
                        cl, appClass, appContext);
                //3.将application注入appContext
                appContext.setOuterContext(app);
            } catch (Exception e) {
    
            ......
    
            }
    
            ......
    
            return app;
        }
    

    这段代码的注释1处,通过ContextImpl的createAppContext方法实例化一个创建Application所需要的ContextImpl,然后在注释2处调用Instrumentation的newApplication创建一个Application实例:

    public Application newApplication(ClassLoader cl, String className, Context context)
                throws InstantiationException, IllegalAccessException, 
                ClassNotFoundException {
            return newApplication(cl.loadClass(className), context);
        }
    

    接着调用Instrumentation两个参数的newApplication方法:

    static public Application newApplication(Class<?> clazz, Context context)
                throws InstantiationException, IllegalAccessException, 
                ClassNotFoundException {
            Application app = (Application)clazz.newInstance();
            //将context注入application,从而Application持有context的引用
            //这里context是一个抽象类,具体的实现类是ContextImpl
            app.attach(context);
            return app;
        }
    

    这段代码可以看到Application是通过反射创建的实例,即最终的应用程序的Application是通过反射创建的,然后将LoadedApk的makeApplication方法中创建的ContextImpl实例注入到application中,从而application可以调用ContextImpl的方法,而在是个上段代码注释3处,可以看到appContext.setOuterContext(app),这句代码意味着新建的application被注入到了ContextImpl中,从而ContextImpl持有application的引用,可以调用application的一些方法。
    至此我们可以看到Application实例的创建和oncreate方法何时被调用的,所以Application的启动我们就分析完了。这时回到我们文初的一个问题:ActivityThread的main方法为什么比较简短,应用程序到底是如何启动的?现在我们应该清楚了,android主线程是基于消息驱动的,main方法在进入消息循环之前,通过thread.attach(false)打开了一个分支,然后这个分支将问题发送到主线程的messagequeue中处理,因此虽然main方法看似没参与应用程序的启动过程,实质上还是参与了整个启动过程,依然是android程序的主入口。下面再次贴出main方法的代码,以便加深映像:

    public static void main(String[] args) {
          ......
          //1.创建消息机制的Loop,同时也会创建消息队列
          Looper.prepareMainLooper();
    
          //4.创建ActivityThread实例,并初始化thread
          ActivityThread thread = new ActivityThread();
          thread.attach(false);
    
          if (sMainThreadHandler == null) {//2.获得handler对象
              sMainThreadHandler = thread.getHandler();
          }
          ......
    
          //3.进入消息循环
          Looper.loop();
    
          throw new RuntimeException("Main thread loop unexpectedly exited");
      }
    
    activity的启动过程

    在分析了application的启动之后,我们接着分析activity的启动过程。上文已经说到过ActivityManagerService的attachApplication方法中有两段比较重要的代码。一段是Application的启动,我们已经分析过了,下面我们来看第二段activity的启动,再次贴出ActivityManagerService的attachApplication方法的代码熟悉一下:

    private final boolean attachApplicationLocked(IApplicationThread thread,
                int pid) {
    
            ......
    
    
            try {
            ......
                //1.启动Application
                thread.bindApplication(processName, appInfo, providers, app.instrumentationClass,
                        profilerInfo, app.instrumentationArguments, app.instrumentationWatcher,
                        app.instrumentationUiAutomationConnection, testMode, enableOpenGlTrace,
                        enableTrackAllocation, isRestrictedBackupMode || !normalMode, app.persistent,
                        new Configuration(mConfiguration), app.compat,
                        getCommonServicesLocked(app.isolated),
                        mCoreSettingsObserver.getCoreSettingsLocked());
            ......
            } catch (Exception e) {
            ......
                return false;
            }
    
            ......
            if (normalMode) {
                try {
                    //2.启动activity
                    if (mStackSupervisor.attachApplicationLocked(app)) {
                        didSomething = true;
                    }
                } catch (Exception e) {
                    Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
                    badApp = true;
                }
            }
    
            ......
    
            return true;
        }
    

    接着会调用ActivityStackSupervisor的attachApplicationLocked方法启动activity:

    boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {
            final String processName = app.processName;
            boolean didSomething = false;
            for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
                ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
                for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
                    final ActivityStack stack = stacks.get(stackNdx);
                    if (!isFrontStack(stack)) {
                        continue;
                    }
                    ActivityRecord hr = stack.topRunningActivityLocked(null);
                    if (hr != null) {
                        if (hr.app == null && app.uid == hr.info.applicationInfo.uid
                                && processName.equals(hr.processName)) {
                            try {
                                //调用realStartActivityLocked方法真正启动activity
                                if (realStartActivityLocked(hr, app, true, true)) {
                                    didSomething = true;
                                }
                            } catch (RemoteException e) {
                                Slog.w(TAG, "Exception in new application when starting activity "
                                      + hr.intent.getComponent().flattenToShortString(), e);
                                throw e;
                            }
                        }
                    }
                }
            }
            if (!didSomething) {
                ensureActivitiesVisibleLocked(null, 0);
            }
            return didSomething;
        }
    
    

    紧接着调用ActivityStackSupervisor的realStartActivityLocked方法真正启动activity:

    final boolean realStartActivityLocked(ActivityRecord r,
                ProcessRecord app, boolean andResume, boolean checkConfig)
                throws RemoteException {
    
            ......
            try {
            ......
                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);
    
            ......
    
            } catch (RemoteException e) {
            ......
            }
            ......
    
            return true;
        }
    
    

    看到这里应该很熟悉,和Application的启动一样,通过binder跨进程提调用到应用进程ApplicationThread的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);
    
                //将消息交给H类型的mH处理
                sendMessage(H.LAUNCH_ACTIVITY, r);
            }
    
    

    通过H类型的mH将标识为LAUNCH_ACTIVITY传递给mH处理:

    public void handleMessage(Message msg) {
            ......
                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 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;
            ......
    
                }
            ......
            }
    

    然后调用了ActivityThread的handleLaunchActivity方法:

    private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    
            ......
             //1.执行Activity的初始化及oncreate方法
            Activity a = performLaunchActivity(r, customIntent);
    
        if (a != null) {
            ......
                //2.执行Activity的onResume方法
                handleResumeActivity(r.token, false, r.isForward,
                        !r.activity.mFinished && !r.startsNotResumed);
            ......
                
            } else {
    
            ......
               
            }
            
        }
    
    
    

    先分析注释1处,看看activity的oncreate方法如何执行的,ActivityThread的performLaunchActivity方法:

    private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    
            ......
    
            Activity activity = null;
            try {
                java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
                //1.创建activity
                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 {
                //2.创建Application,实质上Application已经创建,只是获得已有的Application 实例
                Application app = r.packageInfo.makeApplication(false, mInstrumentation);
    
            ......
    
                if (activity != null) {
            
    
                    //3.创建context
                    Context appContext = createBaseContextForActivity(r, activity);
    
            ......
                
                    //4.将Context和Application 与activity关联起来,完成activity的初始化
                    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);
            
                    //5.调用activity的oncreate方法
                    if (r.isPersistable()) {
                        mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                    } else {
                        mInstrumentation.callActivityOnCreate(activity, r.state);
                    }
                    
            ......
    
                    if (!r.activity.mFinished) {
                        //6.调用activity的onStart方法
                        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);
                        }
                    }
                    
            ......
    
            } 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;
        }
    

    这段代码有6处注释,我们来一一分析:注释1处,同创建Application一样通过反射创建一个Activity 实例。注释2处:之前分析过一个应用程序,如果已经存在一个Application实例,则不再创建新的实例,直接返回以前的Application实例。注释3处创建一个activity初始化所需要的context。注释4处,通过Activity的attach方法完成Context和Application 与activity关联,同时activity的初始化,这里由于篇幅原因就不再继续分析attach方法的具体实现了。注释5处,会调用activity的oncreate方法,6处会调用ctivity的onStart方法。接下来分别分析注释5与6两处,以便搞清楚,activity的oncreate与onStart是怎么被回调的。
    Instrumentation的callActivityOnCreate方法:

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

    直接看activity的performCreate方法:

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

    再然后就调用到了我们熟悉的activity的onCreate方法中。
    分析完了activity的onCreate,我们再来看activity的performStart方法:

    final void performStart() {
            ......
            mInstrumentation.callActivityOnStart(this);
            ......
        }
    
    

    和oncreate方法一样,通过Instrumentation控制activity的onStart方法,调用Instrumentation的callActivityOnStart方法:

    public void callActivityOnStart(Activity activity) {
            activity.onStart();
        }
    

    直接调用了activity的onStart方法。
    这样就分析完了ActivityThread的handleLaunchActivity方法的注释1处,下面再来分析注释2处:

    private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    
            ......
             //1.执行Activity的初始化及oncreate方法
            Activity a = performLaunchActivity(r, customIntent);
    
        if (a != null) {
            ......
                //2.执行Activity的onResume方法
                handleResumeActivity(r.token, false, r.isForward,
                        !r.activity.mFinished && !r.startsNotResumed);
            ......
    
            } else {
    
            ......
    
            }
    
        }
    

    注释2处调用了ActivityThread的handleResumeActivity方法:

    final void handleResumeActivity(IBinder token,
                boolean clearHide, boolean isForward, boolean reallyResume) {
    
            ......
    
            ActivityClientRecord r = performResumeActivity(token, clearHide);
            
            ......
            
        }
    

    接着调用了ActivityThread的performResumeActivity方法:

    public final ActivityClientRecord performResumeActivity(IBinder token,
                boolean clearHide) {
            ......
            if (r != null && !r.activity.mFinished) {
                if (clearHide) {
                    r.hideForNow = false;
                    r.activity.mStartedActivity = false;
                }
                try {
    
            ......
                    //调用activity的performResume方法
                    r.activity.performResume();
    
            ......
    
    
                } catch (Exception e) {
                    if (!mInstrumentation.onException(r.activity, e)) {
                        throw new RuntimeException(
                            "Unable to resume activity "
                            + r.intent.getComponent().toShortString()
                            + ": " + e.toString(), e);
                    }
                }
            }
            return r;
        }
    
    

    然后调用了activity的performResume方法:

    final void performResume() {
    
            ......
    
            mInstrumentation.callActivityOnResume(this);
            
            ......
        }
    

    同上文执行activity的onCreate和onStart方法一样。通过Instrumentation控制activity的生命周期方法。接着调用Instrumentation的callActivityOnResume方法:

    public void callActivityOnResume(Activity activity) {
            activity.mResumed = true;
            activity.onResume();
    
            ......
        }
    

    然后就调用了activity的onResume()方法。
    这样acticity启动过程中的几个生命周期方法就大概的分析完了,主要说明了他们是怎么执行的,但是还是省略了一些细节,比如activity的初始化的一些操作,比如activity的onResume方法是怎样让布局显示在界面上的等等,以后的文章会详细分析这个过程的。

    3.总结

    这篇文章从ActivityThread的main方法开始,分析了application如何创建及oncreate方法何时被会调的和一些activity启动相关的生命周期方法。

    相关文章

      网友评论

        本文标题:Activity启动流程(下)

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