android Activity的启动过程(分析讲解)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wk_beicai/article/details/78908088
1.1 activity:是一种展示型组件,直接向用户展示一个界面,是与用户进行信息交互的,
对用户来说,activity就是一个android应用的全部,其他三个组件对用户来说是不可
感知的,activity的启动由intent触发,Intent分为显式Intent和隐式Intent,显式可以明确的
指向一个activity组件,隐式Intent则指向一个或者多个目标activity组件,activity可以具有特定的
启动模式,

2.1 activity的工作过程;
启动
activity通过显式的Intent来启动一个Activity;

startActivity方法:

最终会调用startActivityForResult()方法;
引出问题:为什么调用startActivityForResult可以在activity中回调onActivityResult而调用start
Activity则不可以?
区别是调用startActivity内部调用startActivityForResult传递requestCode值为-1,

通过此代码判断调用startActivityForResult的时候只能requestCode大于等于0,onActivityresult才会被回调;
startActivityForResult方法:

截取部分代码:
mParent代表activityGroup,用来在一个界面中嵌套多个子Activity,但是在API 13就被作废了,采用Fragment来代替ActivityGroup,
execStartActivity()方法:

抽取部分源码:
启动Activty真正的实现由ActivityManagerNative.getDefault()的startActivity方法完成,
ActivityManagerService(AMS)继承自ActivtyManagerNative,而activityManagerNative继承自
Binder并实现IactivityManager这个Binder接口,因此AMS也是一个Binder,它是IactivityManager的具体实现,
checkStartActivtyResult()方法
通过源码可知,它是检查启动activity的结果,当无法正确的启动一个activity时,这个方法
抛出异常。


AMS的startActivity方法分析:
ActivityStackSupervior的startActivityMayWait方法---startActivityLocked()-----
--startActivityUncheckedLocked()--调用ActivityStack的resumeTopActivitiesLocked
这个启动过程已经从ActivityStackSupervisor转移到ActivityStack

ActivtyStack的resumeTopActivitiesLocked方法的实现

通过源码知道resumeTopActivityLocked调用resumeTopActivityInnerLocked方法,
这个方法又调用ActivityStackSupervisor的startSpecificActivityLocked方法

startSpecificActivityLocked源码:

通过源码可知,startSpecificActivityLocked方法调用realStartActivityLocked方法

在ActivityStackSupervisor的realStartActivityLocked方法有一段代码:

这段代码很重要,app.thread的类型为IApplicationThread,

它继承IInterface接口,所以他是一个Binder类型接口,从声明中可以看出,内部包涵大量启动,
停止Activity的接口,
IApplicationThread的实现者是ActivityThread的内部类ApplicationThread,

Activity的启动过程最终回到ApplicationThread中,ApplicationThread通过scheduleLaunchActivity
方法启动Activity:

在ApplicationThread中,scheduleLaunchActivity的实现很简单,就是发送一个启动Activity的消息
交由Handler处理,通过H。sendMessage发送一个消息给H处理,
通过Handler对“LAUNCH_ACTIVITY”这个消息处理可知Activity的启动过程由ActivityThread的
handleLaunchActivity方法实现。

通过上面的源码可知,perfromLaunchActivity方法最终完成了Activity对象的创建和启动过程。
并且ActivityThread通过handleResumeActivirty,这个方法调用被启动Activity的onResume这个生命周期。
performLaunchActivity这个方法完成如下几件事。
1)从activityClientRecord中获取待启动的activity组件
2)通过instrumentation的newActivity方法使用类加载器创建activity对象
3)通过LoadedAPK的makeApplication方法尝试创建Application对象
4)创建Contextimpl对象并通过Activity的attach方法来完成一些重要数据初始化
5)调用Activity的onCreate方法

3.1主要对象功能介绍
1)AMS: Activity管理的服务类,用于管理Activity的各种行为的,
2)ApplicationThread:实现Bindler接口,客户端与AMS的通信接口,是ActivityThread的内部类,
有效的把AMS和Actvity绑定在一起,
3)ActivtyThread,它是应用程序的入口,当AMS拉起一个进程,同时启动一个主线程时,他会初始化一些对象,然后进入消息等待队列,等待别人给他发消息,然后执行这个消息
它是Activity的管理类,由它决定什么时候调用onCreate(),等方法
4)instrumentation :是actvity管理中实际做事的人,(d调用这个类,然后调用到AMS,通过ApplicationThread去访问AMS);




猜你喜欢

转载自blog.csdn.net/wk_beicai/article/details/78908088