在Android中,一个应用程序里面,通常包含了多个相互结合的Activity。每个Activity通常被设计为可以为用户执行某个特定的动作,Activity与Activity之间可以通过Intent相互的跳转。甚至,可以通过Intent的action来启动另外一个应用程序的Activity,这个过程给用户的感觉就像这个Activity就是你的应用程序里面一样。Android把Activity的这种表现称之为“无缝连接”。

在用户的角度上看,它对某一个应用程序的操作,就是执行一个特定的task(任务),来完成某一个特定的操作。但是实际上在Android应用中,这可能是一个task或者是多个task之间相互结合。这就是Android的“多任务”机制。我们知道,一个应用程序表现给用户的就是一个个的Activity,所以“多任务”机制就是Android系统对Activity的管理机制。

在Android中,通过使用“back stack(返回堆栈)”来实现对Activity的管理,每一个启动的Activity都会存储在“back stack”中,遵循着栈的基本原则:先进后出。无缝连接只是Activity管理的一部分表现而已。下面先看看Task和back stack的基本行为。

一、Task和back stack的基本行为

1、单个Task中的多个Activity

Home界面是启动Task最多的地方。当用户点击一个应用程序图标(或者是快捷方式),这个应用程序的Task就会被调到前台(如果这个应用程序的Task不存在,那么就会创建一个新的任务,而这个应用程序的“main”Activity就会作为back stack的root Activity,也就是主界面)。

当这个Activity在去启动其他的Activity,这个新的Activity就会被压入到“back stack”的栈顶并且获得焦点,之前的那个Activity仍然保留在栈中,但是却会停止(Activity的生命周期)。当用户按下Back(返回)键,当前的Activity就会弹出栈顶(被销毁),而之前的那个Activity就会被恢复。

如下图,就是我们常见的堆栈原理,遵循先进后出的原则:

如果用户继续按下返回键(back),那么栈中的Activity会按照顺序一个个弹出,直到退出到Home界面(或者退回到启动这个Task的Activity(多Task))。此时,这个栈中的所有Activity全部被移除,这个Task就不存在了。

2、“back stack”永远遵循先进后出的原则

在“back stack”返回堆栈中的Activity永远都会遵循“栈”这种数据结构的基本原则——先进后出。永远都不会被重新的排序,只会不断的弹出或者压入。

“back stack”中Activity的存储和Activity的启动模式密切相关,这点在后面会学到,这里先来用这个知识举个例子:在一个栈中有3个Activity:Activity1,Activity2,Activity3。并且Activity1的启动模式为“singleTask”。如下图,这样更好的理解先进后出的原则

“singleTask”系统创建一个新的任务和实例,实例存在这个任务的栈的底部。如果这个实例已经存在 则调用这个activity 的onNewIntent 方法。 同一时间只有一个实例存在。 注意:尽管这个 activity 是在一个新的task中 ,按 back 键 还是会返回用户先前的那个activity

Back stack中的activity不会被重新排位,如果同一个activity能被其他多个activity 启动,这个activity也会被创建在新的堆栈中
3、一个Task就是内聚单元

Android是一个“多任务”的系统,同一时刻会有多个Task的存在。一个Task是一个内聚单元,当用户开始一个新的Task或者通过Home按钮返回到Home界面的时候,该Task可以移动到后台(background)。当一个Task存在于后台的时候,所有在这个Task中的Activity都处于Stopped状态。但是这个Task的back stack仍然完好无损的保存着——它仅仅是被别的Task抢占了焦点。如下图:


当如上如图的情况下,用户仍然可以在Home界面重新选择TaskA的应用程序,让TaskA获取焦点,并且TaskA的栈顶的Activity Y会恢复,就像用户之前离开它的时候一样。如果让我举一个例子的话,那我会告诉你:我觉得tabhost就是一个不错的例子,我们选择不能的标签跳转到不同的task,每个task堆栈具有多个Activity。

4、一个Activity可以被实例化多次

因为在“back stack”中的Activity永远都不会重新排序,如果你的应用程序允许用户在不止一个Activity去启动另外一个指定的Activity,那么系统就会去创建一个该Activity新的实例并把它压入到栈顶(而不是把栈中之前的那个实例移动到栈顶)。因此,应用程序的Activity可能会被实例化多次(甚至是在不同的Task中),如下图:

然而,如果你不想一个Activity被实例化多次,我们可以去修改这种行为。

5 总结Activitytask的默认行为:

  • Activity A启动Activity B,A会被stop,但状态仍然保存(第2.1节 Activity生命周期 ),从B返回,Aresumed并恢复之前的状态。

  • 点击HOME返回桌面,当前的task被移到后台,系统会保存 task中每一个activity的状态;直到用户点击app图标返回,该task被移回前台,resume栈顶的activity

  • 返回键会导致当前的activity从栈顶弹出并被destroy,该 activity状态不会再被保存,前一个activity 移到栈顶。

  • Activity能被实例化多次,包括其它task启动它。

更多相关文章

  1. Android项目开发中如何处理Home键
  2. Android(安卓)7.0新特性总结
  3. 从零开始--系统深入学习android(实践-让我们开始写代码-Android框
  4. Android使用http协议与服务器通信的实例
  5. Android(安卓)调用网易微博开放API
  6. Android驱动程序开发实例精讲-0_Android系统HAL驱动开发经典案例
  7. Android常用功能实例----(十一)小功能(获取IMEI|手机号等)
  8. Android(安卓)Gems — Fragment本质之View管理
  9. 调用Android其它Context的Activity

随机推荐

  1. Android 手机屏幕适配解决办法
  2. Android Malware Genome Project
  3. 9.0 添加自定义服务
  4. BlueStacks让 Android 应用跑在 Windows
  5. 【已解决】上传项目到binary 上面的时候
  6. Android(安卓)视频播放器 应用层设计 考
  7. Android 相机拍照获取图片并保存到指定位
  8. Android中SensorManager.getRotationMatr
  9. android中图片加载到内存的实例代码
  10. Android 平台的檔案讀寫方式