Activity 生命周期函数执行过程详解

来源:互联网 发布:淘宝首页轮播大图代码 编辑:程序博客网 时间:2024/06/05 16:55

平时开发中接触到Android的启动以及各种生命周期函数,但是其背后的执行过程是怎么样的呢?本文从源码的角度来分析activity的启动以及它的生命周期函数。

关键的类


在分析源码之前,先了解下几个关键的类的作用:

ActivityManagerService:activity的启动以及生命周期都统一由ActivityManagerService管理,而ActivityManagerService处于SystemServer进程中,应用程序进程通过Binder机制与SystemServer进程进行通信。

ActivityManagerProxy:是ActivityManagerService在客户端的代理,客户端通过ActivityManageProxy间接调用ActivityManagerService。

ActivityThread:应用程序的主线程ActivityThread,也是应用程序的入口;消息循环机制的创建、初始化信息等都在ActivityThread中完成。

ApplicationThread:用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯。

ApplicationThreadProxy:是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的。

Instrumentation:每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。

Activity的启动流程


分析Activity的启动流程,那就从startActivity()分析吧

    @Override    public void startActivity(Intent intent, @Nullable Bundle options) {        if (options != null) {            startActivityForResult(intent, -1, options);        } else {            // Note we want to go through this call for compatibility with            // applications that may have overridden the method.            startActivityForResult(intent, -1);        }    }

调用startActivity()直接调用startActivityForResult()

 public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {        if (mParent == null) {            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;            }            final View decor = mWindow != null ? mWindow.peekDecorView() : null;            if (decor != null) {                decor.cancelPendingInputEvents();            }        } else {            if (options != null) {                mParent.startActivityFromChild(this, intent, requestCode, options);            } else {                mParent.startActivityFromChild(this, intent, requestCode);            }        }        if (options != null && !isTopOfTask()) {            mActivityTransitionState.startExitOutTransition(this, options);        }    }

当mParent == null时,调用了Instrumentation的execStartActivity()方法,不为空时调用startActivityFromChild(),先来看看startActivityFromChild()

    public void startActivityFromChild(@NonNull Activity child, Intent intent,            int requestCode, @Nullable Bundle options) {        Instrumentation.ActivityResult ar =            mInstrumentation.execStartActivity(                this, mMainThread.getApplicationThread(), mToken, child,                intent, requestCode, options);        if (ar != null) {            mMainThread.sendActivityResult(                mToken, child.mEmbeddedID, requestCode,                ar.getResultCode(), ar.getResultData());        }    }

还是调用了Instrumentation的execStartActivity()方法,因为mInstrumentation对象在一个应用中只会存在一个实例,因此mParent是不是null都会执行Instrumentation的execStartActivity()方法

  public ActivityResult execStartActivity(            Context who, IBinder contextThread, IBinder token, Activity target,            Intent intent, int requestCode, Bundle options) {        IApplicationThread whoThread = (IApplicationThread) contextThread;        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();            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) {        }        return null;    }

通过Instrumentation的execStartActivity()方法,会调用ActivityManagerNative.getDefault().startActivity(),而ActivityManagerNative通过Binder机制实现的,因此会通过ActivityManagerProxy调用ActivityManagerService来启动activity。而启动activity会通过ApplicationThread以及H来进行activity的初始化,H中的代码

          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);//启动activity                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                } break;

再来看看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);        WindowManagerGlobal.initialize();        Activity a = performLaunchActivity(r, customIntent);//执行activity的启动        if (a != null) {            r.createdConfig = new Configuration(mConfiguration);            Bundle oldState = r.state;            //执行activity的resume            handleResumeActivity(r.token, false, r.isForward,                    !r.activity.mFinished && !r.startsNotResumed);            if (!r.activity.mFinished && r.startsNotResumed) {                try {                    r.activity.mCalled = false;                    mInstrumentation.callActivityOnPause(r.activity);                    if (r.isPreHoneycomb()) {                        r.state = oldState;                    }                } catch (SuperNotCalledException e) {                    throw e;                } catch (Exception e) {                }                r.paused = true;            }        } 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, false);            } catch (RemoteException ex) {                // Ignore            }        }    }

再来看看performLaunchActivity()函数

 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();            //Instrumentation通过反射实例化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 {            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 (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;                //调用activity的onCreate()方法                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;                //调用activity的onStart()方法                if (!r.activity.mFinished) {                    activity.performStart();                    r.stopped = false;                }                if (!r.activity.mFinished) {                    if (r.isPersistable()) {                    //调用activity的OnRestoreInstanceState()方法                        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;                    //调用activity的OnPostCreate()方法                    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的生命周期ActivityThread通过Instrumentation进行调用

让我们总结一下activity的启动过程:Activity → Instrumentation → ActivityManagerProxy → ActivityManagerService → ApplicationThreadProxy → ApplicationThread → H → ActivityThread → Instrumentation。

Activity的生命周期函数执行过程


上面分析了Activity的启动过程,当启动初始化activity之后,各个生命周期函数是怎么从ActivityManagerService到activity的呢?

以onResume()为例,首先来看ApplicationThreadProxy,位于SystemServer进程中

    public final void scheduleResumeActivity(IBinder token, int procState, boolean isForward,            Bundle resumeArgs)            throws RemoteException {        Parcel data = Parcel.obtain();        data.writeInterfaceToken(IApplicationThread.descriptor);        data.writeStrongBinder(token);        data.writeInt(procState);        data.writeInt(isForward ? 1 : 0);        data.writeBundle(resumeArgs);        mRemote.transact(SCHEDULE_RESUME_ACTIVITY_TRANSACTION, data, null,                IBinder.FLAG_ONEWAY);        data.recycle();    }

通过Binder机制,调用应用程序进程中的ApplicationThread对应的scheduleResumeActivity()函数

   public final void scheduleResumeActivity(IBinder token, int processState,                boolean isForward, Bundle resumeArgs) {            updateProcessState(processState, false);            sendMessage(H.RESUME_ACTIVITY, token, isForward ? 1 : 0);   }

而ApplicationThread通过sendMessage发送消息给H处理,其中H是ActivityThread的一个私有内部类,在main()函数中进行了初始化。

    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;

在H的handleMessage()函数中调用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);        if (r != null) {            final Activity a = r.activity;            final int forwardBit = isForward ?                    WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION : 0;            boolean willBeVisible = !a.mStartedActivity;            if (!willBeVisible) {                try {                    willBeVisible = ActivityManagerNative.getDefault().willActivityBeVisible(                            a.getActivityToken());                } catch (RemoteException e) {                }            }            if (r.window == null && !a.mFinished && willBeVisible) {                r.window = r.activity.getWindow();                View decor = r.window.getDecorView();                decor.setVisibility(View.INVISIBLE);                ViewManager wm = a.getWindowManager();                WindowManager.LayoutParams l = r.window.getAttributes();                a.mDecor = decor;                l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;                l.softInputMode |= forwardBit;                if (a.mVisibleFromClient) {                    a.mWindowAdded = true;                    wm.addView(decor, l);                }            } else if (!willBeVisible) {                if (localLOGV) Slog.v(                    TAG, "Launch " + r + " mStartedActivity set");                r.hideForNow = true;            }            // Get rid of anything left hanging around.            cleanUpPendingRemoveWindows(r);            // The window is now visible if it has been added, we are not            // simply finishing, and we are not starting another activity.            if (!r.activity.mFinished && willBeVisible                    && r.activity.mDecor != null && !r.hideForNow) {                if (r.newConfig != null) {                    if (DEBUG_CONFIGURATION) Slog.v(TAG, "Resuming activity "                            + r.activityInfo.name + " with newConfig " + r.newConfig);                    performConfigurationChanged(r.activity, r.newConfig);                    freeTextLayoutCachesIfNeeded(r.activity.mCurrentConfig.diff(r.newConfig));                    r.newConfig = null;                }                if (localLOGV) Slog.v(TAG, "Resuming " + r + " with isForward="                        + isForward);                WindowManager.LayoutParams l = r.window.getAttributes();                if ((l.softInputMode                        & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION)                        != forwardBit) {                    l.softInputMode = (l.softInputMode                            & (~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION))                            | forwardBit;                    if (r.activity.mVisibleFromClient) {                        ViewManager wm = a.getWindowManager();                        View decor = r.window.getDecorView();                        wm.updateViewLayout(decor, l);                    }                }                r.activity.mVisibleFromServer = true;                mNumVisibleActivities++;                if (r.activity.mVisibleFromClient) {                    r.activity.makeVisible();                }            }            if (!r.onlyLocalRequest) {                r.nextIdle = mNewActivities;                mNewActivities = r;                if (localLOGV) Slog.v(                    TAG, "Scheduling idle handler for " + r);                Looper.myQueue().addIdleHandler(new Idler());            }            r.onlyLocalRequest = false;            // Tell the activity manager we have resumed.            if (reallyResume) {                try {                    ActivityManagerNative.getDefault().activityResumed(token);                } catch (RemoteException ex) {                }            }        } else {            // If an exception was thrown when trying to resume, then            // just end this activity.            try {                ActivityManagerNative.getDefault()                    .finishActivity(token, Activity.RESULT_CANCELED, null, false);            } catch (RemoteException ex) {            }        }    }

在handleResumeActivity()调用了performResumeActivity()函数,并对view进行显示,同时通知ActivityManagerService已经完成resume.看看performResumeActivity()函数的实现

 public final ActivityClientRecord performResumeActivity(IBinder token,            boolean clearHide) {        ActivityClientRecord r = mActivities.get(token);        if (localLOGV) Slog.v(TAG, "Performing resume of " + r                + " finished=" + r.activity.mFinished);        if (r != null && !r.activity.mFinished) {            if (clearHide) {                r.hideForNow = false;                r.activity.mStartedActivity = false;            }            try {                r.activity.mFragments.noteStateNotSaved();                if (r.pendingIntents != null) {                    deliverNewIntents(r, r.pendingIntents);                    r.pendingIntents = null;                }                if (r.pendingResults != null) {                    deliverResults(r, r.pendingResults);                    r.pendingResults = null;                }                r.activity.performResume();                EventLog.writeEvent(LOG_ON_RESUME_CALLED,                        UserHandle.myUserId(), r.activity.getComponentName().getClassName());                r.paused = false;                r.stopped = false;                r.state = null;                r.persistentState = null;            } 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;    }

其中 r.activity.performResume();执行resume,调用activity的performResume()函数。

    final void performResume() {        performRestart();        mFragments.execPendingActions();        mLastNonConfigurationInstances = null;        mCalled = false;        // mResumed is set by the instrumentation        mInstrumentation.callActivityOnResume(this);        if (!mCalled) {            throw new SuperNotCalledException(                "Activity " + mComponent.toShortString() +                " did not call through to super.onResume()");        }        // Now really resume, and install the current status bar and menu.        mCalled = false;        mFragments.dispatchResume();        mFragments.execPendingActions();        onPostResume();        if (!mCalled) {            throw new SuperNotCalledException(                "Activity " + mComponent.toShortString() +                " did not call through to super.onPostResume()");        }    }

而在activity的performResume()函数中调用了mInstrumentation.callActivityOnResume(this),

    public void callActivityOnResume(Activity activity) {        activity.mResumed = true;        activity.onResume();        if (mActivityMonitors != null) {            synchronized (mSync) {                final int N = mActivityMonitors.size();                for (int i=0; i<N; i++) {                    final ActivityMonitor am = mActivityMonitors.get(i);                    am.match(activity, activity, activity.getIntent());                }            }        }    }

Instrumentation的函数callActivityOnResume()执行了 activity.onResume()方法,至此,resume整个流程完成。

Resume执行过程:ActivityManagerService → ApplicationThreadProxy → ApplicationThread → H → Activity → Instrumentation → Activity

总结


activity的启动过程:Activity → Instrumentation → ActivityManagerProxy → ActivityManagerService(SystemServer进程) → ApplicationThreadProxy(SystemServer进程) → ApplicationThread → H。

生命周期函数执行过程ActivityManagerService(SystemServer进程) → :ApplicationThreadProxy(SystemServer进程) → ApplicationThread → H → Activity → Instrumentation → Activity