- 浏览: 47940 次
- 性别:
- 来自: 上海
最新评论
-
hanxie1121:
书读多了
思考一下!!!!my android -
huyong479072052:
不用说应届毕业生了,现在中国搞android的开发的有几个能达 ...
思考一下!!!!my android -
zhanhao:
顶!
思考一下!!!!my android -
cectsky:
你妈喊你回家吃饭
回调(callback)方法
1、Activity和Task
task就好像是能包含很多activity的栈。 默认情况下,一个activity启动另外一个activity时,两个activity是放在同一个task栈中的,第二个activity压入第一个 activity所在的task栈。当用户按下返回键时,第二个activity从栈中弹出,第一个activity又在当前屏幕显示。这样,从用户角度 来看,这两个activity就好像是属于同一个应用程序的,即使第二个activity是属于另外一个应用程序的。当然,这是指默认情况下。 task栈包含的是activity的对象。如果一个activity有多个实例在运行,那么栈中保存的是每个实例的实体。栈中的activity不会重 新排列,只有弹出和压入操作。 一个task中的所有activity都以整体的形式移动。整个task可以被移到前台或后台。打个比方,当前的task包含4个activity–当前 activity下面有3个activity。当用户按下HOME键返回到程序启动器(application launcher)后,选择了一个新的应用程序(事实上是一个新的task),当前的task就被转移到后台,新的task中的根activity将被显 示在屏幕上。过了一段时间,用户按返回键回到了程序启动器界面,选择了之前运行的程序(之前的task)。那个task,仍然包含着4个 activity。当用户再次按下返回键时,屏幕不会显示之前留下的那个activity(之前的task的根activity),而显示当前 activity从task栈中移出后栈顶的那个activity。 刚刚描述的行为是默认的activity和task的行为。有很多方法能够改变这种行为。activity和task之间的联系,以及task中的 activity的行为可以通过intent中的标记以及在manifest中的<activity>元素的属性控制。其中,主要的 Intent标记有:
l FLAG_ACTIVITY_NEW_TASK
l FLAG_ACTIVITY_CLEAR_TOP
l FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
l FLAG_ACTIVITY_SINGLE_TOP
主要的<activity>属性有:
l taskAffinity
l launchMode
l allowTaskReparenting
l clearTaskOnLaunch
l alwaysRetainTaskState
l finishOnTaskLaunch
默 认情况下,一个应用程序中的所有activity都有一个affinity–这让它们属于同一个task。然而,每个activity可以通 过<activity>中的taskAffinity属性设置单独的affinity。不同应用程序中的activity可以共享同一个 affinity,同一个应用程序中的不同activity也可以设置成不同的affinity。affinity属性在2种情况下起作用:当启动 activity的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记,或当activity的 allowTaskReparenting被设置成true。
l FLAG_ACTIVITY_NEW_TASK标记
当 传递给startActivity()的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记时,系统会为需要启动的activity 寻找与当前activity不同的task。如果要启动的activity的affinity属性与当前所有的task的affinity属性都不相同, 系统会新建一个带那个affinity属性的task,并将要启动的activity压到新建的task栈中;否则将activity压入那个 affinity属性相同的栈中。
l allowTaskReparenting属性
如果一个activity的allowTaskReparenting属性为true,那么它可以从一个task(TASK1)移到另外一个有相同affinity的task(TASK2)中(TASK2带到前台时)。
如果一个.apk文件从用户角度来看包含了多个“应用程序”,你可能需要对那些activity赋不同的affinity值。
2、运行模式
activity的launchMode属性可以有四种值:
l “standard” (默认)
l “singleTop“
l “singleTask“
l “singleInstance“
这4种模式可以按4种分类来区分,以下假设位于task1中的activity1启动activity2:
对于新到的intent,如果是由新创建的activity对象来接收,则用户可以通过返回键回到之前的activity;如果是由已存在的activity来接收,则用户无法通过返回键返回到接收intent之前的状态。
3、清空栈
当用户长时间离开task(当前task被转移到后台)时,系统会清除task中栈底activity外的所有activity。这样,当用户返回到task时,只留下那个task最初始的activity了。
这是默认的情况,<activity>中有些属性可以改变这种行为。
l alwaysRetainTaskState属性
如果栈底activity的这个属性被设置为true,刚刚描述的情况就不会发生。task中的所有activity将被长时间保存。
l clearTaskOnLaunch属性
如 果栈底activity的这个属性被设置为true,一旦用户离开task,则task栈中的activity将被清空到只剩下栈底activity。这 种情况刚好与alwaysRetainTaskState相反。即使用户只是短暂地离开,task也会返回到初始状态(只剩下栈底acitivty)。
l finishOnTaskLaunch属性
这 个属性与clearTaskOnLaunch相似,但它只对单独的activity操作,而不是整个task。它可以结束任何activity,包括栈底 的activity。当它设置为true时,当前的activity只在当前会话期间作为task的一部分存在,当用户退出activity再返回时,它 将不存在。
另外还有一种方法能将activity强行从stack中移出。如果intent对象包含 FLAG_ACTIVITY_CLEAR_TOP标记,当目标task中已存在与接收该intent对象的activity类型相同的activity实 例存在时,所有位于该activity对象上面的activity将被清空,这样接收该intent的activity就位于栈顶,可以响应到来的 intent对象。如果目标activity的运行模式为standard,则目标activtiy也会被清空。因为当运行模式为standard时,总 会创建新的activity对象来接收到来的intent对象。
FLAG_ACTIVITY_CLEAR_TOP标记常常和FLAG_ACTIVITY_NEW_TASK一起使用。用2个标记可以定位已存在的activity并让它处于可以响应intent的位置。
4、启动任务(Task)
Intent filter中有”android.intent.action.MAIN” action和”android.intent.category.LAUNCHER” category的activity将被标记为task的入口。带有这两个标记的activity将会显示在应用程序启动器(application launcher)中。
第二个比较重要的点是,用户必须能够离开task并在之后返回。因为这个原因,singleTask和 singleInstance这两种运行模式只能应用于含有MAIN和LAUNCHER过滤器的activity。打个比方,如果不包含带MAIN和 LAUNCHER过滤器,某个activity运行了一个singleTask模式的activity,初始化了一个新的task,当用户按下HOME键 时,那个activity就被主屏幕“挡住”了,用户再也无法返回到那个activity。
类似的情况在 FLAG_ACTIVITY_NEW_TASK标记上也会出现。如果这个标记会新建一个task,当用户按下HOME键时,必须有一种方式能够让用户返回 到那个activity。有些东西(比如notification manager)总是要求在外部task中启动activity,在传递给startActivity的intent中总是包含 FLAG_ACTIVITY_NEW_TASK标记。
对于那种不希望用户离开之后再返回activity的情况,可将finishOnTaskLaunch属性设置为true。
task就好像是能包含很多activity的栈。 默认情况下,一个activity启动另外一个activity时,两个activity是放在同一个task栈中的,第二个activity压入第一个 activity所在的task栈。当用户按下返回键时,第二个activity从栈中弹出,第一个activity又在当前屏幕显示。这样,从用户角度 来看,这两个activity就好像是属于同一个应用程序的,即使第二个activity是属于另外一个应用程序的。当然,这是指默认情况下。 task栈包含的是activity的对象。如果一个activity有多个实例在运行,那么栈中保存的是每个实例的实体。栈中的activity不会重 新排列,只有弹出和压入操作。 一个task中的所有activity都以整体的形式移动。整个task可以被移到前台或后台。打个比方,当前的task包含4个activity–当前 activity下面有3个activity。当用户按下HOME键返回到程序启动器(application launcher)后,选择了一个新的应用程序(事实上是一个新的task),当前的task就被转移到后台,新的task中的根activity将被显 示在屏幕上。过了一段时间,用户按返回键回到了程序启动器界面,选择了之前运行的程序(之前的task)。那个task,仍然包含着4个 activity。当用户再次按下返回键时,屏幕不会显示之前留下的那个activity(之前的task的根activity),而显示当前 activity从task栈中移出后栈顶的那个activity。 刚刚描述的行为是默认的activity和task的行为。有很多方法能够改变这种行为。activity和task之间的联系,以及task中的 activity的行为可以通过intent中的标记以及在manifest中的<activity>元素的属性控制。其中,主要的 Intent标记有:
l FLAG_ACTIVITY_NEW_TASK
l FLAG_ACTIVITY_CLEAR_TOP
l FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
l FLAG_ACTIVITY_SINGLE_TOP
主要的<activity>属性有:
l taskAffinity
l launchMode
l allowTaskReparenting
l clearTaskOnLaunch
l alwaysRetainTaskState
l finishOnTaskLaunch
默 认情况下,一个应用程序中的所有activity都有一个affinity–这让它们属于同一个task。然而,每个activity可以通 过<activity>中的taskAffinity属性设置单独的affinity。不同应用程序中的activity可以共享同一个 affinity,同一个应用程序中的不同activity也可以设置成不同的affinity。affinity属性在2种情况下起作用:当启动 activity的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记,或当activity的 allowTaskReparenting被设置成true。
l FLAG_ACTIVITY_NEW_TASK标记
当 传递给startActivity()的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记时,系统会为需要启动的activity 寻找与当前activity不同的task。如果要启动的activity的affinity属性与当前所有的task的affinity属性都不相同, 系统会新建一个带那个affinity属性的task,并将要启动的activity压到新建的task栈中;否则将activity压入那个 affinity属性相同的栈中。
l allowTaskReparenting属性
如果一个activity的allowTaskReparenting属性为true,那么它可以从一个task(TASK1)移到另外一个有相同affinity的task(TASK2)中(TASK2带到前台时)。
如果一个.apk文件从用户角度来看包含了多个“应用程序”,你可能需要对那些activity赋不同的affinity值。
2、运行模式
activity的launchMode属性可以有四种值:
l “standard” (默认)
l “singleTop“
l “singleTask“
l “singleInstance“
这4种模式可以按4种分类来区分,以下假设位于task1中的activity1启动activity2:
对于新到的intent,如果是由新创建的activity对象来接收,则用户可以通过返回键回到之前的activity;如果是由已存在的activity来接收,则用户无法通过返回键返回到接收intent之前的状态。
3、清空栈
当用户长时间离开task(当前task被转移到后台)时,系统会清除task中栈底activity外的所有activity。这样,当用户返回到task时,只留下那个task最初始的activity了。
这是默认的情况,<activity>中有些属性可以改变这种行为。
l alwaysRetainTaskState属性
如果栈底activity的这个属性被设置为true,刚刚描述的情况就不会发生。task中的所有activity将被长时间保存。
l clearTaskOnLaunch属性
如 果栈底activity的这个属性被设置为true,一旦用户离开task,则task栈中的activity将被清空到只剩下栈底activity。这 种情况刚好与alwaysRetainTaskState相反。即使用户只是短暂地离开,task也会返回到初始状态(只剩下栈底acitivty)。
l finishOnTaskLaunch属性
这 个属性与clearTaskOnLaunch相似,但它只对单独的activity操作,而不是整个task。它可以结束任何activity,包括栈底 的activity。当它设置为true时,当前的activity只在当前会话期间作为task的一部分存在,当用户退出activity再返回时,它 将不存在。
另外还有一种方法能将activity强行从stack中移出。如果intent对象包含 FLAG_ACTIVITY_CLEAR_TOP标记,当目标task中已存在与接收该intent对象的activity类型相同的activity实 例存在时,所有位于该activity对象上面的activity将被清空,这样接收该intent的activity就位于栈顶,可以响应到来的 intent对象。如果目标activity的运行模式为standard,则目标activtiy也会被清空。因为当运行模式为standard时,总 会创建新的activity对象来接收到来的intent对象。
FLAG_ACTIVITY_CLEAR_TOP标记常常和FLAG_ACTIVITY_NEW_TASK一起使用。用2个标记可以定位已存在的activity并让它处于可以响应intent的位置。
4、启动任务(Task)
Intent filter中有”android.intent.action.MAIN” action和”android.intent.category.LAUNCHER” category的activity将被标记为task的入口。带有这两个标记的activity将会显示在应用程序启动器(application launcher)中。
第二个比较重要的点是,用户必须能够离开task并在之后返回。因为这个原因,singleTask和 singleInstance这两种运行模式只能应用于含有MAIN和LAUNCHER过滤器的activity。打个比方,如果不包含带MAIN和 LAUNCHER过滤器,某个activity运行了一个singleTask模式的activity,初始化了一个新的task,当用户按下HOME键 时,那个activity就被主屏幕“挡住”了,用户再也无法返回到那个activity。
类似的情况在 FLAG_ACTIVITY_NEW_TASK标记上也会出现。如果这个标记会新建一个task,当用户按下HOME键时,必须有一种方式能够让用户返回 到那个activity。有些东西(比如notification manager)总是要求在外部task中启动activity,在传递给startActivity的intent中总是包含 FLAG_ACTIVITY_NEW_TASK标记。
对于那种不希望用户离开之后再返回activity的情况,可将finishOnTaskLaunch属性设置为true。
发表评论
-
android 4.0 取内外置SD卡新特性
2013-06-06 12:44 1166private StorageManager mStorage ... -
android 2.3 取内外置SD卡
2013-06-06 12:42 1925在android2.3中 判断内置SD卡是否挂载: if( ... -
android 关闭数据连接方法
2013-05-04 21:18 1585开关数据连接方法: Method getITelepho ... -
判断Android 网络状态
2011-12-03 11:53 926当需要开启Activity之前需要检测网络状态的时候需要用到一 ... -
LauncherEx UI初探及Drag机制了解
2011-11-23 10:34 1见下载!! -
Android APK签名
2011-11-23 10:30 13481.签名的意义 为了保证每个应用程序开发商合法ID,防止部 ... -
Android 横竖屏设置
2011-11-17 09:03 1135最近遇到一个问题,关于Android 横竖屏的问题,我的lau ... -
Android 设计之流畅设计
2011-11-14 20:42 774即使你的应用程序是快速且响应灵敏的,但一些设计仍然会给用户造成 ... -
Android_WindowManager分析
2011-11-02 13:53 1Activity 建立一个主窗口 ... -
onInterceptTouchEvent和onTouchEvent调用时序
2011-10-22 17:01 822onInterceptTouchEvent()是ViewGro ... -
activity 启动方式
2011-10-15 11:15 846在android里,有4种activity ... -
Android功能总结:仿照Launcher的Workspace实现左右滑动切换
2011-10-09 17:36 2295对于Launcher的桌面滑动大家应该都比较熟悉了,最好的体验 ... -
Android中的Handler, Looper, MessageQueue和Thread
2011-10-08 20:34 1174前几天,和同事探讨了一下Android中的消息机制,探究了消息 ... -
ListView 动态加载
2011-09-29 20:46 1193ListView的动态加载,想必大家在网上都看过很多资料了。我 ... -
AppWidget加载流程(二)
2011-09-27 17:38 9431. 用户长按Launcher弹出添快捷组件的Dialog,选 ... -
AppWidget加载流程(一)
2011-09-27 17:34 12651. Android系统启动,SystemServer创建A ... -
Android(安卓) snippet
2011-09-21 10:33 01.获取屏幕的分辨率 在 activity 里利用如下编码,宽 ... -
Android 中Locale,auto-rotate状态的获取
2011-09-21 10:26 15501. 得到当前locale: Context.getReso ... -
深入理解Android消息处理系统——Looper、Handler、Thread
2011-09-19 10:56 1093熟悉Windows编程的朋友可能知道Windows程序是消息驱 ... -
理解Android系统的进程间通信原理(一)----RPC中的代理模式
2011-09-14 19:39 1071[size=medium]理解Android系统的进程间通信原 ...
相关推荐
### Activity、回退栈、Task之间的关系 #### Activity 基础概念 在 Android 开发中,`Activity` 是一个负责展示用户界面的组件。它提供了屏幕上的窗口(部分或全部),供用户与应用程序交互。当一个 Activity 被...
ActivityTask是怎么进行设计的,以及Activity四种加载模式。
通过FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TOP等FLAG,可以控制Activity如何进入和退出栈,比如清除栈中所有Activity,或者回退到特定Activity。 5. **返回栈的概念**:当用户点击后退键或调用finish()方法...
在Task中,Activity按照后进先出(LIFO)的原则进行操作,即最近打开的Activity位于栈顶,最先打开的Activity位于栈底。 1. Activity与Task的关系: - Task是一个执行上下文,它可以包含一个或多个Activity。当...
Activity的管理遵循一种称为“任务”(Task)和“回退栈”(Back Stack)的概念,这正是"模拟Activity进出栈"这个主题所涉及的关键知识点。下面将详细阐述这一主题。 首先,理解Android的任务(Task)和回退栈(Back ...
activity-task-target
在Android中,Activity的启动和切换遵循后进先出(LIFO)的栈结构,即Activity Task。每当一个新Activity被启动时,它会被压入栈底,而当前正在运行的Activity位于栈顶。用户通过返回键或系统操作可以弹出栈顶的...
在安卓系统中,每个启动的Activity都会被放入一个称为任务(Task)的堆栈中,这个堆栈被称为Activity栈。当用户启动一个新的Activity时,系统会将其压入栈顶;而当用户返回到前一个Activity时,栈顶的Activity会被弹...
当我们谈论“模拟Activity进出栈”时,我们实际上是在讨论Android系统的Activity管理机制,这涉及到任务(Task)和活动栈(Activity Stack)。这个压缩包可能包含了一些示例代码或教程,用于帮助开发者理解这一概念...
例如,使用FLAG_ACTIVITY_NEW_TASK可以创建新的任务栈,FLAG_ACTIVITY_CLEAR_TOP则可以在启动Activity的同时清除栈顶到目标Activity之间的所有Activity。 5. **Activity间的切换和回退**:Android系统通过返回栈来...
当栈顶的 Activity 完成使命退出的时候,Task 会将其退栈,并让下一个将跑到栈顶的 Activity 来与用户面对面,直至栈中再无更多 Activity,Task 结束。 Task 的配置是通过 Activity 的 launchMode 属性来实现的,...
Activity控件基础Task的压缩包文件提供了关于如何在Android应用程序中使用和管理Activity的示例代码和资源。在这个压缩包中,我们可以看到开发者在学习Android时创建的一些基本布局和控件的演示,比如相对布局...
在Android系统中,Activity的启动和切换遵循着一个称为"任务(Task)"和"回退栈(Back Stack)"的模型,这使得用户可以按后进先出(LIFO)的顺序操作活动。 首先,理解Activity的生命周期至关重要。Activity有多种...
在Activity进出栈的过程中,AMS会根据FLAG_ACTIVITY_*系列标记来决定Activity的启动行为,例如FLAG_ACTIVITY_NEW_TASK会创建新的任务栈,而FLAG_ACTIVITY_CLEAR_TOP会将栈中位于目标Activity之上的所有Activity清除...
这个"Android高级应用源码-模拟Activity进出栈.rar"压缩包文件提供了一个关于如何模拟Activity进栈(启动和显示)和出栈(关闭和返回)的示例。源码分析可以帮助开发者深入理解Android系统的Activity管理机制,这...
在Android系统中,任务栈(Task Stack)是管理和组织Activity的关键机制,它的主要目标是提供良好的用户体验。每个Android应用在启动时都会创建一个任务栈,这个任务栈会存储该应用的所有Activity。当用户在应用中...
当我们调用`startActivity()`方法并传入一个Intent时,Android会根据Intent的目标信息(如类名)找到相应的Activity,并将其压入任务栈(Task)的顶部。任务栈是系统维护的一个Activity集合,每个应用至少有一个任务...