微信号:xuejie_mobile

介绍:我是程序媛学姐,伪90后.在这里和大家交流互联网技术和产品相关的信息,欢迎一起讨论.

[Android四大组件]Activity启动过程源码分析

2016-03-13 00:18 某学姐

Activity应该是大家再熟悉不过的了。从刚开始搭建Android开发环境,跑的第一个例子Hello World就用到了Activity。再后来会接触到Activity的生命周期,想当初学姐这几个生命周期顺序经常会记错💔,再后来就是广泛使用FragmentActivityFragment了。

平常开发中以上这些资料Baidu一大堆,还轮不到Google劳神。然而熟练运用这些顶多也就是一个Coder搬砖熟练工而已,算不上Engineer吧~

本文从就从Activity的源码角度分析其启动过程。

1.Activity几个重要类:

(1)Activity

An activity is a single, focused thing that the user can do. Almost all activities interact with the user, so the Activity class takes care of creating a window for you in which you can place your UI with {@link #setContentView}.

Activity是一件单一的、需要注意力的事情。通常用来和用户打交道,为用户创建一个窗口来放置UI。

(2)Instrumentation

用于执行具体操作的类,辅助Activity的监控和测试。

(3)ActivityManagerNative、ActivityManagerProxy、IActivityManager

我理解是,提供给用户进程,用来与system_process进程的ActivityManagerService打交道的一些类。

(4)ApplicationThread、ApplicationThreadNative、IApplicationThread

我理解是,ActivityManagerService用来与用户进程打交道的一些类,最终会回调到用户进程。

2.关系梳理:


ActivityManager是用户进程中对应用层开放的类,应用层要完成某项操作,最终都是由system_process进程的ActivityManagerService来实现。即ActivityManager需要和ActivityManagerService进行跨进程通信。Android中IPC通过Binder机制实现。ActivityManagerService继承于ActivityManagerNative,而ActivityManagerNative实现IBinderIActivityManager接口,一方面具有IActivityManager的功能,另一方面作为一个Binder实例可以进行IPC操作。ActivityManagerProxy的作用是作为ActivityManagerService的一个代理,将ActivityManagerActivityManagerService解耦合,它也继承IActivityManager,这就是典型的代理模式的用法,代理者和被代理者继承相同的接口完成操作,从而client端不知道具体操作是由代理者还是被代理者完成。

Activity启动过程中,startActivity操作是先通过ActivityManagerNative去拿到ActivityManagerService的实例,然后将ActivityManagerService实例用ActivityManagerProxy进行包装,提供给调用者,真正执行startActivity操作的还是ActivityManagerService,即mRemote。然后用户进程通过Binder方式向ActivityManagerService请求Launch操作,ActivityManagerService调用远端的startActivity()执行操作,最终会调到ApplicationThreadscheduleLaunchActivity(),然后回传到应用层,继而启动ActivityonCreate()onStart(), onResume()等方法。ApplicationThreadActivityThread的内部类。

下图是ApplicationThread的关系图:


3.调用流程:

篇幅有限,代码段已略去,大家可以到我博客去看。

(1)执行ActivitystartActivity()方法

当我们从Activity A启动Activity B时,调用A的startActivity ,最终走到startActivityForResult。若A没有父Activity,则执行mInstrumentation.execStartActivity()得到一个结果,然后通过调用mMainThread.sendActivityResult()将返回结果回传给A,最终会根据requestCode的情况可能走到A的onActivityResult();若A是ActivityGroup中的子Activity,则调用mParent.startActivityFromChild(),逻辑和普通情况一样,只不过在父Activity中调用。

(2)执行InstrumentationexecStartActivity()方法

最终调用的是ActivityManagerNative.getDefault().startActivity()。下面继续看ActivityManagerNative。

(3)执行ActivityManagerProxystartActivity()方法

由以上代码可知,ActivityManagerNative.getDefault().startActivity()最终会调用ActivityManagerProxy的startActivity()。然后通过Binder进程间通信机制,发起START_ACTIVITY_TRANSACTION事务,并将Intent等信息序列化传给远程服务ActivityManagerService。远程服务接收到消息后,将Binder传过来的数据反序列化,并执行相关Activity启动操作。

(4)执行ActivityManagerServicestartActivity方法

ActivityManagerService的startActivity启动过程又转移到mStackSupervisor.startActivityMayWait函数了。而mStackSupervisor是ActivityStackSupervisor类的对象。ActivityStackSupervisor的startActivityMayWait函数源码较长,简单总结起来流程如下:

startActivityMayWait()->startActivityLocked()->startActivityUncheckedLocked()->startSpecificActivityLocked()->realStartActivityLocked()

在realStartActivityLocked()方法里又调用了如下代码:

(5)执行ApplicationThreadNativescheduleLaunchActivity()方法

这一步我的理解是,远端服务ActivityManagerService会告诉ApplicationThreadNative,我要启动Activity了,你帮我启动一下。然后ApplicationThreadNative会调用scheduleLaunchActivity()方法,这一步也是通过Binder进程间通信机制向远端服务发送一个SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION事务,远端服务收到之后最终会回调到ApplicationThread的scheduleLaunchActivity()方法。

(6)执行ApplicationThreadscheduleLaunchActivity()方法。

在ApplicationThread的scheduleLaunchActivity()中,会调用sendMessage(H.LAUNCH_ACTIVITY, r),Handler收到消息后调用handleLaunchActivity(r, null),真正启动Activity B时,和Activity B相关的一系列操作都在这个方法里。这个方法在正常情况下依次执行了handleConfigurationChanged(null, null),performLaunchActivity(),handleResumeActivity(),分别是Activity B屏幕方向变化和启动的方法。

这里暂时以performLaunchActivity()方法为例。通过反射机制构造一个Activity的实例,然后依次调用activity.attach()添加上下文等信息,activity.setTheme(theme)设置主题,接着由Instrumentation执行mInstrumentation.callActivityOnCreate(),mInstrumentation.callActivityOnRestoreInstanceState(),mInstrumentation.callActivityOnPostCreate()这些方法。

(7)执行InstrumentationcallActivityOnCreate()方法,最终走到Activity的activity.performCreate()方法。

(8)执行ActivityperformCreate()方法,最终回调到了ActivityonCreate()方法,这就是我们非常熟悉的Activity生命周期方法。

总结

(1)以上只是以Launch Activity为例做了下分析,实际上Activity的其它操作如finish()和结果回传都是类似的流程走向。大家可以对照源码读读。

(2)重点是文章开头几个类的相互关系。涉及到了Proxy代理模式,IPC进程间通信等知识点。

(3)才疏学浅,如有分析不到位的还请指正。

参考链接

1.http://blog.csdn.net/caowenbin/article/details/6036726

2.http://ju.outofmemory.cn/entry/230403

3.http://blog.csdn.net/stonecao/article/details/6579710

 
学姐的IT专栏 更多文章 jcenter vs. mavenCentral 关于Android Studio项目的Gradle构建 TraceView性能优化工具使用 RecyclerView源码分析 Some Books from FB
猜您喜欢 Google DeepMind团队公布玩游戏比人厉害的AI如何做出 我搭台你来秀 互联网大会白鹭开放日邀你来High 圣诞快乐! 【技术蛋糕】如何在 TDD 上浪费时间 屌炸天的程序员:吸过毒、卖过杀毒软件,现在还要竞选美国总统!