`

Android Intent Flag的介绍

 
阅读更多
一、Activity和Task(栈)的关系
  Task就像一个容器,而Activity就相当与填充这个容器的东西,第一个东西 (Activity)则会处于最下面,最后添加的东西(Activity)则会在最低端。从Task中取出东西(Activity)则是从最顶端取出,也 就是说最先取出的是最后添加的东西(Activity),一次类推,最后取出的是第一次添加的Activity,而Activity在Task中的顺序是 可以控制的,那则在Activity跳转时用到Intent Flag
  
二、界面跳转和服务的启动都会用到Intent,现在介绍Intent Flag是关于Activity的跳转
  Intent intent = new Intent(this,xxx.class);
  
//如果activity在task存在,拿到最顶端,不会启动新的Activity
  intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
 
 //如果activity在task存在,将Activity之上的所有Activity结束掉
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 
 //默认的跳转类型,将Activity放到一个新的Task中
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  
//如果Activity已经运行到了Task,再次跳转不会在运行这个Activity
  intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

如果task中已经有这个activity A,那么就把A拿到task的最顶层,而不是创建一个新的activity。所以不加flag也不会影响界面的切过去,只是会影响task的顺序而已

intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)  



Intent Flag有20多种,以上只是介绍了4种

 
Intent的常用Flag参数:

FLAG_ACTIVITY_CLEAR_TOP:
例如现在的栈情况为:A B C D 。D此时通过intent跳转到B,如果这个intent添加FLAG_ACTIVITY_CLEAR_TOP标记,则栈情况变为:A B。如果没有添加这个标记,则栈情况将会变成:A B C D B。也就是说,如果添加了FLAG_ACTIVITY_CLEAR_TOP标记,并且目标Activity在栈中已经存在,则将会把位于该目标activity之上的activity从栈中弹出销毁。这跟上面把B的Launch mode设置成singleTask类似。

FLAG_ACTIVITY_NEW_TASK:
例如现在栈1的情况是:A B C。C通过intent跳转到D,并且这个intent添加了FLAG_ACTIVITY_NEW_TASK标记,如果D这个Activity在Manifest.xml中的声明中添加了Task affinity,并且和栈1的affinity不同,系统首先会查找有没有和D的Task affinity相同的task栈存在,如果有存在,将D压入那个栈,如果不存在则会新建一个D的affinity的栈将其压入。如果D的Task affinity默认没有设置,或者和栈1的affinity相同,则会把其压入栈1,变成:A B C D,这样就和不加FLAG_ACTIVITY_NEW_TASK标记效果是一样的了。      注意如果试图从非activity的非正常途径启动一个activity,比如从一个service中启动一个activity,则intent比如要添加FLAG_ACTIVITY_NEW_TASK标记。

FLAG_ACTIVITY_NO_HISTORY:
例如现在栈情况为:A B C。C通过intent跳转到D,这个intent添加FLAG_ACTIVITY_NO_HISTORY标志,则此时界面显示D的内容,但是它并不会压入栈中。如果按返回键,返回到C,栈的情况还是:A B C。如果此时D中又跳转到E,栈的情况变为:A B C E,此时按返回键会回到C,因为D根本就没有被压入栈中。

 FLAG_ACTIVITY_SINGLE_TOP:
和上面Activity的Launch mode的singleTop类似。如果某个intent添加了这个标志,并且这个intent的目标activity就是栈顶的activity,那么将不会新建一个实例压入栈中。

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Activity的主要属性:

allowTaskReparenting:设置成true时,和Intent的FLAG_ACTIVITY_NEW_TASK标记类似。

alwaysRetainTaskStat:   如果用户长时间将某个task移入后台,则系统会将该task的栈内容弹出只剩下栈底的activity,此时用户再返回,则只能看到根activity了。如果栈底的activity的这个属性设置成true,则将阻止这一行为,从而保留所有的栈内容。

clearTaskOnLaunch:根activity的这个属性设置成true时,和上面的alwaysRetainTaskStat的属性为true情况搞好相反。

finishOnTaskLaunch:对于任何activity,如果它的这个属性设置成true,则当task被放置到后台,然后重新启动后,该activity将不存在了


 

 转载:

http://blog.csdn.net/liudan10/article/details/6608593

 

http://www.cnblogs.com/jh5240/archive/2011/11/09/2243705.html

分享到:
评论

相关推荐

    android Intent.FLAG大全

    了解和正确使用这些`Intent.FLAG`可以优化Android应用的用户体验,避免不必要的Activity创建,提升性能,同时确保用户导航的合理性和一致性。在实际开发中,开发者应结合具体场景灵活运用,以实现预期的行为。

    Android的Intent实验

    - `setFlags()`: 设置Intent的标志,影响Intent的处理方式,如FLAG_ACTIVITY_NEW_TASK用于在新的任务栈中启动Activity。 5. **启动Activity** 使用`startActivity(Intent)`方法启动一个Activity。如果Intent是...

    经典的android intent 窗口切换 窗口打开

    在Android开发中,Intent是一种非常重要的组件,它用于在应用程序的不同组件之间建立通信桥梁,尤其在窗口(Activity)之间的切换和数据传递上扮演着核心角色。Intent不仅可以启动新的Activity,还可以启动Service、...

    android用于打开各种文件的intent.pdf

    it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(new File("/sdcard/images/001041580.jpg")); it.setDataAndType(uri, "image/*"); * 打开视频文件: Intent it = new Intent("android....

    android中intent使用示例

    在Android开发中,Intent是一种非常重要的组件间通信机制。它被用来启动活动(Activity)、服务(Service)或者传递数据。本示例将深入探讨Intent的基本用法和常见应用场景。 首先,Intent分为显式Intent和隐式...

    android Intent的用法

    在Android开发中,Intent是一种非常重要的组件间通信机制。它被用来启动活动(Activity)、服务(Service)或者广播接收器(Broadcast Receiver),并且可以传递数据和执行动作。本篇文章将详细解析Intent的用法。 ...

    android intent 代码

    在Android开发中,Intent是一个非常重要的概念,它用于在组件之间传递消息,是Android系统启动服务、启动或跳转Activity的主要手段。本篇文章将详细解释Intent的基本使用以及如何通过Intent实现在两个Activities之间...

    Android应用源码之Intent1_Intent.zip

    Intent1_Intent.zip中的源码应该包含了关于Intent的实例和使用方法,让我们一起深入探讨Intent在Android应用中的作用、类型、创建与传递、以及常见用法。 1. **Intent的作用** Intent的主要功能是启动一个活动...

    android intent跳转

    ### Android Intent跳转详解 在Android开发中,`Intent`是一种非常重要的机制,它主要用于启动新的活动(Activity)或者向其他组件发送消息。通过Intent,我们可以实现Activity之间的跳转、数据传递等功能,这对于...

    Android Intent切换.rar

    在Android应用开发中,Intent是一种强大的机制,用于在应用程序组件之间进行通信,它承载着启动一个新活动(Activity)、服务(Service)或者广播接收器(Broadcast Receiver)的信息。本资源"Android Intent切换....

    android intent源码学习

    6. Intent flags:Intent还有许多标志位,如FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_CLEAR_TOP等,这些标志可以影响启动组件的方式,比如是否在新的任务栈中启动、是否清除栈顶的Activity等。 7. 源码分析:深入...

    Android整数乘法计算器(帮助理解Intent)

    除了这些基本用法,Intent还有其他高级特性,如使用FLAG_ACTIVITY_NEW_TASK启动新的任务栈,或者使用FLAG_ACTIVITY_CLEAR_TOP返回到栈顶的Activity并清空栈中的其他Activity。不过这些更复杂的用法可能不在这个初级...

    Android中使用Intent获取其他应用程序信息的方法介绍.pdf

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(android.content.Intent.ACTION_VIEW); String type = getMIMEType(f); intent.setDataAndType(Uri.fromFile(f), type); startActivity...

    Activity启动模式及Intent的Flag属性对Intent传值的影响

    在Android应用开发中,`...以上就是关于`Activity`启动模式和`Intent`的`Flag`属性对`Intent`传值的影响的详细解析,希望对你的Android开发有所帮助。在实践中,合理运用这些特性可以优化应用的流程控制和用户体验。

    android各种文件的intent

    根据提供的文件信息,我们可以深入探讨如何在Android应用中创建不同类型的文件Intent,以便与其他应用程序共享或打开特定格式的文件。 ### 一、Android中的Intent机制简介 在Android开发中,`Intent`是一种消息...

    Android应用源码之Intent.zip

    在Android应用开发中,Intent是一个至关重要的概念,它充当了应用程序组件之间通信的桥梁。Intent不仅用于启动新的活动(Activity)或服务(Service),还能在组件间传递数据。本资料"Android应用源码之Intent.zip...

    Android开发Intent的传参页面跳转

    2. 使用Flags:Intent的Flags可以控制Activity的启动行为,比如`FLAG_ACTIVITY_NEW_TASK`用于在新的任务栈中启动Activity,`FLAG_ACTIVITY_SINGLE_TOP`使得已存在的Activity不会被重新创建,而是调用`onNewIntent...

    android intent

    在Android应用开发中,Intent是一种核心机制,用于在应用程序组件之间进行通信,它扮演着连接不同活动(Activities)、服务(Services)、广播接收器(Broadcast Receivers)和内容提供者(Content Providers)的...

    Android学习总结-Intent详解.doc

    - **Flags(标志位)**:设置Intent的运行模式,比如FLAG_ACTIVITY_NEW_TASK用于在新的任务栈中启动Activity。 3. **Intent Filter匹配过程** 当使用隐式Intent时,系统会遍历所有注册了Intent Filter的组件,...

Global site tag (gtag.js) - Google Analytics