Android四大组件之Activity

一.定义


Activity是一个用户可以与其提供的屏幕进行交互的组件.

二.生命周期


1.Activity的整个生命周期

发生在onCreate()调用和onDestory()调用之间

2.Activity的可见生命周期

发生在onStart()调用 和 onStop()调用之间

3.Activity的前台生命周期

发生在onResume()调用 和 onPause()调用之间

Activity的生命周期

三.启动模式

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()保存相关重要信息.

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

- onNewIntent 是在onRestart()之前被调用.
- onCreate()和onNewIntent()不会被同时调用

注意

如果多次发送intent到这个Activity中,那么必须在onNewIintent的方法中,先setIntent(intent),然后再getIntent取值,不然的化intent的值始终是第一次传过来的.

本文仅供作者学习使用, 如有不足之处.请大家多多包涵.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值