我爱编程从面试学Android

Activity和Handler

2018-05-29  本文已影响0人  w小强

那么问题来了,在UI线程阻塞时,Activity中的生命周期是怎么执行的?

UI线程启动

我们知道,在Android系统中,ActivityThread就是UI线程,在启动应用程序时,实质上就时调用ActivityThread的main方法。我们直接查看main方法,发现在mian方法中最后调用Looper.loop()。

 public static void main(String[] args) {
      ...
        Looper.prepareMainLooper();

        ActivityThread thread = new ActivityThread();
        thread.attach(false);

        if (sMainThreadHandler == null) {
            sMainThreadHandler = thread.getHandler();
        }
...
        Looper.loop();
    }

Activity方法的调用顺序

  1. 通过Activity的startActivity方法一直向上跟踪:
  mMainThread.sendActivityResult(
                mToken, child.mEmbeddedID, requestCode,
                ar.getResultCode(), ar.getResultData());

我们查看sendActivityResult,发现它其实就是ActivityThread的一个方法。

 public final void scheduleSendResult(IBinder token, List<ResultInfo> results) {
            ResultData res = new ResultData();
            res.token = token;
            res.results = results;
            sendMessage(H.SEND_RESULT, res);
        }

最后实质上,就是通过Handler发送了一个消息。而这个Handler是一个mH对象,我们查看这个mH是什么。

  1. ActivityThread的mH 对象
    final ApplicationThread mAppThread = new ApplicationThread();
    final Looper mLooper = Looper.myLooper();
    final H mH = new H();

那么H对象是什么呢?里面有哪些内容

 private class H extends Handler {
        public static final int LAUNCH_ACTIVITY         = 100;
        public static final int PAUSE_ACTIVITY          = 101;
       ...
        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);
                } break;
...
           }
       }
    }

可以看到,启动Activity时,实质上是通过ActivityThread,也就是我们说的UI线程中的Handler对象,发送了一个Message。
在Handler的回调,接下来的执行顺序是

handleLaunchActivity();//1
performLaunchActivity();//2
 mInstrumentation.callActivityOnCreate()//3
activity.performCreate()//4
  1. Activity 的performCreate源码如下:
final void performCreate(Bundle icicle) {
        restoreHasCurrentPermissionRequest(icicle);
        onCreate(icicle);//执行Activity的OnCreate方法
        mActivityTransitionState.readState(icicle);
        performCreateCommon();
    }

Activity 生命周期和Handler的关系

我们在来查看mH,也就是ActivityThread中的Handler对象。可以看到,定义了一系列的消息,Activity的生命周期都有对应的消息。

so: 所以当UI线程中的MessageQueue对象进入等待时,不会影响到Activity生命周期的执行。因为Activity生命周期本身就是一个个的Message,被添加到UI线程中的MessageQueue中。

上一篇下一篇

猜你喜欢

热点阅读