Android developer dev guide 应用程序基础之activities and tasks

2010-05-09 16:57:54

 

继续学习和翻译Android开发者,活动和任务,很重要的部分

电子版已经上传了,http://download.csdn.net/source/2333052

 

 

 

 

Android 开发者

应用程序基础

 

——————————————————————————————————

活动和任务

前面所述,一个活动可以启动另一个,包括在不同应用中定义的。比如,假设你想让用户显示某个地点的街道地图。已经有活动可以实现,所以你的活动要做的就是把要求的信息放入意图对象并传递给 startActivity() 。地图视图会展示地图。当用户点击 BACK 键时,你的活动重新显示在屏幕上。

对于用户,看起来地图视图是你的应用的一部分活动,即使它在其他应用中定义,在该应用进程中运行。 Android 实现这种用户体验,通过在同一个任务 中保留两个活动。简单地说,一个任务是用户感受到的“应用程序”。它是安排在栈中的相关活动组。栈中的根活动用来启动任务——典型地,它是用户选择应用程序启动器时的活动。栈顶部的活动是当前正在运行的——用户在操作的。当一个活动启动另一个时,新的活动会入栈;它变成正在运行的活动。前一个活动仍在栈中。当用户按下 BACK 键时,当前的活动出栈,而前一个继续运行。

栈包含了多个对象,所以如果任务打开多于一个相同活动子类的实例——多地图视图,比如——栈给每个实例提供单独的入口。栈中的活动不重新安排,只是入栈和出栈。

任务是活动的栈,不是类或者清单文件的元素。所以无法脱离任务的活动设置任务。任务的属性作为一个整体在根活动中设置。比如,下一部分会说到“任务的相似值”;它的值从任务根活动设置的相似值中读出。

任务中所有活动组成一个单元,整个任务(整个活动栈)可以在前后台间切换。举个例子,假设当前任务有四个活动在栈中——三个在当前活动之下。用户按下 HOME 键,来到应用启动器,选择新的应用程序(确切地说是新的任务)。当前的任务转至后台而新任务的根活动显示出来。然后,过了一段时间,用户返回主屏幕再次选择了前一个应用(前一个任务)。那个有四个活动在栈中的任务转至前台。当用户按下 BACK 键,屏幕上并不显示用户刚离开的活动(前一个任务的根活动)。而是栈顶的活动移除,在同一个任务中的前一个活动显示出来。

刚才描述的是活动和任务的默认行为。但是有方法修改它的几乎全部方面特性。活动和任务的联系,活动在任务中的行为,由设置在启动活动的意图对象中的标识和清单文件里设置在活动的 <activity> 元素中的属性相互左右来进行控制的。请求者和回应者都有发言权。 【译者注:意图对象就是请求者,活动元素就是回应者,这里就是说由两方面共同控制。】

 

在这方面,意图的主要标志有:

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

FLAG_ACTIVITY_SINGLE_TOP

 

<activity> 的主要属性有:

taskAffinity

launchMode

allowTaskReparenting

clearTaskOnLaunch

alwaysRetainTaskState

finishOnTaskLaunch

 

下面部分描述了这些标志和属性的用途,如何相互作用,以及使用时该考虑什么。

 

相似值和新的任务

默认地,应用中的所有活动相互间有相似值——也就是,它们有属于同一个任务的倾向。然而,可以通过 <activity> 元素的 taskAffinity 属性给每个活动设置独立的相似值。定义在不同应用中的活动可以共享一个相似值,或者定义在相同应用中的活动可以分配不同的相似值。相似在两种情况下产生作用:当意图对象运行了包含 FLAG_ACTIVITY_NEW_TASK 标志的活动,和当活动的 allowTaskReparenting 属性设置为“ ”。

 

FLAG_ACTIVITY_NEW_TASK 标志

如前面所述,新的活动默认调用 startActivity() 在活动的任务中启动。它被压入和调用者相同的栈。然而,如果传递给 startActivity() 的意图对象包含 FLAG_ACTIVITY_NEW_TASK 标志,系统会寻找不同的任务安置这个新活动。通常,和标志的名称所指的那样,是一个新的任务。但这不是一定的。如果存在一个任务拥有和这个新活动一样的相似值,那么它就在该任务的栈中运行。如果没有,开始一个新任务。

allowTaskReparenting 属性

如果活动的 allowTaskReparenting 属性设置为“ ”,它能从开始的任务转移到它有相似值的任务,当该任务到前台运行时。比如,假设一个活动能预报选择城市的天气状况,定义为一个旅行应用程序的部分。它和同一个应用中的其他活动具有相同的相似值,并且允许转移。你的一个活动开始了天气预报,所以它初始时和你的活动属于同一个任务。然而,当旅行应用到前台时,天气预报会重新分配至该任务。

 

如果一个 .apk 文件包含超过一个用户角度的“应用”,你可能会想分配不同的相似值给和每个“应用”关联的活动。

 

启动模式

有四种不同的启动模式可以分配给 <activity> 元素的 launchMode 属性:

"standard " ( 默认模式 )

"singleTop "

"singleTask "

"singleInstance "

 

这些模式在以下四点上相互区别:

l   哪个任务会持有响应意图的活动。对于 "standard " "singleTop " 模式,是发起意图的任务(调用 startActivity() )——除非意图对象包含了 FLAG_ACTIVITY_NEW_TASK 标志。这种情况下,如前面相似值和新任务 部分所述的,不同的任务会持有该意图。

相比较, "singleTask " "singleInstance " 模式中的活动总是任务的根。它们定义一个任务;从不在别的任务运行。

l   活动是否可以多个实例。 "standard " 或者 "singleTop " 的活动可以实例化多次。它们可以属于多个任务,一个任务也可以有多个相同活动的实例。

相比较, "singleTask " "singleInstance " 的活动仅限一个实例。因为这些活动是任务的根,这限制就意味着设备上的任务一次不会超过一个实例。

l   实例的任务中是否可以有其他的活动。 "singleInstance " 的活动在它的任务中是唯一的。如果它启动了其他活动,该活动会在不同的任务中运行而不考虑运行模式——就好像 FLAG_ACTIVITY_NEW_TASK 标志在意图中一样。其他所有方面 "singleInstance " "singleTask " 是相同的。

其他三种模式允许多个活动属于一个任务。 "singleTask " 活动是任务的根活动,但是它启动的其他活动会分配给它的任务。 "standard " "singleTop " 活动实例可以在任务的任何位置出现。

l   是否启动新的实例来处理新的意图。对于默认的 "standard " 模式,创建新的实例来响应每个新的意图。每个实例只处理一个意图。对于 "singleTop " 模式,如果一个已经存在的实例位于目标任务的栈顶,它就可以重新使用来处理新的意图。如果不是,就不能重新使用,而是要创建新的实例来处理并入栈。

比如,假设一个任务的活动栈由根活动 A ,活动 B C 以及栈顶的 D 组成,即栈是 A-B-C-D 。一个类型 D 的意图到达。如果 D 是默认 "standard " 运行模式,一个新的实例启动,栈变成 A-B-C-D-D 。然而,如果 D "singleTop " 模式,现存的实例将处理新的意图(因为它在栈顶),栈仍然是 A-B-C-D

另外一种情况,如果新到的意图是类型 B 的,那么 B 的新实例被启动,无论 B 的模式是 "standard " 还是 "singleTop " (因为 B 不在栈顶),所以栈会是 A-B-C-D-B

如前述, "singleTask " 或者 "singleInstance " 的活动不会超过一个实例,所以该实例应该处理所有新的意图。 "singleInstance " 的活动永远在栈顶(因为它是栈中唯一的活动),所以它可以处理意图。然而, "singleTask " 的活动可能有其他的活动在栈的上方。如果这样,它就不能处理意图,该意图被丢弃。(即使意图被丢弃了,它的到来会使任务来到前台,它继续保留在那里。)

 

当现存的活动被要求来处理新的意图,意图对象调用 onNewIntent() 来传递给活动。(启动该活动的意图对象可以调用 getIntent() 获得。)

注意,当创建新的活动实例来处理新的意图时,用户可以按下 BACK 键回到前一个状态(前一个活动)。但是当现存的活动来处理新的意图时,用户是不能按下 BACK 键返回到刚才进行的工作的。

更多运行模式,见 <activity> 元素的描述。

 

清除栈

如果用户离开任务很长时间,系统清除任务栈中除了根活动的其他活动。当用户再次返回任务时,就像用户离开了它,除了只有初始化时的活动显示。这种思路是,一段时间后,用户就放弃了他们之前的工作,返回任务开始新的工作。

这是默认的行为。有一些活动属性可以用来控制和修改这种行为:

 

alwaysRetainTaskState 属性

如果任务的根活动的该属性设置为“ ”,刚才描述的默认行为不会发生。任务在很长时间后仍然保持所有活动。

clearTaskOnLaunch 属性

如果任务的根活动的该属性设置为“ ”,无论何时用户离开并返回任务,任务栈都被清空,只保留根活动。换言之,它是 alwaysRetainTaskState 属性的相反极端。用户永远以初始化状态返回任务,即使是短暂的离开。

finishOnTaskLaunch 属性

该属性和 clearTaskOnLaunch 属性很像,但是它只在单个活动上有效,不是整个任务。它可以使任何活动清除,包括了根活动。当它设置为“ ”时,活动仅在当前阶段保留在任务中。如果用户离开然后返回任务,它就不存在了。

 

还有其他方式让活动从栈中清除。如果意图对象包含 FLAG_ACTIVITY_CLEAR_TOP 标志,并且目标任务已经有能处理该意图的类型的活动在栈中,那么所有在该活动上方的活动都被清除,使得该活动能够在栈顶并响应该意图。如果指定的活动启动模式是 "standard " ,那么该活动也被清除,新的实例会被启动来处理意图。那是因为 "standard " 模式时总是创建新的实例来处理新的意图。

FLAG_ACTIVITY_CLEAR_TOP 通常和 FLAG_ACTIVITY_NEW_TASK 联合使用。一起用时,可以把现存活动安置在其他任务中并且放在能够响应意图的位置。

 

开始任务

通过指定意图过滤器 "android.intent.action.MAIN " 为动作, "android.intent.category.LAUNCHER " 为类别,使活动作为任务的入口。(这类过滤器的例子见前面的意图过滤器 部分。)这类过滤器在应用调用器上显示图标和标签,提供用户启动任务和在启动后任何时候返回任务的途径。

第二种能力很重要:用户必须能够离开应用并在之后返回。出于这个原因,标识活动初始化任务的两种启动模式, "singleTask " "singleInstance " ,应仅当活动有 MAIN LAUNCHER 过滤器时使用。比如,想象没有过滤器时的情况:意图启动 "singleTask " 活动,初始化新的任务,用户在该任务工作一段时间。然后用户按下 HOME 键。任务转至后台不在屏幕上显示。那么,因为没有在应用调用器上显示,用户没有办法返回该任务。

FLAG_ACTIVITY_NEW_TASK 标志有类似的问题。如果有该标志的活动开始了新的任务,用户按下 HOME 键并离开了,必须有某些方法让用户返回。一些实体(比如通知管理器)经常在外部任务启动活动,不做为它们自己的部分,所以它们在传递给 startActivity() 的意图中加入 FLAG_ACTIVITY_NEW_TASK 。如果你有活动可以由外部实体用这个标志调用,注意让用户有独立的途径返回任务。

对于你不希望用户能返回活动的情况,设置 <activity> 元素的 finishOnTaskLaunch 属性为“ ”。见前面的清除任务

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很抱歉,作为AI语言模型,我无法提供具体的解决方案。但是,你可以尝试以下步骤来解决这个问题: 1. 确认你的Android Studio版本是否最新,如果不是,请升级到最新版本。 2. 检查你的项目配置是否正确,包括Gradle版本、SDK版本等。 3. 尝试清除项目缓存,重新构建项目。 4. 如果以上步骤都无法解决问题,可以尝试在Stack Overflow等技术社区上寻求帮助,或者联系Android Studio官方支持团队。 ### 回答2: Android Studio是一款开发Android应用程序的集成开发环境(IDE),它提供了许多功能和工具来方便开发人员进行应用程序的开发和调试。运行任务(Run Tasks)是其中一个重要的功能,可以在开发过程中快速编译和运行应用程序。 在Android Studio中,运行任务可能会失败的原因有很多,我将列举一些常见的情况和解决方法: 1. 编译错误:如果在项目中存在语法错误或其他编译错误,运行任务会失败。可以在Android Studio的Build窗口中查看详细的错误信息,并修复相应的错误。 2. 设备连接问题:如果您的Android设备没有正确连接到计算机,运行任务也会失败。请确保设备已启用调试模式,并对设备进行重新连接。 3. Build工具版本不兼容:Android Studio需要与项目中使用的Build工具版本兼容。可以在项目的build.gradle文件中检查并更新Build工具版本,以确保其与Android Studio兼容。 4. 运行配置错误:在运行任务之前,需要正确配置运行选项。请确保已选择正确的模拟器或连接的Android设备,并选择正确的运行配置。 5. Gradle同步问题:Gradle是一种自动化构建工具,用于管理和构建Android应用程序。如果Gradle同步出现问题,可能会导致运行任务失败。可以尝试点击Android Studio的Sync按钮,强制同步Gradle文件。 如果以上方法都无法解决问题,可以尝试重启Android Studio、清除缓存或重新导入项目。 总之,Android Studio运行任务失败可能是由编译错误、设备连接问题、Build工具版本不兼容、运行配置错误或Gradle同步问题等原因引起的。根据具体情况,可以尝试上述方法来解决该问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值