【Android API】Tasks and Back Stack

Back Stack

1.当前activity启动另一个新的activity时,新的activity进入栈顶,之前的activity状态变为stopped,但是它的user interface被系统保存。当点击back按钮时,当前activity出栈被销毁,之前的activity进行resume。

2.当所有的activity都出栈后,back stack为空,task被销毁。

3.当点击home按钮时,当前task会被转移至后台保存,task中所有activity处于stopped状态。当从applicaton launcher再次启动该应用时,会继续此task。

4.当task过多时,可能会被系统销毁。

5.由于back stack栈不会被重排,因此当一个特殊的activity被从不同activity中启动时,会被多次实例化时,那么它们在back stack栈中会独立的存在,而不会被替换。

6.当一个activity所在的task被移至后台或者有新的activity启动时,如果内存不足,此activity可能被系统destory。此时,切换至此task,或点击back按钮返回至此activity时,系统必须recreate这个activity,将会造成此activity内的数据丢失。为避免此现象,应该在activity中继承 onSaveInstanceState()这一回调方法来主动保存activity。

7.通过Intent的flag指定的activity mode比在manifest中指定的mode优先级更高。

Defining launch modes

Using the manifest file

1."standard"

系统将在此activity启动的task中创建一个新的activity的实例,此activity可以被实例化多次,每个实例可以隶属于不同的task,每个task可以拥有多个该activity的实例。

2."singleTop"

如果此activity当前处于task中back stack的栈顶,那么再次实例化该activity时,系统不会新建实例,而是会将intent指向已存在的实例。

同样,此activity可以被实例化多次,每个实例可以隶属于不同的task,每个task可以拥有多个该activity的实例。只是当其已经存在于某个task的栈顶时,不会在此task中新建该activity的实例。

一个activity实例化完成之后,即可以通过点击back按钮回到上一个activity的实例。但是当一个已存在的实例处理intent时,在onNewIntent()中的新的intent到达之前,不能点击back按钮回到此activity之前的实例。

3."singleTask"

系统会新建一个task来存储该activity的实例,并将其作为root activity。但是如果这个activity的实例已经存在于其他task中,那么系统会将intent转到那个task中的那个实例。

尽管此activity在一个新的task中,在此activity中点击back按钮,还是会回到这个activity之前的acitiviy中。

如果此activity的实例已经存在于某一个task中,那么整个task都会被调至前台运行,并且此activity的实例处于栈顶位置。

4."singleInstance"

    与singleTask不同的是,保存此activity的task不会再保存其他activity实例。这种类型的activity的实例永远各自独占一个task。

Using Intent flags

1.FLAG_ACTIVITY_NEW_TASK 
   与singleTask作用一致

2.FLAG_ACTIVITY_SINGLE_TOP 
   与singleTop作用一致

3.FLAG_ACTIVITY_CLEAR_TOP

     FLAG_ACTIVITY_CLEAR_TOP 与 FLAG_ACTIVITY_NEW_TASK 经常一起使用,用来定位到其他task中已经存在的该activity的实例,并且将将其置于能够接受intent的位置。

         下图中的需求需要 FLAG_ACTIVITY_CLEAR_TOP 与 FLAG_ACTIVITY_SINGLE_TOP 搭配使用,因为activity默认的mode是standard,那么只使用FLAG_ACTIVITY_CLEAR_TOP时,虽然将A
置于栈顶,但是是新建了一个A的实例替换掉了原来的A的实例。加上FLAG_ACTIVITY_SINGLE_TOP 则仍沿用原来的实例。

Handling affinities

当没有设置某activity的android:taskAffinity="string"时,此activity会继承application的affinity。

affinity在以下两种情况下起作用:

1.FLAG_ACTIVITY_NEW_TASK

2. android:allowTaskReparenting

决定一个activity是否可以从它start的task移动到它具有affinity的task中。

根据定义,一个root activity总是处于相同affinity的task中。由于mode设定为singleTask和singleInstance的activity只能作为root activity而存在,因此re-parenting只对mode类型为
standard和singleTop的activity有效。

Starting a task

singleTask 和 singleInstance 只能用于带有ACTION_MAIN和CATEGORY_LAUNCHER filter的activity

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-13 10:18:25

【Android API】Tasks and Back Stack的相关文章

【Android实战】记录自学自己定义GifView过程,能同一时候支持gif和其它图片!【有用篇】

之前写了一篇博客.<[Android实战]记录自学自己定义GifView过程,具体解释属性那些事! [学习篇]> 关于自己定义GifView的,具体解说了学习过程及遇到的一些类的解释,然后完毕了一个项目,能通过在xml增加自己定义 view (MyGifView)中增加自己定义属性(my:gif_src = "@drawable/coffee").达到播放gif图片的效果. 可是.有几个问题 1.gif_src 属性仅仅支持 gif 图,并不支持其它类型的图片 2.仅仅支持

【Android 初学】9、Activity生命周期

Start Android  1.如何在一个应用程序当中定义多个Activity 1)定义一个类,继承Activity 2)在该类当中,复写Activity当中的onCreate方法 3)在AndroidMainfest.xml文件当中注册该Activity(android程序中所有的控件都要在次注册) 2.启动一个Activity 1)生成一个意图对象(Intent) 2)调用setClass方法设置所要启动的Activity 3)调用startActivity方法启动Activity 3.A

Win7 / Win8 搭建配置【vs2010】、【cocos2dx环境】、【Android平台】

[1.安装VS2010] 推荐版本 Microsoft Visual Studio 2010旗舰版(2.5G) http://download.microsoft.com/download/E/0/4/E0427BB8-8490-4C7F-A05B-AFEA0FC3EA80/X16-60997VS2010UltimTrialCHS.iso 注册方法: 方法一:在控制面版的在卸载向导中输入序列号 (不要真的卸载) YCFHQ-9DWCY-DKV88-T2TMH-G7BHP, 方法二:解压ISO后找

【Android测试】【随笔】模拟长按电源键

起因 昨天群里看到有人问如何实现一个长按电源键的操作,这个问题经常遇到,而且对于新手来说也比较棘手,于是在尝试成功后,决定说说这个事情. 一般这样的需求都出现在自动化操作的过程中.但是一般的ui自动化貌似对长按操作都支持的不是特别好,即使有也是针对手机屏幕中的区域来进行长按,我们都知道电源键是一个实体键,无法通过点击ui来实现.说道这里估计很多人都想到了KEYCODE(“KEYCODE” 在[Android测试][第十二节]Uiautomator——API详解 中的Uidevice的API列举中

【Android实战】----从Retrofit源码分析到Java网络编程以及HTTP权威指南想到的

一.简介 接上一篇[Android实战]----基于Retrofit实现多图片/文件.图文上传中曾说非常想搞明白为什么Retrofit那么屌.最近也看了一些其源码分析的文章以及亲自查看了源码,发现其对Java网络编程及HTTP权威指南有了一个很好的诠释.一直以来,都信奉一个原则,在这个新技术日新月异的时代,如何在Java界立足,凭借的就两点: 1.基本功,包括:Java基本知识,(Java编程思想.Effective Java),Java进阶(Java虚拟机.Java设计模式).网络相关(这个时

【高德API】如何利用MapKit开发全英文检索的iOS地图

原文:[高德API]如何利用MapKit开发全英文检索的iOS地图 制作全英文地图的展示并不困难,但是要制作全英文的数据检索列表,全英文的信息窗口,你就没办法了吧.告诉你,我有妙招!使用iOS自带的MapKit来展示全球英文底图,结合上高德API的中英文检索功能,就能打造POI数据最丰富,英文展示全方位的纯英文地图啦!看看截图,是不是浑然天成? ----------------------------------------------------------------------------

【Android Studio】Gradle DSL method not found:&#39;android()&#39;

如图所示: 参考:http://www.jianshu.com/p/d370d41fb7da 又遇到了这个问题: 参考:http://stackoverflow.com/questions/24204436/error1-0-plugin-with-id-android-not-found 然后是这个问题: 我也是醉了…… [Android Studio]Gradle DSL method not found:'android()'

【Android实战】记录自学自定义GifView过程,能同时支持gif和其他图片!【实用篇】

之前写了一篇博客,<[Android实战]记录自学自定义GifView过程,详解属性那些事![学习篇]> 关于自定义GifView的,详细讲解了学习过程及遇到的一些类的解释,然后完成了一个项目,能通过在xml加入自定义 view (MyGifView)中加入自定义属性(my:gif_src = "@drawable/coffee"),达到播放gif图片的效果. 但是,有几个问题 1.gif_src 属性只支持 gif 图,并不支持其他类型的图片 2.只支持默认的引用图片,不

【ANDROID 初学】控件--IMAGEVIEW的使用方法

Start Android 1.图片视图(ImageView)的基本概念 2.<InameView/>与ImageView 3.神奇的ScaleType属性 当图片大小与ImageView大小不匹配的时候,可以通过该属性来调整图片与ImageView控件的位置关系. android:scaleType:  android:scaleType是控制图片如何resized/moved来匹对ImageView的size. ImageView.ScaleType / android:scaleType