- 系统内部是如何启动一个Activity?
- 新的Activity对象是在何时创建?
- Activity的onCreate在何时被回调?
当我们需要创建一个Activity时,也许知识一句onCreate就完事了,也是没有想过这一过程系统为我们做了哪些事。
复习
当我们使用AIDL进行IPC时系统会为我们自动生成一个相应的类,这个类首先继承了IInterface,其内部有两个子类第一个子类为Stub此类是一个抽象类,继承了Binder并且实现了其父类接口;另一个类为Proxy类;Binder总是运行在创建它的进程/线程中,当我们通过Binder进行RMI的时候,如果当前线程和Binder再同一个进程/线程,则返回的是Stub内部类的实例,当我们跨进程/线程时则返回的时Proxy内部类的实例。
为什么要复习呢
我们运行是的主线程UI线程,Main thread,其是ActivityThread的一个实例,其内部有个类ApplicationThread(app.thread),此类是ApplicationThreadNative的实例,而ApplicationThreadNative实现了IApplicationThread接口,并且继承了Binder,IApplicationThread继承自IInterface,怎么样是不是和AIDL很像。
我认为,Activity的创建就是一次RMI的过程。
当我们要创建Activity时,不管是通过startActivity还是其他方法,最终都会调用startActivityForResult这个方法,在此方法中将所需数据保存在Instrumentation这个类中,再通过这个类调用其方法;在Instrumentation中会调用ActivityManagerService的方法,AMS会调用ActivityStackSupervisor的方法,之后又会调用ApplicationThread的scheduleLaunchActivity方法,ApplicationThread通过H(一个ActivityThread的Handler)发送信息,handleMessage会调用ActivityThread的handleLaunchActivity,之后调用performLaunchActivity,这个方法就是我们要找的那个方法。
在此方法中,从Instrumentation提取信息,进行一些初始化,之后创建ContentImpl完成与Activity的绑定,之后与Window进行绑定,最后回调onCreate方法。