四大组件Activity的工作过程

由于Android系统内部对Activity做了封装,使得调用很方便,而且显式调用只要两行代码就能搞定:

Intent intent = new Intent(this, OtherActivity.class);
startActivity(intent);


尽管Activity内部的具体实现很复杂,但是掌握一个大概的流程还是必要的,具体如下:


1、startActivity有好几种重载方式,但是最终都会调用startActivityForResult()

startActivityForResult()内部调用Instrumentation的execStartActivity()

2、execStartActivity()调用ActivityManagerNative.getDefault().startActivity()

ActivityManagerNative继承Binder并实现了IActivityManager接口,而ActivityManagerService继承了ActivityManagerNative,所以ActivityManagerNative.getDefault()获取的就是ActivityManagerService对象,用来启动Activity。

3、startActivity()中调用ActivityStackSupervisor.startActivityWait()

startActivityWait()内部调用startActivityLocked()->startActivityLocked()->startActivityUncheckedLocked()->ActivityStack的resumeTopActivityLocked()

4、resumeTopActivityLocked()调用resumeTopActivityInnerLocked()

内部调用ActivityStackSupervisor的startSpecificActivityLocked(),startSpecificActivityLocked()内部调用realStartActivityLocked()

5、realStartActivityLocked()调用app.thread.scheduleLaunchActivity()

app.thread就是ApplicationThread,ApplicationThread继承了ApplicationThreadNative,而ApplicationThreadNative继承了Binder并实现了IApplicationThread接口,scheduleLaunchActivity()内部使用Handler来处理消息。

6、Handler接收到LAUNCH_ACTIVITY这个消息后,调用handleLaunchActivity(),然后内部调用performLaunchActivity()

performLaunchActivity()完成的任务:
  • 1)从ActivityClientRecord中获取待启动的Activity的组件信息
  • 2)通过Instrumentation的newActivity()使用类加载器创建Activity对象
  • 3)通过LoadedApk的makeApplication()来创建Application对象:
Application创建完毕后,系统会通过Instrumentation的callApplicationOnCreate方法来调用Application的onCreate方法。
  • 4)创建ContextImpl对象并通过Activity的attach()来完成一些重要数据的初始化:
ContextImpl通过Activity的attach方法来和Activity建立关联,而且在attach方法中,Activity还会完成Window的创建并建立自己和Window的关联。
  • 5)调用Activity的onCreate():
由于Activity的onCreate()已经被调用,这也意味着Activity完成了启动过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值