Activity工作过程源码分析

Activity是Android四大组件之一,它作为一个展示型的组件,在Android世界里起到了重要作用。它可以与用户交互,将用户信息反馈给后台,可以说,用户每天面对的app界面都是由activity制作的。作为一个不想当咸鱼的程序员,只了解activity的生命周期,启动模式是不够的,还需要更加深入的了解,那么问题来了,作为Android四大组件之一,它是如何启动的呢? 那么这篇文章,我将从源码的角度入手,与大家一起分析,activity到底是怎么启动的。(ps:源码为android25,与低版本部分有出入,如果有那些地方出现错误,请各位大佬指出)
先图为敬(哇图太小了,大家打开新标签看吧,调了很久,图片只能这么大了):

入口

回想一下,我们启动activity时一般都会调用的startActivity方法,虽然有很多重载方法,但是最终都会调用startActivityForResult方法.
startActivityForResult
可以看到其中调用到了Instrumentation的execStartActivity方法,Instrumentation类主要用来跟踪Application和Activity生命周期,平常不容易见到。其中execStartActivity中传入了一个参数是mMainThread.getApplicationthread(),这传入的是主线程ActivityThread中的内部类ApplicationThread.
那么我们再来看一下Instrumentation中的execStartActivity方法。
这里写图片描述

execStartActivity中调用了ActivityManagerNative.getDefault()这其实是一个使用单例模式返回的一个AMS类,所以这其实是一个AMS.所以,Activity的启动过程最终又到达了AMS
这里写图片描述
AMS中调用startActivityAsUser
这里写图片描述

这里接着会调用ActivityStarter中的startActivityMayWait,ActivityStarter主要功能就是用来启动Activity的。
startActivityMayWait中主要获取启动Activity信息,
这里写图片描述

并且调用startActivityLocked 继续启动Activity
这里写图片描述
如果需要返回result ,则等待应用进程中Activity的启动完成。
这里写图片描述

接着我们看startActivityLocked,有点长,我们分开看看。
获取进程有关信息
这里写图片描述
检查调用者权限以及Intent防火墙是否屏蔽了该Intent
这里写图片描述
检查是否经常切换进程
这里写图片描述

startActivityLocked方法首先进行各种错误检查,接着检查调用者的权限,以及Intent防火墙是否屏蔽该Intent,完成所有检查后,创建一个ActivityRecord对象,并调用getFocusedStack()方法来得到当前具有输入焦点的ActivityStack.接下来检查启动Activity是否会引进进程切换,如果需要切换 ,还要检查Android系统是否允许切换,如果不允许切换,只能把需要启动的Activity的信息保存在mPendingActivityLaunches变量中,然后返回。如果允许进程切换,这时要调用doPendingAcitivyLaunchesLocked方法先处理所有pending状态的Activity,然后再调用startActivityUnchecked()方法继续处理当前Activity
startActivityUncheckedLocked方法的代码非常长,主要是判断Intent的标志和Activity的属性来确定activity的task,对于处理细节我们就不分析了,方法中找到包含Activity的task后,调用startActivityLocked方法继续启动
这里写图片描述
ActivityStack类的startActivityLocked方法相对比较简单,就是将ActivityRecord对象加入到Task的顶部,同时把Task也放到mHistoryStack列表的顶部。方法的最后通过mStackSupervisor对象的resumeTopActivitiesLocked方法显示位于Task栈顶的Activity.resumeTopActivitiesLocked()是AmS中很多地方都会调用的方法,主要作用是将位于栈顶的Activity显示出来,这时,当前的Activity还显示在屏幕上,最终会调用resumetopActivityInnerLocked();
这里写图片描述
next表示要启动的Activity 如果next==null表示但当前Task没有Activity,显示Home Activity.如果Activity所在的应用已经启动,这里将会调用应用进程的scheduleResumeActivity方法,最终会导致应用中Activity对象的onResume()方法执行。如果应用还没有启动,或者刚启动,则调用startSpecificsActivityLocked()方法继续处理。startSpecificActivityLocked方法中如果发现应用进程没有启动,则调用startProcessLocked()方法来启动进程,否则调用realstartActivityLocked方法继续执行,realstartActivity方法中调用了应用进程中的scheduleLaunchActivity();scheduleLaucnchActivity中会调用Activity类的onCreate方法。

ActivityStackSupervisor.startSpecificActivityLocked方法
这里写图片描述
ActivityStackSupervisor.reakStartActivityLocked()方法调用主线程的scheduleLaunchActivity.
这里写图片描述
ActivityThread.ApplicationThread.scheduleLaunchActivity发送message给主线程中的H.handler,
这里写图片描述

H.handler处理 调用到主线程中handlerlaunchActivity
这里写图片描述

主线程的performLaunchActivity完成了Activity对象的创建和启动过程

这里写图片描述

performLaunchActivity主要完成了以下几件事
1.从ActivityClientRecord中获取待启动的Activity的组件信息
这里写图片描述
2.通过Instrumentation的newActivity方法使用类加载器创建Activity对象
这里写图片描述

3.通过LoadedApk的makeApplication方法来尝试创建Application对象
这里写图片描述
如果Application已经被创建过了,就不会重复创建了。

4.创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化。
这里写图片描述
5.调用Activity的onCreate
这里写图片描述
那么 Activity的启动过程我们就分析完了.

总结:
1.startActivityForResult会调用Instrumentation的execStartActivity方法,Instrumentation的execStartActivity方法会调用AMS的startActivity方法,工作重心转移到AMS
2.调用AMS的 ActivityStarter的startActivityAsUser->startActivityMayWait->startActivityLocked(错误检查,权限检查,intent屏蔽,是否允许进程切换) ->startActivityUncheckedLocked(主要是判断Intent的标志和Activity的属性来确定activity的task)工作重点在AMS的 ActivityStarter类
3.startActivityUncheckedLocked->ActivityStack.startActivityLocked->ActivityStack.resumetopActivityInnerLocked->如果Activity所在的应用已经启动,将会调用应用进程的scheduleResumeActivity方法,最终会导致应用中Activity对象的onResume()方法执行。如果应用还没有启动,或者刚启动,则调用startSpecificsActivityLocked()方法继续处理。工作中心ActivityStack
4.startSpecificsActivityLocked->reakStartActivityLocked中调用主线程AppilicationThread中的handlerlaunchActivity。 工作中心 ActivityStackSupervisor
5.主线程中的AppilicationThread的scheduleLaunchActivity发送信息给H.handler,hanler处理信息调用到主线程中handlerlaunchActivity-》performLaunchActivity完成创建Activity工作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值