一.定义
Activity是一个用户可以与其提供的屏幕进行交互的组件.
二.生命周期
1.Activity的整个生命周期
发生在onCreate()调用和onDestory()调用之间
2.Activity的可见生命周期
发生在onStart()调用 和 onStop()调用之间
3.Activity的前台生命周期
发生在onResume()调用 和 onPause()调用之间
三.启动模式
1.使用清单文件
2.使用Intent标识
1. 使用清单文件
standard (默认模式)
Activty可以多次实例化,并且每个实例都可属于不同的任务,并且一个任务可以有多个实例.
理解
有一个Activity A, 模式为standard, A中有个功能可以跳转到新的A界面,点击了3次跳转,任务栈中显示为
A-A-A-A
singleTop (单一顶部模式)
如果当前任务栈顶部有一个Activity的实例D,模式为singleTop,那么系统会调用D 的onNewIntent()方法,而不是去重新创建一个新实例.
理解
(此例子中A,B,C的模式都是standard)
-如果栈顶的Activity D 模式是standard, 现在栈内有A-B-C-D,再打开一个新的D,栈里的排序就是A-B-C-D-D.
-如果栈顶的Activity D 模式是singleTop,那么系统就不会重新实例化D,而是调用D的onNewIntent()方法传intent,那么栈内的模式就还是A-B-C-D.
-如果singleTop模式的D不在栈顶,A-B-D-C,如果再打开一个D,栈内就会变成A-B-D-C-D
singleTask (单一任务模式)##
系统创建新任务并实例化位于新任务底部的 Activity。如果该Activity 存在一个单独的任务中,那么系统不会重新实例化该Activity,而是调用onNewIntent()方法传intent.一次只能存在Activity的一个实例.
理解
-栈内有A-B-C,D是singleTask模式,那么系统将会新建任务栈,并把D放在栈内
-在包含D的任务栈中依次打开ABC,栈内的排序为
D-A-B-C,再次打开D的时候,系统不会重新创建实例,而是调用onNewIntent()传送intent,在D之上的这些Activity都会被清空,栈内只留下一个D
实例
- 无论Activity在新任务中启动,还是在已启动的任务中启动,用户按返回键都会返回到上一个Activity中.
- 但是如果是打开指定singleTask的Activity,包含 activtiy的任务栈在后台时候, 会把整个任务栈移到前台.这时候按返回键,按照栈的后进先出顺序退出.
singleInstance 单一实例模式
与"singleTask"模式相同,只是系统不会将其他任何Activity实例启动到包含此实例的任务中.
通过此Activity打开的其他Activity都会在单独的任务中打开
理解
A,B,C默认模式
- 栈内 A-B-C , D是singleInstance模式,那么系统会新建任务栈,把D单独放在其中,如果由D打开A,B,C的话,
-A-B-C-A-B-C
-D
2 .使用Intent标识
在启动Activity时,可以通过在传递给startAcvitity()中的intent添加对应的标志,修改Actiity与其任务的默认关联方式.
(1) FLAG_ACTIVITY_NEW_TASK
-新任务中启动 Activity。如果已为正在启动的 Activity 运行任务,则该任务会转到前台并恢复其最后状态,同时 Activity 会在 onNewIntent() 中收到新 Intent。
-这会产生与 "singleTask"launchMode 值相同的行为
(2) FLAG_ACTIVITY_SINGLE_TOP
-如果正在启动的 Activity 是当前 Activity(位于返回栈的顶部),则 现有实例会接收对 onNewIntent() 的调用,而不是创建 Activity 的新实例。
-这会产生与 "singleTop"launchMode 值相同的行为
(3) FLAG_ACTIVITY_CLEAR_TOP
-如果正在启动的 Activity 已在当前任务中运行,则会销毁当前任务顶部的所有 Activity,并通过 onNewIntent() 将此 Intent 传递给 Activity 已恢复的实例(现在位于顶部),而不是启动该 Activity 的新实例。
-产生这种行为的 launchMode 属性没有值。
注:
如果指定 Activity 的启动模式为 "standard",则该 Activity 也会从堆栈中移除,并在其位置启动一个新实例,以便处理传入的 Intent。 这是因为当启动模式为 "standard" 时,将始终为新 Intent 创建新实例
四.清理返回栈
如果用户长时间离开任务,系统会清除所有的Activity, 根 Activity除外. 系统认为用户离开长时间,可能是放弃之前执行的操作, 返回时要开始新的操作.
可以使用以下几个Activity的属性修改此行为
(1) alwaysRetainTaskState
在任务的根Activity中将此属性设置为"true",则系统不会执行默认行为.即使在很长一段时间后,任务任将所有Activity保留在堆栈中.
(2) clearTaskOnLaunch
在任务的根Activity中将此属性设置为"true",每当用户离开时,系统都会将栈清理只剩下根Activity.与 alwaysRetainTaskState 状态正好相反.即使只离开任务片刻,系统也会清理任务栈道初始状态.
(3) finishOnTaskLaunch
属性类似于clearTaskOnLaunch,仅对单个Activity有作用,而非整个任务.(有可能会导致Activity停止,包括根Activity).设置为true时, Activity 仍是当前活动的一部分,但是仅限于当前对话. 如果用户离开片刻后返回任务,则任务将不复存在.
五. 保留Activity 状态
- 在界面暂停或者停止的时候,Acvitiy的状态会得到保留.因为Activity的相关成员和属性仍保留在内存中.当用户返回到界面时候,Activity又会重新显示出来
- 但是,当系统因为内存不足而销毁某个Activity时,Activity对象也会被销毁. 当用户返回时候,系统不知道之前Activity的一些状态,但是又必须重建Activity. 这时候就需要调用Acvitiy的onSaveInstanceState()保存相关重要信息.
理解
-当系统需要内存时候需要销毁某个Activity时候, 我们可以在onSaveInstanceState()这个方法中用putXXX()来保存一些重要信息. 系统会先去onSaveInstanceState()方法中保存存储的信息,然后再销毁Activity.当用户返回的时候,系统会重建Activity实例,并回传Bundle对象,我们可以在onCreate()或者onRestoreState()中取到保存的信息,并更新到UI上去.
- 当Activity实例第一次被创建的时候,Bundle里面是没有值.
六. onNewIntent()
源码:
`/**
* This is called for activities that set launchMode to "singleTop" in
* their package, or if a client used the {@link Intent#FLAG_ACTIVITY_SINGLE_TOP}
* flag when calling {@link #startActivity}. In either case, when the
* activity is re-launched while at the top of the activity stack instead
* of a new instance of the activity being started, onNewIntent() will be
* called on the existing instance with the Intent that was used to
* re-launch it.
*
* <p>An activity will always be paused before receiving a new intent, so
* you can count on {@link #onResume} being called after this method.
*
* <p>Note that {@link #getIntent} still returns the original Intent. You
* can use {@link #setIntent} to update it to this new Intent.
*
* @param intent The new intent that was started for the activity.
*
* @see #getIntent
* @see #setIntent
* @see #onResume
*/
protected void onNewIntent(Intent intent) {
}
`
- onNewIntent 是在onRestart()之前被调用.
- onCreate()和onNewIntent()不会被同时调用
注意
如果多次发送intent到这个Activity中,那么必须在onNewIintent的方法中,先setIntent(intent),然后再getIntent取值,不然的化intent的值始终是第一次传过来的.
本文仅供作者学习使用, 如有不足之处.请大家多多包涵.