android源码--activity启动源码分析

https://blog.csdn.net/u012267215/article/details/91406211

一、当在手机屏幕上点击app的图标的时候,此时手机屏幕就是Activity,而这个actiity所在的app就是称为launcher。Launcher是各个厂商提供的。
而Launcher为每个app的图标提供了启动这个app的所需要的intent的信息,
action:android.intent.action.MAIN
category:android.intent.category.LAUNCHER
cmp:包名+activity名

Launcher和图标所代表的的app是在两个进程,它们之间的通信就是通过Binder完成,这时候需要AMS。

整体流程:
①Launcher通知AMS,要启动app
②Launcher得到通知后,并记录要启动的app的首页。
③Launcher进入paused状态,然后通知AMS
④AMS检查app是否已经启动了,如果是,那么就进行唤起,否则就启动一个新进程,在新进程中创建ActivityThread对象,启动其中的main()方法。
⑤app启动成功后,就通知AMS。
⑥AMS会找到之前记录的要启动的页面,通知app要启动哪个。
⑦app启动首页,创建Context和首页的Activity关联,调用首页Activity的onCreate函数。

源码中遇到的关键类:
Instrumentation: 仪表盘
ActivityThread
H:就是handler
LoadedApk
AMS
ActivityManagerNative和ActivityManagerProxy
ApplicationThread和ApplicationThreadProxy

二、源码分析
Launcher启动app的时候,也是调用的startActivty()方法,最终调用的是startActivtyForResult()方法。
这里是用instrumentation调用的execStartActivity(),这里有个很重要的参数getApplicationThread()就是获取的主线程,它在app启动的时候就创建了,代表了App应用程序。Application就是ActivtyThread的上下文。
mToken也是一个Binder对象,表示Launcher这个activity也通过Instrumentation传递给了AMS。以后AMS想通知Launcher也是他通过这两个参数。
在这里插入图片描述

在Instrumentation中的execStartActivity方法,这样就将activity的数据传递给了ActivityManager。
在这里插入图片描述

1.app应用的真正入口是ActivityThread类中的main()方法。
这里写图片描述
2.调用Looper.prepareMainLooper()方法。
这里写图片描述
3.调用prepare(false)方法,这里的threadLocal其实就是一个map集合。这样新创建了一个Looper对象,添加到集合中。
这里写图片描述
在Looper的构造器中,初始化了消息队列并且获取当前的线程
这里写图片描述
4.调用myLooper()方法,将存储在集合中的Looper对象取出来
这里写图片描述
5.在ActivityThread类中的main()方法中创建了ActivityThread的对象后调用attach()方法,这里传递的参数system是false,因此只查看非系统的部分。
这里写图片描述
这里写图片描述
这里写图片描述

6.在这里的ActivityManagerNative类中,才是真正的管理Activity、Service等的地方,在这里有startActivity() startSerVice()等等的方法。在ActivityManagerNative.getDefault()方法中返回的是ActivityManagerService()类。
这里写图片描述
7.在调用ActivityManagerService中的attachApplication()方法
这里写图片描述

8.在调用attachApplicationLocked()方法中,其中重要方法为bindApplication(),主要是进行绑定给thread数据
这里写图片描述
9.在StackSupervisor类中,调用attachApplicationLocked()方法,并且调用readlStartActivityLocked()方法,进行真正的启动activity
这里写图片描述
10.在realStartActivityLocked()方法中进行启动activity
这里写图片描述

11.调用在ActivityThread中的scheduleLaunchActivity()方法。
这里写图片描述
12.在handler H中
这里写图片描述
这里写图片描述

13.在performLauchAcitivity()方法中处理具体的Activity的启动逻辑,在这里创建了Activity的对象,并且调用了oncreate()方法
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
14.调用Instrumentation类中的Activity的onCreate()方法
这里写图片描述
这里写图片描述

对于同一个app内的activity的创建,和App的启动流程基本一致。因为不需要重新创建进程,所以在这里有些不同。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值