文档章节

Tasks and Back Stack

cxlin007
 cxlin007
发布于 2015/09/16 15:52
字数 1298
阅读 28
收藏 1

地址:https://developer.android.com/guide/components/tasks-and-back-stack.html

一个任务就是一个activity的集合,activity都被安排在一个栈里,按activity的打开顺序。

设备home界面是大部分任务启动的地方。当用户触摸应用的启动图标或是快捷方式,应用的任务就会来到前台,如果不存在这个应用的任务,就会创建新的任务,这个应用的mainactivity将作为栈的根activity打开。

当当前的activity启动了另一个,新的activity就会被放到栈的顶部,并获得焦点。而之前的activity则遗留在栈中,但是是暂停状态。当一个activtiy是暂停的,系统会保留当前用户接口的状态。当用户按了回退键,当前activity就会从栈的顶部移除,前一个activity就会恢复。当所有的activity都从栈中移除后,栈就不再存在。

当用户启动一个新的任务或是跳转到home界面,之前的任务就会移到后台。在后台的时候,任务重所有的activity都是暂停的,任务的回退栈会完整保留。

多个任务都会保存在后台,但是如果用户运行了很多任务,系统可能会销毁后台的activity来恢复内存 。这会导致activity 的状态丢失。

所有的activity都可以被实例化多次,甚至是从其他任务。

当系统暂停你的activity,系统如果需要内存可能会完全销毁activtiy。当这发生的时候,activity 的状态信息将会消失。为了避免丢失用户的操作,你需要实现onSaveInstanceState()方法保留他。

如果你想要启动一个activity在新的任务中,或是要启动一个activity,想从原来已存在的activity中获取,或是用户离开任务时,除了rootactivity,其他所有activity都被清除。

要实现这些可以给activity设置属性和flags

<activity>主要有:

taskAffinity、launchMode、allowTaskReparenting、clearTaskOnLaunch、alwaysRetainTaskState、finishOnTaskLaunch

主要的intent flags有:

FKAG_ACTIVITY_NEW_TASK  FKAG_ACTIVITY_CLEAR_TOP  FKAG_ACTIVITY_SINGLE_TOP  

区别activity如何关联任务可以使用<activity>的launchMode元素可以定义的类型有4种

standard(默认类型):默认,系统会创建一个新的activity实例。activity可以被实例化多次,每个实例可以属于不多的任务,一个任务可以有多个实例。

singleTop:如果当前任务的顶部存在这个activity实例,那么系统跳转到这个实力并调用onNewIntent()方法。否则就会创建一个新的activity实例。activity可以实例化多次,每个activity可以属于不同的任务,一个任务也可以有多个实例。

singleTask:系统创建一个新的任务,并且实力化这个activity作为新的任务的根activity。然而如果activity实例存在于一个不同的任务中,系统会跳转到这个已存在实例,调用onNewIntent()方法,而不是创建一个新的方法,只有一个activity实例可以创建。通过activity启动了一个新的任务,返回的时候还是到上一个activity。

singleInstance:和singleTask一样,这个activity总是他的任务重的唯一一个,他启动的其他activity都是在不同任务重。如果你启动的一个activity指定了singleTask模式,如果在后台任务重存在这个activity实例,那么这整个任务都会移到前台,

用launchMode指定的activity行为可以被flags覆盖。

FLAG_ACTIVITY_NEW_TASK:启动一个activity在一个新的任务中,如果一个任务已经运行了这个activity,那么将会把他从后台移到前台,activity会接收到onNewIntent()方法。这与singleTask很像。

FLAG_ACTIVITY_SINGLE_TOP:如果启动的activity就是当前的activity,将会调用onNewIntent()。否则就会创建一个新的activity,与singleTop很像。

FLAG_ACTIVITY_CLEAR_TOP:如果要启动的activity已经在当前的任务中运行了,不需要启动一个新的activity实例,只要恢复这个activity实例,并把他之前的activity都销毁。FLAG_ACTIVITY_CLEAR_TOP经常与FLAG_ACTIVITY_NEW_TASK配合。

affinity是activity属于任务的标志。

应用中所有的activity都有自己的affinity标志。默认一个应用中所有的activity都是属于一个任务。然而,你可以修改一个activity的affinity.不同应用的activity可以共享一个affinity,或是同一个应用的activity可以分配不同的任务affinities。

你可以通过<activity>的taskAffinity属性修改affinity。

taskAffinity是一个字符串,默认是包名。

affinity在两种情况下有用:

1、当启动一个activity使用FLAG_ACTIVITY_NEW_TASK标志,

启动一个activity默认都是在同一个任务中,如果带有FLAG_ACTIVITY_NEW_TASK标志,系统会在不同的任务中查找这个acitivity。通常都是新的任务,如果某个有同样affinity的任务存在那么将会在这儿任务中启动activity。如果没有,就会启动一个新的任务。

2、当一个activity的allowTaskReparenting属性为true

用于配制是否允许activity可以更换从属的task,通常和taskAffinity一起使用,表示能否从启动的task移动到taskAffinity指定的任务。









© 著作权归作者所有

上一篇: Services
cxlin007

cxlin007

粉丝 2
博文 47
码字总数 28683
作品 0
福州
私信 提问
JS的Event Loop 和 microTask

面试和笔试题目中,经常会出现'promise','setTimeout'等函数混合出现时候的运行顺序问题。 我们都知道这些异步的方法会在当前任务执行结束之后调用,但为什么'promise'会在'setTimeout'之前执......

Vincent Ko
2018/08/06
0
0
罗塞塔代码PK栈溢出(RosettaCode vs Stack Overflow)

引言:如果你是一名IT技术人员,在遇到问题时,最常访问哪个网站?百度,谷歌,官方网站(API),栈溢出,还是其他?文中,作者比较了罗塞塔代码和 栈溢出两大知识库网站的异同点,突出了罗塞...

xyxzfj
2012/01/09
60
0
Docker入门教程 Part 3 Services

前言 本篇笔记是官方Get Started入门教程的Part3 Services,主要演示如何使用 docker-compose.yml 来定义应用服务,docker-compose 可以很方便地对 app 进行调整,并且很容易地实现负载均衡。...

iotisan
2017/10/24
0
0
grails 测试程序出错

在编写好测试类后,运行grails test-app 提示出如下错误: FAILURE: Build failed with an exception. * What went wrong: Task 'test' not found in root project 'GDepot'. * Try: Run gra......

cherylLee
2015/11/03
239
0
JFinal c3p0 数据库连接池问题

使用JFinal框架,程序运行一段时间后,会有以下的WARN,大家看看是什么原因? 2013-11-23 00:00:16 [WARN]: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@79b0d33c ...

chenhai_bj
2013/11/23
1K
5

没有更多内容

加载失败,请刷新页面

加载更多

关于ThinkPHP5.1+的Log无法记录SQL调试记录的小经历

项目开发阶段,除了基本编码外,性能也需要实时关注与优化。之前我的大部分项目都是使用ThinkPHP5.0以及ThinkPHP3.2,对于框架提供的日志记录和日志配置都差不多,然后使用ThinkPHP5.1的时候...

北桥苏
21分钟前
1
0
TiDB Binlog 源码阅读系列文章(四)Pump server 介绍

作者: satoru 在 上篇文章 中,我们介绍了 TiDB 如何通过 Pump client 将 binlog 发往 Pump,本文将继续介绍 Pump server 的实现,对应的源码主要集中在 TiDB Binlog 仓库的 pump/server.go...

TiDB
25分钟前
0
0
OSChina 周五乱弹 ——不知道假装开心,装的像么

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :天黑了 你很忧愁, 你说世界上, 找不到四块五的妞, 行走在凌晨两点的马路上, 你疲倦地拿着半盒黄鹤楼。#今日歌曲推荐# 《四块...

小小编辑
今天
2.4K
19
Windows下学习C语言有哪些集成开发软件?

前言 初学者学习C语言遇到的最大困难想必就是搭建环境了,相当多的初学者就是被搭建环境导致放弃了学习编程,就我自己的经验而言,初学编程不应该受限于环境,使用成熟好用的环境就可以了,之...

Allen5G
昨天
2
0
Hello,Servlet!

Servlet来源 上文说过了servlet是什么,我们从servlet是什么中也可以了解到servlet的来源:servlet是Java的一个类,并且能够运行在web容器上,所以servlet是按照web容器的规范和Java的规范写...

蒙尘
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部