Activity启动源码分析

背景

今天一如既往的“啃食”源码,学习Activity的启动流程,startActivity( )这个方法我们经常使用到,但是系统是如何新建Activity并启动的呢?今天带着这个问题,一起来看源码吧!(本文源码API 25)

开个小差,看完可能会身心不适应,最好准备一杯咖啡~为了便于阅读重点代码,其中会省略部分源码

源码

1、直接进入Activity.java源码

@Override
    public void startActivity(Intent intent) {
        this.startActivity(intent, null);
    }

@Override
    public void startActivity(Intent intent, @Nullable Bundle options) {
        if (options != null) {
            startActivityForResult(intent, -1, options);
        } else {
            startActivityForResult(intent, -1);
        }
    }

2、此处无须解释,直接进入startActivityForResult(),位于Activity.java;

public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options) {
        //mParent一般为null,该字段用于ActivityGroup
        if (mParent == null) {
            //......
            //启动工作转到了execStartActivity()这个方法
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
            //......
        } else {
            //......
        }
    }

3、进入execStartActivity(),位于Instrumentation.java;

 public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options) {
        IApplicationThread whoThread = (IApplicationThread) contextThread;
        //......
        //遍历Activity
        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()) {
                            //如果当前Activity不可用,直接返回
                            return requestCode >= 0 ? am.getResult() : null;
                        }
                        break;
                    }
                }
            }
        }
        try {
            //......
            //调用了ActivityManagerProxy这个代理类的startActivity()方法
            int result = ActivityManagerNative.getDefault()
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, options);
            //......
        } catch (RemoteException e) {
            throw new RuntimeException("Failure from system", e);
        }
        return null;
    }

4、进入startActivity(),ActivityManagerProxy是ActivityManagerNative一个内部代理类,位于ActivityManagerNative.java;

public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,
            String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException {
        //......
        //transact()是IBinder接口的一个方法,mRemote是IBinder对象,最终会通过IBinder机制调用
        //ActivityManagerService.claas的内部类的AppTaskImpl的startActivity()方法
        mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);
        //......
        return result;
    }

5、进入startActivity(),位于ActivityManagerService.java的内部类AppTaskImpl.class;

        @Override
        public int startActivity(IBinder whoThread, String callingPackage,
                Intent intent, String resolvedType, Bundle bOptions) {
            //......
            //然后调用ActivityStarter的startActivityMayWait()方法
            return mActivityStarter.startActivityMayWait(appThread, -1, callingPackage, intent,
                    resolvedType, null, null, null, null, 0, 0, null, null,
                    null, bOptions, false, callingUser, null, tr);
        }

6、进入startActivityMayWait(),位于ActivityStarter.java;

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, IActivityManager.WaitResult outResult, Configuration config,
            Bundle bOptions, boolean ignoreTargetSecurity, int userId,
            IActivityContainer iContainer, TaskRecord inTask) {
            //......
            //接着调用了startActivityLocked()方法
            final ActivityRecord[] outRecord = new ActivityRecord[1];
            int res = startActivityLocked(caller, intent, ephemeralIntent, resolvedType,
                    aInfo, rInfo, voiceSession, voiceInteractor,
                    resultTo, resultWho, requestCode, callingPid,
                    callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
                    options, ignoreTargetSecurity, componentSpecified, outRecord, container,
                    inTask);
            //......
    }

7、进入startActivityLocked(),位于ActivityStarter.java;

final int startActivityLocked(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
            String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
            String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
            ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
            ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container,
            TaskRecord inTask) {
        int err = ActivityManager.START_SUCCESS;
        //......
        try {
            mService.mWindowManager.deferSurfaceLayout();
            //......
            //接着调用startActivityUnchecked()方法
            err = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor, 
            startFlags, true, options, inTask);
        } finally {
            mService.mWindowManager.continueSurfaceLayout();
        }
        //......
        return err;
    }

8、进入startActivityUnchecked(),位于ActivityStarter.java;

private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask) {

        //......
        if (mDoResume) {
            if (!mLaunchTaskBehind) {
                //......
                mService.setFocusedActivityLocked(mStartActivity, "startedActivity");
            }
            final ActivityRecord topTaskActivity = mStartActivity.task.topRunningActivityLocked();
            if (!mTargetStack.isFocusable()
                    || (topTaskActivity != null && topTaskActivity.mTaskOverlay
                    && mStartActivity != topTaskActivity)) {
                //......
            } else {
                //接着调用resumeFocusedStackTopActivityLocked()方法
                mSupervisor.resumeFocusedStackTopActivityLocked(mTargetStack,   
                mStartActivity, mOptions);
            }
        } else {
            mTargetStack.addRecentActivityLocked(mStartActivity);
        }
        //......
        return START_SUCCESS;
    }

9、进入resumeFocusedStackTopActivityLocked(),位于ActivityStackSupervisor.java;

 boolean resumeFocusedStackTopActivityLocked(
            ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
        if (targetStack != null && isFocusedStack(targetStack)) {
            //接着调用resumeTopActivityUncheckedLocked()方法
            return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
        }
        final ActivityRecord r = mFocusedStack.topRunningActivityLocked();
        if (r == null || r.state != RESUMED) {
            mFocusedStack.resumeTopActivityUncheckedLocked(null, null);
        }
        return false;
    }

10、进入resumeTopActivityUncheckedLocked(),位于ActivityStack.java;

boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
        if (mStackSupervisor.inResumeTopActivity) {
            // Don't even start recursing.
            return false;
        }

        boolean result = false;
        try {
            // Protect against recursion.
            mStackSupervisor.inResumeTopActivity = true;
            if (mService.mLockScreenShown == ActivityManagerService.LOCK_SCREEN_LEAVING) {
                mService.mLockScreenShown = ActivityManagerService.LOCK_SCREEN_HIDDEN;
                mService.updateSleepIfNeededLocked();
            }
            //接着调用resumeTopActivityInnerLocked()方法
            result = resumeTopActivityInnerLocked(prev, options);
        } finally {
            mStackSupervisor.inResumeTopActivity = false;
        }
        return result;
    }

11、进入resumeTopActivityInnerLocked(),位于ActivityStack.java;

private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
    //......
     if (mResumedActivity != null) {
            if (DEBUG_STATES) Slog.d(TAG_STATES,"resumeTopActivityLocked: Pausing " + mResumedActivity);
            //接着调用startPausingLocked()方法
            pausing |= startPausingLocked(userLeaving, false, next, dontWaitForPause);
        }
    //......
    return true;
}

12、进入startPausingLocked(),位于ActivityStack.java;

final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping,
            ActivityRecord resuming, boolean dontWait) {
        //......
        if (prev.app != null && prev.app.thread != null) {
            if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Enqueueing pending pause: " + prev);
            try {
                //......
                //重点来啦,prev.app.thread是ActivityThread的一个实例
                prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing,
                        userLeaving, prev.configChangeFlags, dontWait);
            } catch (Exception e) {
               //......
            }
        } else {
            //......
        }
        //......
    }

13、进入schedulePauseActivity(),位于ActivityThread.java内部类ApplicationThread.class的方法;

public final void schedulePauseActivity(IBinder token, boolean finished,
                boolean userLeaving, int configChanges, boolean dontReport) {
            int seq = getLifecycleSeq();
            if (DEBUG_ORDER) Slog.d(TAG, "pauseActivity " + ActivityThread.this
                    + " operation received seq: " + seq);
            sendMessage(
                    finished ? H.PAUSE_ACTIVITY_FINISHING : H.PAUSE_ACTIVITY,
                    token,
                    (userLeaving ? USER_LEAVING : 0) | (dontReport ? DONT_REPORT : 0),
                    configChanges,
                    seq);
        }

private class H extends Handler {
    public void handleMessage(Message msg) {
        case PAUSE_ACTIVITY_FINISHING: {
                   //......
                   //接着调用handlePauseActivity()方法
                    handlePauseActivity((IBinder) args.arg1, true, (args.argi1 & USER_LEAVING) != 0,
                            args.argi2, (args.argi1 & DONT_REPORT) != 0, args.argi3);
                    //......
                } break;
    }
}

13、进入handlePauseActivity(),位于ActivityThread.java;

private void handlePauseActivity(IBinder token, boolean finished,
            boolean userLeaving, int configChanges, boolean dontReport, int seq) {
        ActivityClientRecord r = mActivities.get(token);
        //......
        if (r != null) {
            //Slog.v(TAG, "userLeaving=" + userLeaving + " handling pause of " + r);
            performPauseActivity(token, finished, r.isPreHoneycomb(), "handlePauseActivity");
            //......
        }
    }

14、进入performPauseActivity(),位于ActivityThread.java;

    final Bundle performPauseActivity(IBinder token, boolean finished,
            boolean saveState, String reason) {
        ActivityClientRecord r = mActivities.get(token);
        return r != null ? performPauseActivity(r, finished, saveState, reason) : null;
    }

    final Bundle performPauseActivity(ActivityClientRecord r, boolean finished,
            boolean saveState, String reason) {
        //......
        performPauseActivityIfNeeded(r, reason);
       //......
        return !r.activity.mFinished && saveState ? r.state : null;
    }

14、进入performPauseActivityIfNeeded(),位于ActivityThread.java;

private void performPauseActivityIfNeeded(ActivityClientRecord r, String reason) {
       //......
        try {
            //......
            mInstrumentation.callActivityOnPause(r.activity);
            //......
        } catch (SuperNotCalledException e) {
            throw e;
        } catch (Exception e) {
            //......
        }
        r.paused = true;
    }

15、进入callActivityOnPause(),位于Instrumentation.java;

    /**
     * Perform calling of an activity's {@link Activity#onPause} method.  The
     * default implementation simply calls through to that method.
     * 
     * @param activity The activity being paused.
     */
    public void callActivityOnPause(Activity activity) {
        activity.performPause();
    }

16、回到Activity的performPause( )方法,位于Activity.java;

final void performPause() {
        mDoReportFullyDrawn = false;
        mFragments.dispatchPause();
        mCalled = false;
        //最终,调用了Activity的onPause()方法。
        onPause();
        mResumed = false;
        if (!mCalled && getApplicationInfo().targetSdkVersion
                >= android.os.Build.VERSION_CODES.GINGERBREAD) {
            throw new SuperNotCalledException(
                    "Activity " + mComponent.toShortString() +
                    " did not call through to super.onPause()");
        }
        mResumed = false;
    }

【PS】至此,我们看完了启动Activity的第一步,结束之前的Activity,方能启动新的Activity

17、重新回到第11步,resumeTopActivityInnerLocked(),位于ActivityStack.java;

private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
    //......
     if (mResumedActivity != null) {
            if (DEBUG_STATES) Slog.d(TAG_STATES,"resumeTopActivityLocked: Pausing " + mResumedActivity);
            //接着调用startPausingLocked()方法,这里刚才分析过了,接下去是一系列停止之前的Activity的操作。
            pausing |= startPausingLocked(userLeaving, false, next, dontWaitForPause);
        }
    //......
    //通知开启新的Activity的开始
    mStackSupervisor.startSpecificActivityLocked(next, true, true);
    //......
    return true;
}

18、进入startSpecificActivityLocked(),位于ActivityStackSupervisor.java的内部类startSpecificActivityLocked.class里面

void startSpecificActivityLocked(ActivityRecord r,
            boolean andResume, boolean checkConfig) {
       //......
        if (app != null && app.thread != null) {
            try {
                //......
                //接着调用了realStartActivityLocked()方法
                realStartActivityLocked(r, app, andResume, checkConfig);
                return;
            } catch (RemoteException e) {
                //......
            }

            //......
        }
        //......
    }

19、进入realStartActivityLocked(),位于ActivityStackSupervisor

 final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
            boolean andResume, boolean checkConfig) throws RemoteException {
             //......
             //接着掉用了ActivityThread的scheduleLaunchActivity()分发消息,开启新的Activity
    app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
                    System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
                    new Configuration(task.mOverrideConfig), r.compat, r.launchedFromPackage,
                    task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,
                    newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);
           //......
}

20、进入scheduleLaunchActivity(),位于ActivityThread.java

        @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) {
            //......
            ActivityClientRecord r = new ActivityClientRecord();
            //......
            //发送开启新的Activity的LAUNCH_ACTIVITY消息
            sendMessage(H.LAUNCH_ACTIVITY, r);
        }

21、进入scheduleLaunchActivity(),位于ActivityThread.java的内部类H.class,看看H的消息出来部分

 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, "LAUNCH_ACTIVITY");
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                }
 }

22、进入handleLaunchActivity(),位于ActivityThread.java

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
        //......
        //可见,跟前面暂停Activity一样,分发处理消息
        Activity a = performLaunchActivity(r, customIntent);
        //......
    }

23、进入performLaunchActivity(),位于ActivityThread.java

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {

        // 取出Activity的相关信息
        ActivityInfo aInfo = r.activityInfo;
        Activity activity = null;
        try {
            // 可见,Activity 是通过反射创建的一个实例对象
            java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
            activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
            //......
        } catch (Exception e) {
            //......
        }

        try {
            Application app = r.packageInfo.makeApplication(false, mInstrumentation);
            //......
            if (activity != null) {
                //......
                //调用了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, window);

                //......
                // 设置主题
                int theme = r.activityInfo.getThemeResource();
                if (theme != 0) {
                    activity.setTheme(theme);
                }

                //......
                // 在Activity创建后,调用了callActivityOnCreate()方法
                if (r.isPersistable()) {
                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                } else {
                    mInstrumentation.callActivityOnCreate(activity, r.state);
                }

        } catch (SuperNotCalledException e) {
            throw e;
        } catch (Exception e) {
            //......
        }
        return activity;
    }

24、进入callActivityOnCreate(),位于Instrumentation.java

    /**
     * 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
     * @param persistentState The previously persisted state (or null)
     */
    public void callActivityOnCreate(Activity activity, Bundle icicle,
            PersistableBundle persistentState) {
        prePerformCreate(activity);
        //调用performCreate()调用OnCreate()声明周期的方法
        activity.performCreate(icicle, persistentState);
        postPerformCreate(activity);
    }

24、进入performCreate(),位于Activity .java

final void performCreate(Bundle icicle, PersistableBundle persistentState) {
        restoreHasCurrentPermissionRequest(icicle);
        //看到这里,Activity终于启动了
        onCreate(icicle, persistentState);
        mActivityTransitionState.readState(icicle);
        performCreateCommon();
    }

下面的内容不扯了,以此类推的,看到onCreate()这里应该很激动了,不说了,两只眼睛已经看不见东西了,o(╯□╰)o

* 后续再完善文章吧,眼睛已瞎,无奈不能继续看了*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Activity启动模式是Android应用程序中非常重要的概念,它决定了Activity启动方式和生命周期的管理方式。在Android中,Activity启动模式主要有以下几种: 1. standard:标准模式。默认情况下,每次启动Activity时都会创建一个新实例,并放入任务栈中。如果该Activity已经存在任务栈中,则会将该Activity放到栈顶,并重新调用其onCreate()方法。 2. singleTop:栈顶复用模式。如果新启动Activity已经存在任务栈的栈顶,则不会创建新实例,而是将已有的实例作为当前任务的Activity,并调用其onNewIntent()方法。如果新启动Activity不在栈顶,则会创建新实例,并将其放到任务栈的栈顶。 3. singleTask:栈内复用模式。如果新启动Activity已经存在任务栈中,则不会创建新实例,而是将已有的实例作为当前任务的Activity,并将其上面的Activity全部出栈,调用其onNewIntent()方法。如果新启动Activity不存在任务栈中,则会创建新实例,并放到任务栈的栈顶。 4. singleInstance:单例模式。在一个新的任务栈中创建Activity,并且该任务栈中只有该Activity实例。如果该Activity已经存在于其他任务栈中,则会将该任务栈中的该Activity实例移动到新的任务栈中。 下面是Activity源码分析: 1. standard模式 在Activity源码中,标准模式是默认的启动模式。当我们使用startActivity()方法启动一个Activity时,会调用ActivityStackSupervisor类中的startActivityLocked()方法。在该方法中,会通过ActivityStack类的findTaskLocked()方法查找是否存在当前Activity所在的任务栈。如果存在,则会将当前Activity放到该任务栈的栈顶,并调用其onCreate()方法。如果不存在,则会创建一个新的任务栈,并将当前Activity放到该任务栈的栈顶。 2. singleTop模式 当我们在Manifest文件中设置Activity启动模式为singleTop时,会在ActivityInfo中保存该信息。在ActivityStackSupervisor类的startActivityLocked()方法中,会通过ActivityStack类的findTaskLocked()方法查找是否存在当前Activity所在的任务栈,并判断当前Activity是否在栈顶。如果在栈顶,则会调用其onNewIntent()方法。如果不在栈顶,则会创建一个新的实例,并放到该任务栈的栈顶。 3. singleTask模式 当我们在Manifest文件中设置Activity启动模式为singleTask时,会在ActivityInfo中保存该信息。在ActivityStackSupervisor类的startActivityLocked()方法中,会通过ActivityStack类的findTaskLocked()方法查找是否存在当前Activity所在的任务栈。如果存在,则会找到该任务栈中的栈顶Activity,并将其上面的所有Activity出栈。然后将当前Activity放到该任务栈的栈顶,并调用其onNewIntent()方法。如果不存在,则会创建一个新的任务栈,并将当前Activity放到该任务栈的栈顶。 4. singleInstance模式 当我们在Manifest文件中设置Activity启动模式为singleInstance时,会在ActivityInfo中保存该信息。在ActivityStackSupervisor类的startActivityLocked()方法中,会创建一个新的任务栈,并将当前Activity放到该任务栈的栈顶。如果该Activity已经存在于其他任务栈中,则会将该任务栈中的该Activity实例移动到新的任务栈中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值