美文网首页安卓开发博客
Activity Tasks and Back Stack

Activity Tasks and Back Stack

作者: 开心的锣鼓 | 来源:发表于2018-07-16 22:59 被阅读3次

    一个应用程序通常包含多个 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”)。

    大部分 task 都启动自 Home 屏幕。当用户触摸 application launcher 中的图标(或 Home 屏幕上的快捷图标)时,应用程序的 task 就进入前台。 如果该应用不存在 task(最近没有使用过此应用),则会新建一个 task,该应用的“main”activity 作为栈的根 activity 被打开。

    当用户返回到 Home屏幕执行另一个 task 时,一个 task 被移动到后台执行,此时它的返回栈(back stack)也被保存在后台, 同时 android 为新 task 创建一个新的返回栈(back stack),当它被再次运行从而返回前台时,它的返回栈(back stack)被移到前台,并恢复其之前执行的activity。 如果后台有太多运行 task ,系统将会杀死一些 task 释放内存。

    如果当前 activity 启动了另一个 activity,则新的 activity 被压入栈顶并获得焦点。 前一个 activity 仍保存在栈中,但是被停止。activity 停止时,系统会保存用户界面的当前状态。 当用户按下返回键,则当前 activity 将从栈顶弹出(被销毁),前一个 activity 将被恢复(之前的用户界面状态被恢复)。 activity 在栈中的顺序永远不会改变,只会压入和弹出——被当前 activity 启动时压入栈顶,用户用返回键离开时弹出。 这样,back stack 以“后进先出”的方式运行。如果用户不停地按下返回键,则栈中每个 activity 都会依次弹出,并显示前一个 activity,直至用户回到 Home 屏幕(或者任一启动该 task 的 activity)。当所有 activity 都从栈中弹出后, task 就此消失。

    改变activity和task默认的工作方式,利用manifest元素的属性和传入startActivity() 的intent中的标志即可。

    你可以使用的属性主要有:

    android:taskAffinity

    android:launchMode

    android:allowTaskReparenting

    android:clearTaskOnLaunch如果task中根activity的此属性设为"true",则只要用户离开并再次返回该task,栈就会被清理至根 activity。也就是说,正好与alwaysRetainTaskState相反。用户每次返回task时看到的都是初始状态,即使只是离开一会儿。

    android:alwaysRetainTaskState如果task中根activity的此属性设为"true",则默认的清理方式不会进行。即使过了很长时间,task 中所有的activity也都会保留在栈中。

    android:finishOnTaskLaunch此属性类似于clearTaskOnLaunch,只是它只对一个activity有效,不是整个task。这能让任何一个activity消失,包括根activity。如果activity的此属性设为"true",则只会保留task中当前session所涉及的内容。如果用户离开后再返回task,它就不存在了。

    可用的intent标志主要有:

    FLAG_ACTIVITY_NEW_TASK

    FLAG_ACTIVITY_CLEAR_TOP

    FLAG_ACTIVITY_SINGLE_TOP

    警告:大多数应用不应该改变activity和task默认的工作方式。如果你确定有必要修改默认方式,请保持谨慎,并确保activity在启动和从其它activity用回退键返回时的可用性。请确保对可能与用户预期的导航方式相冲突的地方进行测试。

    相关文章

      网友评论

        本文标题:Activity Tasks and Back Stack

        本文链接:https://www.haomeiwen.com/subject/ktpipftx.html