概要
1.Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service,Content Provider,BroadcastReceiver)之一
2.Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务
3.Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件
4.在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信
状态
在android 中,Activity 拥有四种基本状态:
1.Active/Running
一个新 Activity 启动入栈后,它显示在屏幕最前端,处理是处于栈的最顶端(Activity栈顶)
此时它处于可见并可和用户交互的激活状态,叫做活动状态或者运行状态(active or running)
2. Paused
当 Activity失去焦点, 被一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶
此时的状态叫做暂停状态(Paused)。此时它依然与窗口管理器保持连接,
Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接)
但是在系统内存极端低下的时候将被强行终止掉。所以它仍然可见,但已经失去了焦点故不可与用户进行交互
3. Stopped
如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)
它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏
当系统内存需要被用在其他地方的时候,Stopped的Activity将被强行终止掉
4. Killed
如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除
Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接终止它的进程
当该Activity再次显示给用户时,它必须重新开始和重置前面的状态
状态转换
Activity在四种基本状态之间的转换如下图所示:
如上所示,Android 程序员可以决定一个 Activity 的“生”,但不能决定它的“死”,
也就是说程序员可以启动一个 Activity,但是却不能手动的“结束”一个 Activity。
当你调用 Activity.finish()方法时,结果和用户按下 BACK 键一样:
告诉 Activity Manager 该 Activity 实例完成了相应的工作,可以被“回收”。
随后 Activity Manager 激活处于栈第二层的 Activity 并重新入栈,
同时原 Activity 被压入到栈的第二层,从 Active 状态转到 Paused 状态。
例如:从 Activity1 中启动了 Activity2,则当前处于栈顶端的是 Activity2,
第二层是 Activity1,当我们调用 Activity2.finish()方法时,
Activity Manager 重新激活 Activity1 并入栈,
Activity2 从 Active 状态转换 Stoped 状态,
Activity1. onActivityResult(int requestCode, int resultCode, Intent data)方法被执行,
Activity2 返回的数据通过data参数返回给 Activity1
Activity栈
Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。
处于前台的 Activity 总是在栈的顶端,当前台的 Activity 因为异常或其它原因被销毁时,
处于栈第二层的 Activity 将被激活,上浮到栈顶。当新的 Activity 启动入栈时,
原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换。
Activity 的状态与它在栈中的位置关系如下图所示:
如上所示,除了最顶层即处在 Active 状态的 Activity 外,其它的 Activity 都有可能在系统内存不足时被回收,
一个 Activity 的实例越是处在栈的底层,它被系统回收的可能性越大。系统负责管理栈中 Activity 的实例,
它根据 Activity 所处的状态来改变其在栈中的位置
Activity 生命周期
下图示展示了从 Activity1创建 -> 打开Activity2 -> Activity2返回Activity1 过程
Activity1 和 Activity2 的生命周期
| Activity1 | Activity2 |
创建打开Activity1 | onCreate() | |
onStart() | |
onResume() | |
Activity1打开Activity2 | onPause() | |
| onCreate() |
| onStart() |
| onResume() |
onStop() | |
Activity2返回Activity1 | | onPause() |
onStart() | |
onResume() | |
| onStop() |
| onDestroy() |
Activity 启动模式
Activity总共有四大启动模式:
1.标准模式(standard)
是Activity默认的启动模式,每当启动一个Activity时,就会在返回栈栈顶创建一个Activity的实例,
不论这个Activity在返回栈中是否有实例。我们在开发中大多都用这种模式
2.栈顶复用(singleTop)
如果这个Activity已经存在于返回栈的栈顶,那么当重新打开这个Activity时,并不会重新创建它的实例,
而是去回调onNewIntent方法,接着执行Activity的onRestart->onStart->onResume
这两种启动模式都不涉及两个App之间调用对方Activity的情况。即使打开了另一个App的Activity,
也还是在当前App的Task里,返回栈还是当前Task的返回栈。如果多个App同时打开了一个App中的Activity,
他们是不会相互影响的
3.栈内复用(singleTask)
每次启动Activity时,都会在返回栈内检查是否有该Activity的实例,如果发现有则直接使用该实例,
并把在这个Activity之上的所有Activity统统出栈。如果没有,就会新创建一个Activity
4.全局唯一模式(singleInstance)
这是我们最后的一种启动模式,也是我们最恶心的一种模式:在该模式下,我们会为目标Activity分配一个新的affinity,
并创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的Task有且只有这一个Activity实例。
如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒(对应Task设为Foreground状态)
Activity 状态保存
Activity状态保存如下图所示:
这张图非常重要,可以帮我们解决异常情况下activity如何正常回复的问题,当系统停止activity时,
它会调用onSaveInstanceState()(过程1),如果activity被销毁了,但是需要创建同样的实例,
系统会把过程1中的状态数据传给onCreate()和onRestoreInstanceState(),
所以我们要在onSaveInstanceState()内做保存参数的动作,在onRestoreInstanceState()做获取参数的动作。