Activity启动过程(二):(handler接收LANUNCH_ACITIVITY)

本文详细解析了Android中Activity从启动到onResume的整个过程,包括关键步骤如LAUNCH_ACTIVITY消息处理、Activity创建与生命周期回调方法的调用顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ActivityThread中的mH处理LAUNCH_ACTIVITY消息:

  1.                case LAUNCH_ACTIVITY: {
  2.                     Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER"activityStart");
  3.                     final ActivityClientRecord r = (ActivityClientRecordmsg.obj;

  4.                     r.packageInfo = getPackageInfoNoCheck(
  5.                             r.activityInfo.applicationInfo, r.compatInfo);
  6.                     handleLaunchActivity(r, null);
  7.                     Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
  8.                 } break;

handleLaunchActivity调用performLaunchActivity     Activity a =  performLaunchActivity(r,  customIntent);

  1.        Activity activity = null;
  2.         try {
  3.             java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
  4.             activity = mInstrumentation.newActivity(
  5.                     clcomponent.getClassName(), r.intent);
  6.             StrictMode.incrementExpectedActivityCount(activity.getClass());
  7.             r.intent.setExtrasClassLoader(cl);
  8.             r.intent.prepareToEnterProcess();
  9.             if (r.state != null) {
  10.                 r.state.setClassLoader(cl);
  11.             }
  12.         } 

得到activity类对象后,从而可以调用activity生命周期方法,见源码:

  1.            if (activity != null) {
  2.                 Context appContext = createBaseContextForActivity(r, activity);
  3.                 activity.mStartedActivity = false;
  4.                 int theme = r.activityInfo.getThemeResource();
  5.                 if (theme != 0) {
  6.                     activity.setTheme(theme);
  7.                 }
  8.                 activity.mCalled = false;
  9.                 if (r.isPersistable()) {
  10.                     mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
  11.                 } else {
  12.                     mInstrumentation.callActivityOnCreate(activity, r.state);
  13.                 }
  14.                 if (!activity.mCalled) {
  15.                     throw new SuperNotCalledException(
  16.                         "Activity " + r.intent.getComponent().toShortString() +
  17.                         " did not call through to super.onCreate()");
  18.                 }
  19.                 r.activity = activity;
  20.                 r.stopped = true;
  21.                 if (!r.activity.mFinished) {
  22.                     activity.performStart();
  23.                     r.stopped = false;
  24.                 }
  25.                 if (!r.activity.mFinished) {
  26.                     if (r.isPersistable()) {
  27.                         if (r.state != null || r.persistentState != null) {
  28.                             mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,
  29.                                     r.persistentState);
  30.                         }
  31.                     } else if (r.state != null) {
  32.                         mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
  33.                     }
  34.                 }
  35.                 if (!r.activity.mFinished) {
  36.                     activity.mCalled = false;
  37.                     if (r.isPersistable()) {
  38.                         mInstrumentation.callActivityOnPostCreate(activity, r.state,
  39.                                 r.persistentState);
  40.                     } else {
  41.                         mInstrumentation.callActivityOnPostCreate(activity, r.state);
  42.                     }
  43.                     if (!activity.mCalled) {
  44.                         throw new SuperNotCalledException(
  45.                             "Activity " + r.intent.getComponent().toShortString() +
  46.                             " did not call through to super.onPostCreate()");
  47.                     }
  48.                 }
  49.            }
  50.             r.paused = true;
  51.             mActivities.put(r.token, r);

第10-13行,mInstrumentation.callActivityOnCreate()方法,Instrumentation中callActivityOnCreate()方法代码如下,可以看到这里调用到了activity自身的方法performCreate();Activity类中的performCreate()代码如下,可见终于在这里调用到了Activity生命周期中的onCreate()方法。

  1.    public void callActivityOnCreate(Activity activityBundle icicle,
  2.             PersistableBundle persistentState) {
  3.         prePerformCreate(activity);
  4.         activity.performCreate(iciclepersistentState);
  5.         postPerformCreate(activity);
  6.     }

Activity类的performCreate方法代码:

  1.    final void performCreate(Bundle icicle) {
  2.         onCreate(icicle);
  3.         mActivityTransitionState.readState(icicle);
  4.         performCreateCommon();
  5.     }

通过上述代码总结:一个activity启动的时候调用顺序,通过AMS发消息给activityThread,activityThread的Handler对象接收到launch_activity消息后,依次调用ActivityThread.handleLaunchActivity -> ActivityThread.performLaunchActivity ->
Instrumentation.callActivityOnCreate -> Activity.performCreate -> Activity.onCreate。

同理我们看到在第22行调用了activity.performStart; Activity的onStart方法调用和onCreate稍微不同,顺序为
Activity.performStart -> Instrumentation.callActivityOnStart -> Activity.onStart

由此创建了activity,并在该函数末尾return。activity得到之后开始执行onResume

  1.        if (a != null) {
  2.             r.createdConfig = new Configuration(mConfiguration);
  3.             Bundle oldState = r.state;
  4.             handleResumeActivity(r.tokenfalse, r.isForward,
  5.                     !r.activity.mFinished && !r.startsNotResumed);

进而调用  ActivityClientRecord r =  performResumeActivity( tokenclearHide);在performResumeActivity()中通过下列代码
  1.        if (r != null && !r.activity.mFinished) {
  2.             if (clearHide) {
  3.                 r.hideForNow = false;
  4.                 r.activity.mStartedActivity = false;
  5.             }
  6.             try {
  7.                 r.activity.onStateNotSaved();
  8.                 r.activity.mFragments.noteStateNotSaved();
  9.                 if (r.pendingIntents != null) {
  10.                     deliverNewIntents(r, r.pendingIntents);
  11.                     r.pendingIntents = null;
  12.                 }
  13.                 if (r.pendingResults != null) {
  14.                     deliverResults(r, r.pendingResults);
  15.                     r.pendingResults = null;
  16.                 }
  17.                 r.activity.performResume();
调用到activity自身的performResume方法; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值