activity启动模式

1.标准启动模式:
任务栈(先入后出):存放实例,跳转机制,支持后退导航
AMF:android:lauchMode = “standard” //默认
ps:textAllCaps: 是否全部大写
tv.setText(String.format(“TaskId:%d\nCurrent Activity id%s”,getTaskId(),toString()));

2.SingleTop模式
AMF:android:lauchMode = “SingleTop”
单例模式 只有一个实例 启动自己无反应
ps:同一个文件中的id不可以相同,不同文件,可
SingleTop特征:在同一个栈中,如果actiity处于栈顶只能创建一个实例,反之,可创建多个

3.SingleTask与SingleInstance模式
SingleTask:

SingleInstance:单例模式
一个activity只有一个实例
一个任务栈只包含一个activity

Android API中相关:

(1)activity与task
所有的 activity 都属于一个task
task 包含了 activity 的集合,并按照用户使用的顺序排列
task 可以转入后台,并会保存每个 activity 的状态,这样用户运行其它 task 时就不会丢失当前的工作了。
一个应用程序通常包含多个 activity。 每个 activity 在设计时都应该以执行某个用户发起的 action 作为核心目标,并且它能启动其它 activity。 比如,一个 email 应用可能会用一个 activity 来列出所有的新 email,当用户选中一封 email 时,再打开一个新的 activity 来显示这封 email。

一个 activity 甚至可能会启动另一个应用中的 activity。 比如,如果你的应用需要发送 email,你可以定义一个 intent 来执行“send” action,其中包含一些数据,如 email 地址、正文等。 然后会打开一个其它应用中已声明能够处理这类 intent 的 activity。 这里是一个发送 email 的 intent,所以会打开一个 email 应用的“新建邮件”activity(如果有多个 activity 都支持同一个 intent,则系统或让用户选择一个打开)。 email 发送完毕后,你的 activity 将会恢复,看起来 email activity 就像是你的应用中的一部分一样。 虽然这两个 activity 可能来自不同的应用,通过把它们放入同一个task,Android 保证了无缝的用户体验。

task 是多个 activity 的集合,用户进行操作时将与这些 activity 进行交互。 这些 activity 按照启动顺序排队存入一个栈(即“back stack”)。

(2)定义启动模式

启动模式定义了一个新的 activity 实例与当前 task 的关联方式。定义启动模式的方法有两种:

使用 manifest 文件
当你在 manifest 文件中声明一个 activity 时,可以指定它启动时与 task 的关联方式。

使用 Intent 标志
调用 startActivity() 时,可以在 Intent 中包含一个标志,用于指明新 activity 如何(是否)与当前 task 相关联。

这样,如果 Activity A 启动了Activity B,则 Activity B 可以在 manifest 中定义它如何与当前 task 关联(如果存在的话), 并且,Activity A 也可以要求 Activity B 与当前 task 的关联关系。 如果两者都定义了,则 Activity A 的请求(intent 中定义)优先于 Activity B 的定义(在 manifest 中)。

注意: manifest 文件中的某些启动模式在 intent 标志中并不可用,反之亦然,intent 中的某些模式也无法在 manifest 中定义。

使用 manifest 文件

在 manifest 文件中声明 activity 时,你可以利用 元素的 launchMode 属性来设定 activity 与 task 的关系。

launchMode 属性指明了 activity 启动 task 的方式。 launchMode 属性可设为四种启动模式:

“standard” (默认模式)
默认值。系统在启动 activity 的 task 中创建一个新的 activity 实例,并把 intent 传送路径指向它。该 activity 可以被实例化多次,各个实例可以属于不同的 task,一个 task 中也可以存在多个实例。
“singleTop”
如果 activity 已经存在一个实例并位于当前 task 的栈顶,则系统会调用已有实例的onNewIntent()方法把 intent 传递给已有实例,而不是创建一个新的 activity 实例。activity 可以被实例化多次,各个实例可以属于不同的 task,一个 task 中可以存在多个实例(但仅当 back stack 顶的 activity 实例不是该 activity 的)。
比如,假定 task 的 back stack 中包含了根 activity A 和 activities B、C、D(顺序是 A-B-C-D;D 在栈顶)。
这时过来一个启动 D 的 intent。如果 D 的启动模式是默认的”standard”,则会启动一个新的实例,栈内容变为 A-B-C-D-D。
但是,如果 D 的启动模式是”singleTop”,则已有的 D 实例会通过onNewIntent():接收这个 intent,因为该实例位于栈顶——栈中内容仍然维持 A-B-C-D 不变。当然,如果 intent 是要启动 B 的,则 B 的一个新实例还是会加入栈中,即使 B 的启动模式是”singleTop”也是如此。
注意: 一个 activity 的新实例创建完毕后,用户可以按回退键返回前一个 activity。 但是当 activity 已有实例正在处理刚到达的 intent 时,用户无法用回退键回到 onNewIntent() 中 intent 到来之前的 activity 状态。

“singleTask”
系统将创建一个新的 task,并把 activity 实例作为根放入其中。但是,如果 activity 已经在其它 task 中存在实例,则系统会通过调用其实例的onNewIntent() 方法把 intent 传给已有实例,而不是再创建一个新实例。 此 activity 同一时刻只能存在一个实例。
注意: 虽然 activity 启动了一个新的 task,但用户仍然可以用回退键返回前一个 activity。

“singleInstance”
除了系统不会把其它 activity 放入当前实例所在的 task 之外,其它均与”singleTask”相同。activity 总是它所在 task 的唯一成员;它所启动的任何 activity 都会放入其它 task 中。
举个例子,Android 的浏览器应用就把 web 浏览器 activity 声明为总是在它自己独立的 task 中打开——把 activity 设为singleTask模式。 这意味着,如果你的应用提交 intent 来打开 Android 的浏览器,则其 activity 不会被放入你的应用所在的 task 中。 取而代之的是,或是为浏览器启动一个新的 task;或是浏览器已经在后台运行,只要把 task 调入前台来处理新 intent 即可。

无论 activity 是在一个新的 task 中启动,还是位于其它已有的 task 中,用户总是可以用回退键返回到前一个 activity 中。 但是,如果你启动了一个启动模式设为singleTask的 activity,且有一个后台 task 中已存在实例的话,则这个后台 task 就会整个转到前台。 这时,当前的 back stack 就包含了这个转入前台的 task 中所有的 activity,位置是在栈顶。 图 4 就展示了这种场景。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值