小白见解1--Activity的启动

看了很多关于Activity的启动流程,有的是从桌面点击图标开始分析的,怎么从Lanucher的startActivity--->ActivityThread的main(),然后再分析main函数中的启动Activity过程。
小白见解就是为了方便记忆,所以着重分析main函数中的过程,至 于前面的过程,精简为:点击了图标就启动了新的进程,找了要启动进程的入口函数main。

ActivityThread main方法主要做了三件事:
1.Looper准备,启动本进程的Looper为收发消息做准备
2.创建ActivityThread实例thread,调用thread.attch(false)方法
3.Looper.loop()开始循环消息队列

小白总结1:从上面的main方法看就是开启消息机制、调用attach方法,鬼知道attach方法到底执行了什么。

要想弄懂怎么启动Activity的还必须看这个attach方法,这个方法干嘛了呢。总结起来就是一句话,获取ActivityManagerService可本地调用的实例,并调用ActivityManagerService的attachApplication(mAppThread)。
具体是怎么获取的呢,attach方法调用ActivityManagerNative.getDefaulet(),这个怎么解释呢,系统服务启动了就在内存注册这个服务的bind描述,交给ServiceManager去处理。等于通过ActivityManagerNative.getDefaulet()最后就得到了ActivityManagerService的bind

小白终结2:attach方法中执行了获取ActivityManagerService的实例对象,并调用这个服务的attachApplication(mAppThread)

这里的mAppThread是一个ApplicationThread对象,这个对象又是用于进程间通信,将这个mAppThread传给ActivityManagerService对象。在ActivityManagerService的attachApplication方法中会回调mAppThread的bindApplication方法。

小白总结3:目前流传走的情况等于是
1.ActivityThread--attach(false)---->
2.ActivityManagerService--attachApplication(mAppThread)---->
3.mAppThread--bindApplication

mAppThread是ActivityThread的内部变量,继承自binder,可理解为ActivityManager的服务端。bindApplication最后会发送消息H.BIND_APPLICATION,mH接收到消息调用handleBindApplication(ActivityThread)。这个方法例,利用放射创建了mInstrumentation对象,Application的app对象,最后调用mInstrumentation的callApplicationOnCreate方法。Instrumentation看出回调Appliction和Activity的周期函数类

小白总结4:现在再来梳理下
1.ActivityThread-->attach(false)
2.ActivityManagerService-->attachApplication(mAppThread)
3.mAppThread-->bindApplication
4.发送消息 接收消息后 ActivityThread-->handleBindApplication
注:反射构建App涉及到LoadedApk类。Instrumentation新建Application并回调onCreate方法。
到此为止Application创建完成。

小白总结5:Application的创建过程,两个attach 两个bind,attche准备绳子,bind转发绑定,handleBind具体绑定。

Application启动了,Activity还会远吗?
上面流程分析的源头是从ActivityThread main--ActivityThread attach--ActvityManagerSerivice attachAppliaction --->ApplicationThread bindApplication
………………
注意:ActivityManagerService的attchApplication并没有执行完,最后会调用
1.mStackSupervisor.attachApplicationLocked(app)
2.realStartActivityLocked
3.app.thread.sheduleLaunchActivity 发消息 LAUNCH_ACTIVITY
4.handleLaunchActivity---performLaunchActivity----Instrumentation.newActivity
----Instrumentation.callActivityOnCreate()

小白总结6:在ActivityManagerService的attachApplication最后会调用 ActivityStackSupervisor 的attachApplicationLocked方法

关于Activity启动几个关键的类有:
1.ActivityThread main出发+内部类ApplicationThread负责与ActivityManagerService进行通信
2.先启动Appliaction后Activity 都是在ActivityManagerService的attachApplication中
3.ApplicationThread发送消息,给ActivityThread的handle进行处理
4.ActivityThread处理不过来就找来Instrumentation,他负责new和回调生命周期方法

5.ActivityStackSupervisor进行Activity的启动,ActivityManagerService的内部对象。

你可能感兴趣的:(小白见解1--Activity的启动)