(M)Activity详解之Activity启动

来源:互联网 发布:pymongo 查询所有数据 编辑:程序博客网 时间:2024/04/30 00:05

在ActivityThread.java中有一个handleLaunchActivity函数,是创建Activity的地方。

// 创建Activity的入口    private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {        ......        // Initialize before creating the activity        WindowManagerGlobal.initialize();        // 返回一个Activity        Activity a = performLaunchActivity(r, customIntent);        ......        // handleResumeActivity?跟Activity的onResume方法有何关系?        handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed);        ......        // 看这个函数的名字,调用Activity的onPause方法        mInstrumentation.callActivityOnPause(r.activity);        ......                    }
接下来,进入performLaunchAvtivity方法中,它返回了一个Activity对象

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {    ......    java.lang.ClassLoader cl = r.packageInfo.getClassLoader();    // 调用Instrumentation.java文件的newActivity方法    activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);     ......    // 调用Activity的attach方法    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);    ......    // 调用Instrumentation的callActivityOnCreate方法,从名字上看,是调用了Activity的onCreate方法?    if (r.isPersistable()) {         mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);    } else {         mInstrumentation.callActivityOnCreate(activity, r.state);    }    ......    // 调用Activity的performStart方法    activity.performStart();    r.stopped = false;    ......    // 调用Instrumentation的callActivityOnRestoreInstanceState方法    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);    }    ......    // 调用Instrumentation的callActivityOnPostCreate方法    if (r.isPersistable()) {        mInstrumentation.callActivityOnPostCreate(activity, r.state, r.persistentState);    } else {        mInstrumentation.callActivityOnPostCreate(activity, r.state);    }    ...... }
performLaunchActivity方法中,调用了Instrumentation.java文件中的newActivity方法:

public Activity newActivity(ClassLoader cl, String className, Intent intent)            throws InstantiationException, IllegalAccessException, ClassNotFoundException {    // 调用ClassLoader的loadClass方法,直接返回一个Activity    return (Activity)cl.loadClass(className).newInstance();}
返回一个Activity对象,接下来调用Activity的attach方法:

final void attach(Context context, ActivityThread aThread,            Instrumentation instr, IBinder token, int ident,            Application application, Intent intent, ActivityInfo info,            CharSequence title, Activity parent, String id,            NonConfigurationInstances lastNonConfigurationInstances,            Configuration config, String referrer, IVoiceInteractor voiceInteractor) {        ......        // 初始化PhoneWindow对象        mWindow = new PhoneWindow(this);                ......        mWindow.setWindowManager(                (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),                mToken, mComponent.flattenToString(),                (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);        ......        // 初始化WindowManager对象,在上面初始化        mWindowManager = mWindow.getWindowManager();        ......    }
Window.java文件中

/**     * Set the window manager for use by this Window to, for example,     * display panels.  This is <em>not</em> used for displaying the     * Window itself -- that must be done by the client.     *     * @param wm The window manager for adding new windows.     */    public void setWindowManager(WindowManager wm, IBinder appToken, String appName,            boolean hardwareAccelerated) {        mAppToken = appToken;        mAppName = appName;        mHardwareAccelerated = hardwareAccelerated                || SystemProperties.getBoolean(PROPERTY_HARDWARE_UI, false);        if (wm == null) {            wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);        }        mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);    }
通过这个方法,我们知道Activity中的mWindow为PhoneWindow对象,而mWindowManager为WindowManagerIpml对象,这个对于后面分析Activity的生命周期有帮助。

performLaunchActivity方法中,调用了Activity.attach方法后,接下来调用的是mInstrumentation.callActivityOnCreate方法,这个方法从字面上理解,应该是调用Activity的onCreate方法,那么我们还是看代码

/**     * Perform calling of an activity's {@link Activity#onCreate}     * method.  The default implementation simply calls through to that method.     *     * @param activity The activity being created.     * @param icicle The previously frozen state (or null) to pass through to onCreate().     */    public void callActivityOnCreate(Activity activity, Bundle icicle) {        ......        // 调用了Activity的performCreate方法        activity.performCreate(icicle);        ......    }
Activity的performCreate方法:

final void performCreate(Bundle icicle) {        ......        // 调用Activity的onCreate方法        onCreate(icicle);        ......    }
可以看到确实调用的是Activity的onCreate方法,这样就进入Activity的生命周期了。

后面有调用了Activity的performStart()方法,mInstrumentation的callActivityOnRestoreInstanceState方法,mInstrumentation的callActivityOnPostCreate方法,这写就不写欻里了,同onCreate方法一样,依次调用了Activity的onStart,onRestoreInstanceState方法,onPostCreate方法。

这样ActivityThread.java文件中的performLaunchActivity方法中的基本功能就已经完成了。

返回继续查看ActivityThread的handleLaunchActivity方法,接下来会调用handleResumeActivity方法

final void handleResumeActivity(IBinder token,            boolean clearHide, boolean isForward, boolean reallyResume) {        ......        // TODO Push resumeArgs into the activity for consideration        ActivityClientRecord r = performResumeActivity(token, clearHide);        ......    }
public final ActivityClientRecord performResumeActivity(IBinder token,            boolean clearHide) {    ......    r.activity.performResume();    ...... }
handleResumeActivity方法中调用了ActivityThread类中的performResumeActivity方法,而performResumeActivity方法中调用了Activity的performResume方法:

final void performResume() {    // 调用performRestart方法        performRestart();        ......        // mResumed is set by the instrumentation        // 调用Instrumentation的callActivityOnResume方法,即调用Activity的onResume方法        mInstrumentation.callActivityOnResume(this);        ......    }
Activity文件中调用performRestart方法,这会直接调用Activity的onRestart方法

final void performRestart() {        ......        // 调用Instrumentation的callActivityOnRestart方法,主要是调用Activity的onRestart方法        mInstrumentation.callActivityOnRestart(this);        ......        performStart();    }
public void callActivityOnRestart(Activity activity) {    // 调用Activity的onRestart方法        activity.onRestart();    }
final void performStart() {        ......        // 调用Insttumentation的callActivityOnstart方法,之后调用Activity的onStart方法        mInstrumentation.callActivityOnStart(this);        ......    }

Instrumentation.java文件:

public void callActivityOnStart(Activity activity) {        activity.onStart();    }
因此在Activity的当前状态为stop的情况下其的生命周期又经历了onRestart和onStart。

而Activity的performResume方法中

final void performResume() {    // 调用performRestart方法        performRestart();        ......        // mResumed is set by the instrumentation        // 调用Instrumentation的callActivityOnResume方法,即调用Activity的onResume方法        mInstrumentation.callActivityOnResume(this);        ......    }
又调用了Instrumentation的callActivityOnResume方法,这个方法会调用Activity的onResume方法。

至此,Activity启动后依次调用了attach方法,用作初始化Window和WindowManager对象,然后就进入了Activity的生命启动周期,onCreate->onStart->onRestoreInstanceState->onResume,当Activity处于Stop状态的时候,调用onRestart->onStart->onResume





0 0