安卓 FrameWork阅读之:ActivityThread作用

首先我们分析一个app的启动过程,我们通过eclipse中debug来查看app启动时的调用栈信息,下面是截图:
安卓 FrameWork阅读之:ActivityThread作用_第1张图片
我们看到,主线程的调用栈信息,我在mainActivity中的onCreate方法上打的断点,主线程停在了我的onCreate()方法,那么我们来分析分析app的启动过程,主线程先是调用ZygoteInit类的main(String[])方法,对就java属性的同学是不是特别属性,这个不就是java程序的入口么,其实App就是一个跑在linux系统上的,java程序,他用的虚拟机就是谷歌重写的JVM,谷歌叫它Dalvik。我们知道ZygoteInit类是在Zygote进程创建当前进程后,对被创建的进程初始化,然后来到倒数第四行,ActivityThread.mian(String[]),这是我们今天的主角,
我们来分析分析它的作用。

1、通过源码分析,我可以知道ActivityThread.mian(String[])是被
ZygoteInit启动的,我们来ActivityThread.mian(String[])中看看:

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

        /**
        * 创建我们常说的MainThread的消息循环队列
        */
        Looper.prepareMainLooper();

        /**
        *  初始化我们的主角ActivityThread 
        */
        ActivityThread thread = new ActivityThread();
        /*
         *这个方法是将我们的ActivityThread连接到,我们MainThread
         *它里面都做啥呢,我们在下面来分析分析
         */
        thread.attach(false);

        if (sMainThreadHandler == null) {
            //这个handler非常重要,他是控制我们四大组件还有我们在ui线程中操作的关键,所有的主线中执行的动作,全是有它来控制的,谁要持有了它,就可以控制我们的app所有的动作了。

            sMainThreadHandler = thread.getHandler();
        }

        AsyncTask.init();

        ....
        Looper.loop();

        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

我们分析分析attach方法,看看它都做了啥?

    private void attach(boolean system) {
        sCurrentActivityThread = this;


            ...

                Application app = Instrumentation.newApplication(Application.class, context);
                mAllApplications.add(app);
                mInitialApplication = app;
                app.onCreate();
           .....
    }

大家看到上面代码熟不熟熟悉呢,attach方法将我们app的Application通过反射出事化了(通过我们的AndroidManifest.xml文件中我们写的 application标签下的name属性提供的类的名称来反射出来并实例化),
并且调用了它的onCreate方法,就是我们app的onCreate声明周期方法

下面我们来看看Looper.loop();这个方法的作用,这个可以说我们的app的关键,我们app的所有循环操作,都是在这个while(true)循环中。
Looper.loop();代码我们就不细看,他就是一个while(true)循环,在循环中,我们有一个MessageQueue对象mQueue,在while循环中我们会不断判断是否有元素,有的化,我们就取出来执行了(消费掉),向mQueue里面的填充message元素是我们在当前线程中定义的Handler,当我们调用new 一个handler的时候,就会把当前线程的mQueue交给它,当我们调用handdler的一系列的sendMessage方法的时候,就是往mQueue中填充元素,供当前的while循环消费。所以说,当我们使用
Looper.prepare()方法的时候:

 public static void prepare() {
        if (sThreadLocal.get() != null) {
            throw new RuntimeException("Only one Looper may be created per thread");
        }
        sThreadLocal.set(new Looper());
    }

就是给当前线程注册一个Looper对象,同时就是创建了一个mQueue,
当我们调用Loop.loop(),就是开启一个while循环,然后,当前线程就进入了一个死循环,在while循环中执行Hander送来的Message对象

我们了解了Looper.loop()方法,那么在这里出现的loop()啥作用呢,
我们的线程到这里就进入死循环,那么下面还怎么执行啊,我们接着看。

大家看thread.getHandler();,这个hander中有啥:

 private class H extends Handler {
        public static final int LAUNCH_ACTIVITY         = 100;
        public static final int PAUSE_ACTIVITY          = 101;
        public static final int PAUSE_ACTIVITY_FINISHING= 102;
        public static final int STOP_ACTIVITY_SHOW      = 103;
        public static final int STOP_ACTIVITY_HIDE      = 104;
        public static final int SHOW_WINDOW             = 105;
        public static final int HIDE_WINDOW             = 106;
        public static final int RESUME_ACTIVITY         = 107;
        public static final int SEND_RESULT             = 108;
        public static final int DESTROY_ACTIVITY        = 109;
        public static final int BIND_APPLICATION        = 110;
        public static final int EXIT_APPLICATION        = 111;
        public static final int NEW_INTENT              = 112;
        public static final int RECEIVER                = 113;
        public static final int CREATE_SERVICE          = 114;
        public static final int SERVICE_ARGS            = 115;
        public static final int STOP_SERVICE            = 116;
        public static final int REQUEST_THUMBNAIL       = 117;
        public static final int CONFIGURATION_CHANGED   = 118;
        public static final int CLEAN_UP_CONTEXT        = 119;
        ....
        下面代码比较多,我就不一一写了

看到这里大家应该知道了,我们的acivity service组件,的开启,关闭,都是被它控制,也是我们整个儿Ui线程中的操作,全部都在这个Handler里了。

你可能感兴趣的:(安卓基础)