android-activity启动模式

任务和返回栈

任务是指在执行特定作业时与用户交互的一系列Activity,这些Activity按照各自的打开顺序排列在堆栈(返回栈)中.

设备主屏幕是大多数任务的起点,当用户启动一个任务时,应用的任务会出现在前台.如果应用不存在任务(最近未曾使用),则会创建一个新的任务,并且该应用的”主”activity将作为堆栈中的根activity打开.

当前Activity启动另一个Activity时候,新的Activity会被推送到堆栈顶部,成为焦点所在,就是前台activity,前一个activity保留在堆栈中,处于停止状态.Activity停止时,系统会保持界面的当前状态.当用户按返回按钮时,当前activity会从堆栈顶部弹出(被销毁),前一个activity恢复执行(Ui的保存状态). 堆栈中的activity永远不会重新排列,仅推入(启动)和弹出(返回).

由于返回栈中的activity永远不会重新排列,如果应用允许用户从多个activity中启动特定的activity,则会创建该activity的新的实例并推入堆栈中(而不是将它的先前实例置顶).如果用户使用返回向后导航,则会按activity每个实例的打开顺序去显示,如果不希望多次实例化,则可修改此行为.

activity和任务的行为总结:

  • 当活动a启动b,a会处于停止,系统保留其状态(滚动位置,输入信息),处于b时候按下返回,a将恢复执行.

  • 按下主页离开任务时,当前activity停止并且任务进入后台,系统将保留任务中每个activity的状态.当任务被恢复时候,任务回到前台并恢复执行堆栈顶部的activity.

  • 用户返回时,当前活动销毁,不会保留该活动的状态.

  • 即使来自其它的任务,活动也可以多次实例化.

保存Activity状态

当任务被销毁必须重建时,应该主动使用回调方法保留活动的状态.当系统停止你的一个activity时,(新活动或者任务转到后台),如果系统回收内存资源,则有可能完全销毁该activity,但是系统仍然知道它在回退栈中占有位置,当该活动置于栈顶时,系统一定是重建(而不是恢复),为了避免工作丢失,需要主动在activity中实现onSaveInstanceState()回调方法来保留工作.

管理任务

管理任务和返回栈的方式适用大部分的应用,但是你想自定义活动的启动模式的话,比如希望activity在启动时开始新任务(而不是放在当前任务中);或者启动activity时希望将现有的实例上移到栈顶,而不是创建新实例;或者用户离开任务时,清除返回栈中除了根activity以外的所有activity.

你可以通过使用activity清单文件中的属性和传递给startActivity()的intent的标志.

清单属性包括:

  • taskAffinity
  • launchMode
  • allowTaskReparenting
  • clearTaskOnLaunch
  • alwaysRetainTaskState
  • finishOnTaskLaunch

Intent 标志包括:

  • FLAG_ACTIVITY_NEW_TASK
  • FLAG_ACTIVITY_CLEAR_TOP
  • FLAG_ACTIVITY_SINGLE_TOP

定义启动模式

如果你既使用清单文件定义,又使用intent的flag定义,那么intent的优先级高于清单文件.

使用清单文件

launchMode 属性:

  • standard

    默认,活动可以多次实例化,每个实例可以属于不同的任务,一个任务也可以拥有多个实例.

  • singleTop

    假设当前堆栈是A-B-C-D,D位于栈顶,收到D的intent,D的现有实例会通过onNewIntent()来接受intent,然后堆栈仍然是A-B-C-D,如果收到B的intent,就会变成A-B-C-D-B.

    为某个activity创建新实例后,用户可以返回到前一个activity.但是,当实例处理一个新的intent,在新的intent到达onNewIntent()前,用户无法点击返回按钮去返回活动的状态.

    onNewIntent
    activity在收到新的intent前会暂停,在这个方法后调用onResume()方法.
    getIntent仍然返回最初的intent,你可以使用setIntent去更新intent

  • singleTask

    系统新建一个任务并在任务底部实例化活动.但是如果一个活动的实例已经存在在一个单独的任务,系统会通过onNewIntent方法给已有实例发送intent,而不是创建一个新实例.每次只能存在活动的一个实例.(尽管每个活动开启在新的任务,但是返回按钮仍然可以返回前一个活动)

  • singleInstance

    和singleTask唯一不同的地方,singleTask允许其它activity作为任务的一部分.而singleInstance不允许,它就是任务中的唯一一个,如果通过它开启新活动,会分配到一个新任务.

例子:

比如浏览器的启动模式为singleTask,你启动浏览器,要么它为浏览器开个新任务,要么它把在后台运行的任务调到前台去处理新的intent.

如果一个singleTask的activity在后台,前台发送intent唤醒它,会把它的整个后台栈调到前台,在当前任务的顶部.

使用intent的flag

  • FLAG_ACTIVITY_NEW_TASK

    和”singleTask”差不多

  • FLAG_ACTIVITY_SINGLE_TOP

    和singleTop差不多

  • FLAG_ACTIVITY_CLEAR_TOP

    如果activity已经运行在当前线程,那么其他在它之上的都会被销毁,通过onNewIntent去恢复.

    这个经常和FLAG_ACTIVITY_NEW_TASK结合使用,(When used together, these flags are a way of locating an existing activity in another task and putting it in a position where it can respond to the intent.)一起使用时,通过这些标志,可以找到其他任务中的现有 Activity,并将其放入可从中响应 Intent 的位置。

    注意:当指定的activity是standard时,它会被移除栈然后在它的位置启动一个新实例去处理将要来的intent.

清理返回栈

  • alwaysRetainTaskState

    如果一个任务的根活动的这个属性设为true,这个任务在长时间返回后仍然保留所有的活动.

  • clearTaskOnLaunch

    如果一个任务的根活动的这个属性设为true,尽管离开一小段时间仍然会清除除了根活动的所有活动.

  • finishOnTaskLaunch

    和clearTaskOnLaunch很像,它作用与单个活动而不是整个任务,当设置为true,当前时间这个活动仍然是任务的一部分,离开后在回来就不是了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值