浅析Android Activity 堆栈模式

1.TaskActivity的堆栈

众所周知,Android通过堆栈管理Activity。默认情况下一个程序有一个taskandroid:taskAffinity=package name),其中的task就是activity堆栈。当然也可以使用 android:taskAffinity="string"(string 格式要像包名那样string.string)添加一个新的task。做一个例子从A启动B,设置Bandroid:taskAffinity,然后退到home界面,长按home键,你会发现AB都出现在最近程序列表里,可见打开B的时候重新创建了一个Task,并不是把B压入A所在的Task。所以在android中程序的层级关系是:程序有NTaskTaskNActivity

 

2.只能在栈顶操作堆栈

Activity有多种启动模式,你也可以设置Intentflag实现各种跳转模式。看起来很花哨,但实际上这些操作都是在栈顶操作完成的。普通的模式很好理解,就是简单出栈、入栈。但有些特殊的模式是需要注意的,举其中一个例子:从A启动B,再从B启动C,再从C跳转到A,设置A android:launchMode="singleTask"(这个属性使得该Activity是单例的模式),你会发现跳转到A的时BC会被注销,其堆栈的变化是[CBA][A],程序直接注销掉C,注销掉B使得你的A直接处于栈顶位置,并不是调整堆栈的位置(用临时堆栈可进行排序)。并且不会调用onSaveInstanceState方法(即系统认为A之上的Activity是不需要恢复的)。可见系统的设计是所有操作只能在栈顶操作,并不能进行重排。我们在设计Activity模式时,考虑到这点就能推算出程序中其他的Activity会受到的影响。

 

3.栈底模式的使用

所谓的栈底模式是指,程序启动时加载的第一个Activity位于栈底(即root activity,他是第一个启动的,也是最后一个被销毁的,基于此你可以判定程序的启动和退出)。这个Activity能创建程序的图标和title,使程序在应用程序界面有一个入口给用户进入(不添加是没有程序图标的)。在主文件注册这个过滤器即可

 <intent-filter>

              <action android:name="android.intent.action.MAIN" />

              <category android:name="android.intent.category.LAUNCHER" />

 </intent-filter>

除了作为程序启动器外,还可以设置每次程序打开都是栈底Activity。在Activity设置android:clearTaskOnLaunch="true"属性就可以在启动器每次打开时都会把根Activity上面的Activity全部销毁掉比如:打开连续的ActivityTask[D,C,B,A]home键,再点击程序图标进入程序,打开的界面是Atask[A]。当然这个属性只对根Activity有用,还有通过长按home列表是不会触发这个属性设置的。

 

 

4.当Activity打开为窗口模式,屏幕显示有两个Activity

这种情况下,只有dialog的那个Activity是前景的,背景那个Activity的状态是OnPause。并且也会调用onSaveInstanceState方法,可见堆栈中依然只有一个Activity是活动的。

 

5.android 系统里的task不是以堆栈方式存储的

为什么这么说呢?其实这是我猜测的:长按home键,会出现最近任务列表,你可选择任意一个Activity进入,可见这不是堆栈的模式。这种模式看起来更像链表,这样的模式使得Android多任务运行得以实现,程序之间的快速切换带来了良好的用户体验,其中还有个优点是Activity的重用(就是程序之间可以交互,比如调用系统照相机)。

 

3.堆栈设计的意义

a. 在堆栈中只有栈顶是可操作的,一个Task中便只有一个Activity是运行状态的,其他的Activity都转入后台暂停了。唯一确定一个前台运行的Activity(即栈顶Activity)可以减少内存开销,这也是android选择堆栈而不选择其他数据结构的原因。

b. 堆栈有先入后出的规则,符合人类存放的习惯,所以在我们一路狂按返回键的时候会有一种很爽的感觉。这样设定也能规范程序的界面层次结构,避免内存泄露。

浅析Android Activity 堆栈模式,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。