`
hellobin
  • 浏览: 65876 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

android之intent的Flag详解

 
阅读更多

 

1.Task是包含一系列Activity的堆栈,遵循先进后出原则.

2.Task默认行为:

(1)前提:ActivityA和ActivityB在同一个应用中.

操作:ActivityA启动开僻Task堆栈(堆栈状态:A),在ActivityA中启动ActivityB(堆栈状态:AB),按下BACK返回键(堆栈状态:A).

(2)前提:ActivityA和ActivityB在同一个应用中,应用名称为"TaskOne应用".

操作:在Launcher中单击"TaskOne应用"图标,ActivityA启动开僻Task堆栈,命名为TaskA(TaskA堆栈状态:A),

在ActivityA中启动ActivityB(TaskA堆栈状态:AB),长按Home键,返回Launcher,启动其它应用(如:电子书),

开僻一个新Task堆栈,命名:TaskB,长按Home健,返回Launcher,单击"TaskOne应用"图标,此时TaskA堆栈返回前台,

ActivityB为栈顶应用,供用户使用.

(3)前提:ActivityA在名称为"TaskOne应用"的应用中,ActivityC在名称为"TaskTwo应用"的应用中.

操作:在Launcher中单击"TaskOne应用"图标,ActivityA启动开僻Task堆栈,命名为TaskA(TaskA堆栈状态:A),

在ActivityA中启动ActivityC(TaskA堆栈状态:AC),长按Home键,返回Launcher,启动"TaskTwo应用"即ActivityC,

开僻新的Task堆栈,命名为TaskB,按BACK键返回Launcher,单击"TaskOne应用"图标,此时TaskA堆栈返回前台,

ActivityB为栈顶应用,供用户使用.

3.IntentFLAG介绍:

(1)FLAG_ACTIVITY_NEW_TASK:设置此状态,记住以下原则,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性一样,所以下面的a情况会在同一个栈中,前面这句话有点拗口,请多读几遍),如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity

a.前提:ActivityA和ActivityB在同一个应用中.

操作:ActivityA启动开僻Task堆栈(堆栈状态:A),在ActivityA中启动ActivityB,启动ActivityB的Intent的Flag设为

FLAG_ACTIVITY_NEW_TASK,ActivityB被压入ActivityA所在堆栈(堆栈状态:AB).

原因:默认情况下同一个应用中的所有Activity拥有相同的关系(taskAffinity).

b.前提:ActivityA在名称为"TaskOne应用"的应用中,ActivityC和ActivityD在名称为"TaskTwo应用"的应用中.

操作1:在Launcher中单击"TaskOne应用"图标,ActivityA启动开僻Task堆栈,命名为TaskA(TaskA堆栈状态:A),

在ActivityA中启动ActivityC,启动ActivityC的Intent的Flag设为FLAG_ACTIVITY_NEW_TASK,

Android系统会为ActivityC开僻一个新的Task,命名为TaskB(TaskB堆栈状态:C),长按Home键,选择TaskA,

ActivityA回到前台,再次启动ActivityC(两种情况1.从桌面启动;2.从ActivityA启动,两种情况一样),这时TaskB回到前台,ActivityC显示,供用户使用,即:

包含FLAG_ACTIVITY_NEW_TASK的Intent启动Activity的Task正在运行,则不会为该Activity创建新的Task,

而是将原有的Task返回到前台显示.

操作2:在Launcher中单击"TaskOne应用"图标,ActivityA启动开僻Task堆栈,命名为TaskA(TaskA堆栈状态:A),

在ActivityA中启动ActivityC,启动ActivityC的Intent的Flag设为FLAG_ACTIVITY_NEW_TASK,

Android系统会为ActivityC开僻一个新的Task,命名为TaskB(TaskB堆栈状态:C),在ActivityC中启动

ActivityD(TaskB的状态:CD)长按Home键,选择TaskA,ActivityA回到前台,再次启动ActivityC(从桌面或者ActivityA启动,也是一样的),

这时TaskB回到前台,ActivityD显示,供用户使用.说明了在此种情况下设置FLAG_ACTIVITY_NEW_TASK后,会先查找是不是有ActivityC存在的栈,根据亲和             性(taskAffinity),如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的顺序不变

(2)FLAG_ACTIVITY_CLEAR_TOP:

前提:ActivityA,ActivityB,ActivityC和ActivityD在同一个应用中.

操作:ActivityA启动开僻Task堆栈(堆栈状态:A),在ActivityA中启动ActivityB(堆栈状态:AB),在ActivityB中启动

ActivityC(堆栈状态:ABC),在ActivityC中启动ActivityD(堆栈状态:ABCD),在ActivityD中启动ActivityB,

启动ActivityB的Intent的Flag设置为FLAG_ACTIVITY_CLEAR_TOP,(堆栈状态:AB).

(3)FLAG_ACTIVITY_BROUGHT_TO_FRONT:

前提:ActivityA在名称为"TaskOne应用"的应用中,ActivityC和ActivityD在名称为"TaskTwo应用"的应用中.

操作:在Launcher中单击"TaskOne应用"图标,ActivityA启动开僻Task堆栈,命名为TaskA(TaskA堆栈状态:A),

在ActivityA中启动ActivityC,启动ActivityC的Intent的Flag设为FLAG_ACTIVITY_NEW_TASK,

Android系统会为ActivityC开僻一个新的Task,命名为TaskB(TaskB堆栈状态:C),在ActivityC中启动

ActivityD(TaskB的堆栈状态:CD),长按Home键,选择TaskA,ActivityA回到前台,在ActivityA中再次启动ActivityC,

在启动ActivityC的Intent中设置Flag为FLAG_ACTIVITY_BROUGHT_TO_FRONT,TaskB回到前台,

ActivityC显示,(TaskB的堆栈状态:C).

(4)FLAG_ACTIVITY_MULTIPLE_TASK:

与FLAG_ACTIVITY_NEW_TASK结合使用,首先在Intent中设置FLAG_ACTIVITY_NEW_TASK,打开Activity,

则启动一个新Task,接着在Intent中设置FLAG_ACTIVITY_MULTIPLE_TASK,再次打开同一个Activity,则还会新启动一个Task.

(5)FLAG_ACTIVITY_SINGLE_TOP:

当前Task堆栈中存在ABCD四个Activity,A是栈顶Activity,D为栈底Activity,存在打开A的Intent中设置了

FLAG_ACTIVITY_SINGLE_TOP标志,则会使用栈顶A,而不会从新NewA.

(6)FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:

例:存在ActivityA,ActivityB,ActivityC,ActivityA启动开僻Task堆栈,命名为TaskA(TaskA堆栈状态:A),

在ActivityA中启动ActivityB(TaskA堆栈状态:AB),接着ActivityB启动ActivityC(TaskA堆栈状态:ABC),

启动ActivityC的Intent中设置FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET标题,这样TaskA中有一个还原点,

当有包含FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的Intent请求TaskA堆栈时(比如请求ActivityA)

系统就会将还原点以上的Activity清除,TaskA堆栈中只剩下了AB.

4.launchMode介绍:

(1)standard:

如果启动此Activity的Intent中没有设置FLAG_ACTIVITY_NEW_TASK标志,则这个Activity与启动他的Activity在同一个Task中,

如果设置了Activity请参考上面FLAG_ACTIVITY_NEW_TASK的詳細说明,"launchMode"设置为"standard"的

Activity可以被实例化多次,可以在Task中的任何位置,对于一个新的Intent请求就会实例化一次.

(2)singleTop:

如果启动此Activity的Intent中没有设置FLAG_ACTIVITY_NEW_TASK标志,则这个Activity与启动他的Activity在同一个Task中,

如果设置了Activity请参考上面FLAG_ACTIVITY_NEW_TASK的詳細说明,"launchMode"设置为"singleTop"的Activity可以被

实例化多次,可以在Task中的任何位置,对于一个新的Intent请求如果在Task栈顶,则会用栈顶的Activity响影Intent请求,

而不会重新实例化对象接收请求,如果没有在栈顶,则会实例化一个新的对象接收Intent请求.

(3)singleTask:

"launchMode"设置为"singleTask"的Activity总是在栈底,只能被实例化一次,它允许其它Activity压入"singleTask"的Activity

所在的Task栈,如果有新的Intent请求有此标志的Activity,则系统会清除有此标志的Task栈中的全部Activity,并把此Activity显示出来.

(4)singleInstance:

launchMode"设置为"singleInstance"的Activity总是在栈底,只能被实例化一次,不允许其它的Activity压入"singleInstance"

的Activity所在Task栈,即整个Task栈中只能有这么一个Activity.

5.taskAffinity属性:

(1)taskAffinity属性应和FLAG_ACTIVITY_NEW_TASK标志及allowTaskReparenting属性结合使用,如果只使用taskAffinity属性,

请参考上面Task默认的行为.

(2)与FLAG_ACTIVITY_NEW_TASK标志结合:

a.前题:ActivityA和ActivityB在同一个应用中,ActivityA与ActivityB设置不同的taskAffinity属性.

操作:ActivityA启动开僻Task堆栈,命名为TaskA(TaskA堆栈状态:A),在ActivityA中启动ActivityB,启动ActivityB

的Intent中设置FLAG_ACTIVITY_NEW_TASK标志,这时系统会新开僻一个Task堆栈,TaskB(TaskB堆栈状态:B).

b.前题:ActivityA在"TaskOne应用"中,ActivityC在"TaskTwo应用"中,ActivityA和ActivityC设置了相同的taskAffinity属性.

操作:ActivityA启动开僻Task堆栈,命名为TaskA(TaskA堆栈状态:A),在ActivityA中启动ActivityC,启动ActivityC的

Intent中设置FLAG_ACTIVITY_NEW_TASK标志,这时ActivityC会压入与ActivityA堆栈相同的TaskA堆栈(TaskA堆栈状态:AC).

(3)与allowTaskReparenting属性:

例:在"TaskOne应用"中有一个天气预报ActivityA,ActivityA与"TaskOne应用"中的其它Activity有默认的关系

(taskAffinity属性都没有设置),并且allowTaskReparenting属性设置为true,现在存在一个"TaskTwo应用

"启动了"TaskOne应用"中的天气预报ActivityA,这时ActivityA与"TaskTwo应用"中的Activity在同一个Task,

命名这个Task堆栈为TaskA,这时"TaskOne应用"启动,并且又打开发天气预报ActivityA,这时ActivityA会从TaskA堆栈中转移到

"TaskOne应用"所在的堆栈,即ActivityA可以在多个堆栈中来回转移.
6.alwaysRetainTaskState属性:

如果Task堆栈中的RootActivity设置了此属性值为true,不管出现任何情况,一直会保留Task栈中Activity的状态.

7.clearTaskOnLaunch属性:

如果Task堆栈中的RootActivity设置了此属性值为true,只要你一离开这个Task栈,则系统会马上清理除了RootActivity的全部Activity.

8.finishOnTaskLaunch属性:

如果某Activity设置了finishOnTaskLaunch属性,只要你一离开这个Task栈,则系统会马上清除这个Activity,

不管这个Activity在堆栈的任何位置.

 

 

http://hi.baidu.com/jieme1989/item/6e5f41d3f65be848ddf9beb9

分享到:
评论

相关推荐

    android各组件详解- Intent.

    标题与描述均指向了“Android各组件详解——Intent”,这一主题深入探讨了Android开发中至关重要的Intent组件。本文将从多个角度解析Intent的功能、应用场景及其内部结构,为开发者提供全面的理解。 ### Intent概述...

    Android学习总结-Intent详解.doc

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

    android intent跳转

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

    《intent详解(二)》源码

    Intent详解(二)源码分析 Intent在Android系统中扮演着至关重要的角色,它是应用程序间通信(IPC,Inter-Process Communication)的主要手段。Intent不仅用于启动活动(Activity)、服务(Service),还可以用来...

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

    ### Android用于打开各种文件的Intent知识点详解 #### 一、概述 在Android开发过程中,我们经常需要使用`Intent`来启动应用内的特定功能或者跳转到其他应用来处理某些文件类型(如PDF、PPT、Word文档等)。本文将...

    android基础总结篇之九:Intent应用详解

    Intent的Flags可以设置一些特殊行为,如`FLAG_ACTIVITY_NEW_TASK`用来开启新的任务栈,或者`FLAG_ACTIVITY_CLEAR_TOP`用于清除栈顶所有活动并返回到指定Activity。 6. Broadcast(广播) Intent同样用于发送...

    Android NFC开发实战详解

    ### Android NFC开发实战详解 #### 一、NFC技术简介 近场通信(Near Field Communication,简称NFC)是一种短距离无线通信技术,允许电子设备在几厘米的距离内进行数据交换。NFC技术最初由飞利浦公司和诺基亚公司...

    Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags()

    ### Android Activity 的四种启动模式与 Intent.setFlags()详解 #### 一、Android Activity 四种启动模式 在 Android 应用开发中,Activity 是构成应用的基本单元之一,它负责显示用户界面并处理用户交互。为了更...

    android activity启动模式详解

    此外,还可以通过Intent的FLAG_ACTIVITY_*系列标志来动态控制启动行为,比如FLAG_ACTIVITY_NEW_TASK或FLAG_ACTIVITY_SINGLE_TOP。 理解并灵活运用这些启动模式,可以帮助开发者更好地控制Activity的生命周期,提高...

    详解Android中通过Intent类实现组件间调用的方法

    例如,FLAG_ACTIVITY_NEW_TASK用于在新的任务栈中启动Activity,FLAG_ACTIVITY_CLEAR_TOP则会清除当前Activity之上的所有Activity,然后重新启动指定的Activity。 在处理Intent时,Android系统会根据Intent的内容和...

    Android开发笔记之:Splash的实现详解

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); overridePendingTransition(R.anim.activity_in, R.anim.splash_out); } }; @Override public void onCreate(Bundle icicle) { ...

    Android Task 进程与线程详解

    在 Android 中,每一个 Activity 的 Task 模式,都是可以由 Activity 提供方(通过配置文件)和 Activity 使用方(通过 Intent 中的 flag 信息)进行配置和选择。使用方对 Activity 的控制力,是限定在提供方允许的...

    详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限

    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i); } }); AlertDialog alertDialog = builder.create(); ``` 2. 设置对话框属性,使其成为全局对话框: ```java alertDialog.setCancelable(false); ...

    Android开发指南详解中文版.doc

    `Intent`是Android中的一个关键概念,它用于启动或激活组件,比如打开一个新的Activity或启动一个Service。Intent可以显式指定目标组件,也可以隐式发布,让系统根据Intent的过滤器选择合适的接收者。Intent通常包含...

    Android版本更新实例详解

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } ``` 这个方法通过`ACTION_VIEW`意图和指定的文件类型(Apk文件),让用户确认并安装下载好的Apk包。同时,设置`FLAG_ACTIVITY_NEW_...

    Android开机自动运行一个程序教程

    ### Android开机自动运行程序详解 #### 一、引言 在Android开发中,有时我们需要让应用程序在设备开机后自动启动,比如实现某些后台服务(如天气预报应用、新闻客户端等)能够在用户未手动启动的情况下自动从网络...

    详解Android应用开发中Intent的作用及使用方法

    总的来说,Intent是Android框架的核心机制之一,它使得组件间的通信变得简单而高效。理解并熟练掌握Intent的使用,对于开发高质量的Android应用至关重要。在实际编程中,应充分利用Intent的各种特性,如使用FLAG_...

    Android Notification 使用方法详解

    Android Notification 使用方法详解 Android Notification 是 Android 系统中的一种重要组件,用于向用户显示重要信息和提示。Android Notification 使用方法详解中,我们将介绍如何使用 Android Notification ...

    Android中NFC编程

    ### Android中NFC编程知识点详解 #### 一、NFC技术概述 近场通信(Near Field Communication,简称NFC)是一种短距离高频的无线电技术,在十厘米范围内支持非接触式识别和互连技术。NFC使得移动终端可以实现点对点...

Global site tag (gtag.js) - Google Analytics