美文网首页
api_21_Activity的启动流程

api_21_Activity的启动流程

作者: 辣公公 | 来源:发表于2018-04-11 17:17 被阅读13次

涉及到关键的类

  1. Instrumentation
  2. ActivityManagerNative
  3. ActivityManagerProxy
  4. ActivityManagerNative
  5. ActivityStackSupervisor
  6. ActivityStack
  7. ActivityStackSupervisor
  8. ApplicationThreadProxy
  9. ApplicationThread
  10. ActivityThread

函数调用顺序

1. activity.

 1. startActivity(Intent intent)
 2. startActivity(Intent intent, @Nullable Bundle options)
 3. startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options)

2. Instrumentation

 1. execStartActivity(
        Context who, IBinder contextThread, IBinder token, Activity target,
        Intent intent, int requestCode, Bundle options) 

3. ActivityManagerProxy

 1.startActivity(IApplicationThread caller, String callingPackage, Intent intent,
        String resolvedType, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, Bundle options)

binder 传送到 ActivityManagerService传递常量标志START_ACTIVITY_TRANSACTION

4. ActivityManagerService

1. startActivity(IApplicationThread caller, String callingPackage,
        Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, Bundle options)
2. startActivityAsUser(IApplicationThread caller, String callingPackage,
        Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, Bundle options, int userId)

5. ActivityStackSupervisor

1. 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, int userId, IActivityContainer iContainer, TaskRecord inTask)
2. startActivityLocked(IApplicationThread caller,
        Intent intent, String resolvedType, ActivityInfo aInfo,
        IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
        IBinder resultTo, String resultWho, int requestCode,
        int callingPid, int callingUid, String callingPackage,
        int realCallingPid, int realCallingUid, int startFlags, Bundle options,
        boolean componentSpecified, ActivityRecord[] outActivity, ActivityContainer container,
        TaskRecord inTask)
3. startActivityUncheckedLocked(r, sourceRecord, voiceSession, voiceInteractor, startFlags, true, options, inTask)

6. ActivityStack

1. startActivityLocked(ActivityRecord r, boolean newTask,  boolean doResume, boolean keepCurTransition, Bundle options)
2. ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) 

startActivityLocked 干两件事情

  1. 调用 ensureActivitiesVisibleLocked 完成 application的创建并调用生命周期 attach onCreate ,activity 的创建且调用生命周期attachBaseContext onCreate onStart onRestoreInstanceState
  2. 方法最后几行 mStackSupervisor.resumeTopActivitiesLocked(this, r, options) 会去调用activity 的onResume,具体过程类似ensureActivitiesVisibleLocked

7. ActivityStackSupervisor

1. startSpecificActivityLocked(ActivityRecord r,boolean andResume, boolean checkConfig)
2. realStartActivityLocked(ActivityRecord r,  ProcessRecord app, boolean andResume, boolean checkConfig)

8. ApplicationThreadProxy

1. scheduleLaunchActivity(Intent intent, IBinder token, int ident,
        ActivityInfo info, Configuration curConfig, CompatibilityInfo compatInfo,
        IVoiceInteractor voiceInteractor, int procState, Bundle state,
        PersistableBundle persistentState, List<ResultInfo> pendingResults,
        List<Intent> pendingNewIntents, boolean notResumed, boolean isForward,
        ProfilerInfo profilerInfo)

binder 传送到 ApplicationThread传递常量标志SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION

9.ApplicationThread

1. scheduleLaunchActivity(Intent intent, IBinder token, int ident,
            ActivityInfo info, Configuration curConfig, CompatibilityInfo compatInfo,
            IVoiceInteractor voiceInteractor, int procState, Bundle state,
            PersistableBundle persistentState, List<ResultInfo> pendingResults,
            List<Intent> pendingNewIntents, boolean notResumed, boolean isForward,
            ProfilerInfo profilerInfo)

sendMessage(H.LAUNCH_ACTIVITY, r) 发送一个启动activity的消息 ActivityThread 内部类H处理消息

10. ActivityThread

1. handleLaunchActivity(ActivityClientRecord r, Intent customIntent)
2. performLaunchActivity(ActivityClientRecord r, Intent customIntent)

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();
            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 的attach 、onCreate 
            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);
              //attach会调用activity生命周期 attachBaseContext
  activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        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;
             //接着callActivityOnCreate方法内会调用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;
                if (!r.activity.mFinished) {
                   //performStart会调用activity生命周期 onStart
                    activity.performStart();
                    r.stopped = false;
                }
                if (!r.activity.mFinished) {
                 //callActivityOnRestoreInstanceState会调用activity生命周期 onRestoreInstanceState
                    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);
                    }
                }
                if (!r.activity.mFinished) {
                    activity.mCalled = false;
                    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;
    }

相关文章

网友评论

      本文标题:api_21_Activity的启动流程

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