##概述:
从应用的启动流程来看,Activity只是一段程序的代码,它既不是程序的入口,也不是程序的必要流程.只是程序运行中的一个场景,一个组件.是基于Context扩展了特定功能接口的一个前台运行的场景.
AMS通过ApplicationThread的引用代理,远程调用ApplicationThread的服务端,并通过ApplicationThread的服务端发送消息给应用程序主线程从而控制Activity的函数调用(即生命周期).
Android属于多进程单窗口系统,只允许当个窗口位于前台,在下一个Activity启动之前,上一个Activity需要先Pause以失去焦点
Activty的生命周期:
Activity 的整个生命周期在三个嵌套循环中:
Activity 的整个生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。您的 Activity 应在 onCreate() 中执行“全局”状态设置(例如定义布局),并释放 onDestroy() 中的所有其余资源。
例如,如果您的 Activity 有一个在后台运行的线程,用于从网络上下载数据,它可能会在 onCreate() 中创建该线程,然后在 onDestroy() 中停止该线程。
*
Activity 的可见生命周期发生在 onStart() 调用与 onStop() 调用之间。在这段时间,用户可以在屏幕上看到 Activity
例如,当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用 onStop()。您可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。 例如,您可以在 onStart() 中注册一个 BroadcastReceiver 以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在 onStop() 中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用 onStart() 和 onStop()。
Activity 的前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。 Activity 可频繁转入和转出前台
例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()。 由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。
启动Activity时的配置:
taskAffinity属性
默认情况下,一个应用程序中的所有activity都有一个affinity,它们属于同一个Task。
每个activity可以通过中的taskAffinity属性设置单独的affinity。
不同应用程序中的activity可以共享同一个affinity。
同一个应用程序中的不同activity也可以设置成不同的affinity。
affinity属性在2种情况下起作用:
启动activity的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记。
启动activity的allowTaskReparenting被设置成true。
Activity启动模式launchMode属性有四种值:
(需要注意的是同一个应用不同Activity可以在不同栈中,不同应用Activity也可以在相同栈中,栈是相对AMS而言,不是应用程序)
standard、singleTop、singleTask和singleInstance。
standard(标准模式):默认模式,可省略。在这种启动模式下,都会默认创建一个新的实例。因此,这种模式允许多个重复Activity叠加。
singleTop(栈顶复用):这种模式允许有多个实例,但不允许多个重复Activity叠加。如果Activity位于栈顶,不会创建新的实例,而会调用onNewIntent()方法。
singleTask(栈内复用):这种模式只有一个实例。在同一应用程序中启动时,若Activity不存在则在当前Task创建一个新的实例,若Activity存在则将Task中在其之上的其它Activity销毁,并调用此Activity的onNewIntent()方法。
singleInstance(全局单例):这种模式只有一个实例,并且该实例独立运行在一个Task中。这个Task只有该实例,不允许其它Activity存在。如果B应用同样启动当前Activity那么将会复用原有实例
Activity的启动流程(Framework版):
从调用StartActivity开始,一般情况都是有正在运行的Activity所以需要先暂停当前正在前台的Activity,
暂停完毕,会给Ams发送一个Binder消息completePause(),在该函数中,由于上一个Activity并没有finish.仅仅是stoping,所以会把上一个Activity添加到mStopingActivites列表中
当目标Activity启动之后依次执行attach,onCreate,onStart,onResume,在performResumeActivity()之后,通过向主进程的Looper中添加IdelHandle,当主进程MessageQueue消息为空时,向Ams发送一个请求进行内存清理的消息.这会导致Ams在内部调用activityIdleInternal()方法,该方法首先会处理mStopingActivites列表中的Activity对象,这里会调用到StopActivityLocked()方法,这会使得Ams依次通知Activty执行onStop和onDestory方法,并在最后执行trimApplication施放内存