Android-intent-七大属性详解

来源:互联网 发布:基于51单片机时钟设计 编辑:程序博客网 时间:2024/06/12 00:52

http://blog.csdn.net/u012702547/article/details/50178429

http://blog.csdn.net/miao309410364/article/details/47262869

http://www.2cto.com/kf/201309/245211.html

Intent七大属性是指Intent的ComponentName、Action、Category、Data、Type、Extra以及Flag,七个属性,总体上可以分为3类:

第一类:启动,有ComponentName(显式),Action(隐式),Category(隐式)。

第二类:传值,有Data(隐式),Type(隐式),Extra(隐式、显式)。

第三类:启动模式,有Flag。

下面我们逐一来说。

1.ComponentName

Component本身有组件的意思,我们通过设置Component可以启动其他的Activity或者其他应用中的Activity,来看一个简单的实例:

启动同一个App中另外一个Activity:

[html] view plain copy
 print?
  1. intent = new Intent();  
  2.             intent.setComponent(new ComponentName(this, SecondActivity.class));  
  3.             startActivity(intent);  
这中启动方式等同于以下两种启动方式:

[html] view plain copy
 print?
  1. intent = new Intent(this,SecondActivity.class);  
  2.             startActivity(intent);  

[java] view plain copy
 print?
  1. intent = new Intent();  
  2.             intent.setClass(this, SecondActivity.class);  
  3.             startActivity(intent);  
当然,通过设置ComponentName属性我们也可以启动其他App中的Activity,关于这一块的内容大家可以参考关于ComponentName的使用。下面我们看看隐式启动。

2.Action和Category

因为在实际开发中,Action大多时候都是和Category一起使用的,所以这里我们将这两个放在一起来讲解。Intent中的Action我们在使用广播的时候用的比较多,在Activity中,我们可以通过设置Action来隐式的启动一个Activity,比如我们有一个ThirdActivity,我们在清单文件中做如下配置:

[java] view plain copy
 print?
  1. <activity  
  2.     android:name=".ThirdActivity"  
  3.     android:label="@string/title_activity_third" >  
  4.     <intent-filter>  
  5.         <category android:name="android.intent.category.DEFAULT" />  
  6.   
  7.   
  8.         <action android:name="com.qf.ThirdActivity" />  
  9.     </intent-filter>  
  10. </activity>  
当我们在清单文件中做了这样的配置之后,我们的ThirdActivity会就会响应这个动作,怎么那么怎么响应呢?看下面:

[java] view plain copy
 print?
  1. intent = new Intent();  
  2. intent.setAction("com.qf.ThirdActivity");  
  3. startActivity(intent);  
当然,我们也可以写的更简单一些,如下:

[java] view plain copy
 print?
  1. intent = new Intent("com.qf.ThirdActivity");  
  2.             startActivity(intent);  
通过这中方式我们也可以启动一个Activity,那么大家可能也注意到了,我们的清单文件中有一个category的节点,那么没有这个节点可以吗?不可以!!当我们使用这种隐式启动的方式来启动一个Activity的时候,必须要action和category都匹配上了,该Activity才会成功启动。如果我们没有定义category,那么可以暂时先使用系统默认的category,总之,category不能没有。这个时候我们可能会有疑问了,如果我有多个Activity都配置了相同的action,那么会启动哪个?看看下面这个熟悉的图片:

当我们有多个Activity配置了相同的action的时候,那么系统会弹出来一个选择框,让我们自己选择要启动那个Activity。

action我们只能添加一个,但是category却可以添加多个(至少有一个,没有就要设置为DEFAULT),如下:

[java] view plain copy
 print?
  1. <activity  
  2.     android:name=".ThirdActivity"  
  3.     android:label="@string/title_activity_third" >  
  4.     <intent-filter>  
  5.         <category android:name="android.intent.category.DEFAULT" />  
  6.         <category android:name="mycategory" />  
  7.   
  8.         <action android:name="com.qf.ThirdActivity" />  
  9.     </intent-filter>  
  10. </activity>  
相应的我们的启动方式也可以修改,如下:

[java] view plain copy
 print?
  1. intent = new Intent("com.qf.ThirdActivity");  
  2.             intent.addCategory("mycategory");  
  3.             startActivity(intent);  

3.Data

通过设置data,我们可以执行打电话,发短信,开发网页等等操作。究竟做哪种操作,要看我们的数据格式:

[java] view plain copy
 print?
  1. // 打开网页  
  2. intent = new Intent(Intent.ACTION_VIEW);  
  3. intent.setData(Uri.parse("http://www.baidu.com"));  
  4. startActivity(intent);  
  5. // 打电话  
  6. intent = new Intent(Intent.ACTION_VIEW);  
  7. intent.setData(Uri.parse("tel:18565554482"));  
  8. startActivity(intent);  
当我们的data是一个http协议的时候,系统会自动去查找可以打开http协议的Activity,这个时候如果手机安装了多个浏览器,那么系统会弹出多个浏览器供我们选择。这是我们通过设置Data来启动一个Activity,同时,我们也可以通过设置一个Data属性来将我们的Activity发布出去供别人调用,怎么发布呢?

[java] view plain copy
 print?
  1. <activity  
  2.     android:name=".HttpActivity"  
  3.     android:label="@string/title_activity_http" >  
  4.     <intent-filter>  
  5.         <action android:name="android.intent.action.VIEW" />  
  6.   
  7.         <category android:name="android.intent.category.DEFAULT" />  
  8.   
  9.         <data  
  10.             android:scheme="http" />  
  11.     </intent-filter>  
  12. </activity>  

在data节点中我们设置我们这个Activity可以打开的协议,我们这里设置为http协议,那么以后要打开一个http请求的时候,系统都会让我们选择是否用这个Activity打开。当然,我们也可以自己定义一个协议(自己定义的协议,由于别人不知道,所以只能由我们自己的程序打开)。比如下面这样:

[java] view plain copy
 print?
  1. <activity  
  2.     android:name=".HttpActivity"  
  3.     android:label="@string/title_activity_http" >  
  4.     <intent-filter>  
  5.         <action android:name="android.intent.action.VIEW" />  
  6.   
  7.         <category android:name="android.intent.category.DEFAULT" />  
  8.   
  9.         <data  
  10.             android:scheme="myhttp" />  
  11.     </intent-filter>  
  12. </activity>  
那么我们怎么打开自己的Activity呢?

[java] view plain copy
 print?
  1. intent = new Intent();  
  2.             intent.setData(Uri.parse("myhttp://www.baidu.com"));  
  3.             startActivity(intent);  
这个例子没有什么实际意义,我只是举一个自定义协议的栗子。

其实,说到这里,大家应该明白了为什么我们说data是隐式传值,比如我们打开一个网页,http协议后面跟的就是网页地址,我们不用再单独指定要打开哪个网页。

4.Type

type的存在,主要是为了对data的类型做进一步的说明,但是一般情况下,只有data属性为null的时候,type属性才有效,如果data属性不为null,系统会自动根据data中的协议来分析data的数据类型,而不会去管type,我们先来看看下面一段源码:

[java] view plain copy
 print?
  1. /** 
  2.  * Set the data this intent is operating on.  This method automatically 
  3.  * clears any type that was previously set by {@link #setType} or 
  4.  * {@link #setTypeAndNormalize}. 
  5.  * 
  6.  * <p><em>Note: scheme matching in the Android framework is 
  7.  * case-sensitive, unlike the formal RFC. As a result, 
  8.  * you should always write your Uri with a lower case scheme, 
  9.  * or use {@link Uri#normalizeScheme} or 
  10.  * {@link #setDataAndNormalize} 
  11.  * to ensure that the scheme is converted to lower case.</em> 
  12.  * 
  13.  * @param data The Uri of the data this intent is now targeting. 
  14.  * 
  15.  * @return Returns the same Intent object, for chaining multiple calls 
  16.  * into a single statement. 
  17.  * 
  18.  * @see #getData 
  19.  * @see #setDataAndNormalize 
  20.  * @see android.net.Uri#normalizeScheme() 
  21.  */  
  22. public Intent setData(Uri data) {  
  23.     mData = data;  
  24.     mType = null;  
  25.     return this;  
  26. }  
  27.   
  28. /** 
  29.  * Set an explicit MIME data type. 
  30.  * 
  31.  * <p>This is used to create intents that only specify a type and not data, 
  32.  * for example to indicate the type of data to return. 
  33.  * 
  34.  * <p>This method automatically clears any data that was 
  35.  * previously set (for example by {@link #setData}). 
  36.  * 
  37.  * <p><em>Note: MIME type matching in the Android framework is 
  38.  * case-sensitive, unlike formal RFC MIME types.  As a result, 
  39.  * you should always write your MIME types with lower case letters, 
  40.  * or use {@link #normalizeMimeType} or {@link #setTypeAndNormalize} 
  41.  * to ensure that it is converted to lower case.</em> 
  42.  * 
  43.  * @param type The MIME type of the data being handled by this intent. 
  44.  * 
  45.  * @return Returns the same Intent object, for chaining multiple calls 
  46.  * into a single statement. 
  47.  * 
  48.  * @see #getType 
  49.  * @see #setTypeAndNormalize 
  50.  * @see #setDataAndType 
  51.  * @see #normalizeMimeType 
  52.  */  
  53. public Intent setType(String type) {  
  54.     mData = null;  
  55.     mType = type;  
  56.     return this;  
  57. }  

当我们设置data的时候,系统会默认将type设置为null,当我们设置type的时候,系统会默认将data设置为null.也就是说,一般情况下,data和type我们只需要设置一个就行了,如果我们既想要设置data又想要设置type,那么可以使用
[java] view plain copy
 print?
  1. setDataAndType(Uri data, String type)  

这个方法来完成。下面我们来看看通过给Intent设置type来打开一个音乐播放器。代码如下:

[java] view plain copy
 print?
  1. intent = new Intent();  
  2.             intent.setAction(Intent.ACTION_VIEW);  
  3.             Uri data = Uri.parse("file:///storage/emulated/0/xiami/audios/被动.mp3");  
  4.             intent.setDataAndType(data, "audio/mp3");  
  5.             startActivity(intent);  
如果我们要打开的是视频文件,那么type就要设置为"video/*",其中*表示支持所有的视频文件。

5.Extra

Extra就比较好理解了,我们经常使用它来在Activity之间传递数据,Extra可以传递基本类型,String类型以及实现了Serializable或者Parcelable接口的类,具体用法不多说。


传值方法一

[java]  
Intent intent = new Intent();  
Bundle bundle = new Bundle(); //该类用作携带数据  
bundle.putString("name", "tom");   
bundle.putString("ip","8.8.8.8");  
intent.putExtras(bundle); //为Intent追加额外的数据  
 
传值方法二
[java]  
Intent intent = new Intent();  
intent.putExtra("name", "tom");   
intent.putExtra("money", 1098978009L);  
 
获取值
[java]  
Bundle bundle=getIntent().getExtras();  
String name=bundle.getString("name");

6.Flag

通过设置Flag,我们可以设定一个Activity的启动模式,这个和launchMode基本上是一样的,所以我也不再细说,关于launchMode的使用参见launchMode使用详解

先首先简单介绍下Task和Activity的关系

Task就像一个容器,而Activity就相当与填充这个容器的东西,第一个东西(Activity)则会处于最下面,最后添加的东西(Activity)则会在最上面。从Task中取出东西(Activity)是从最顶端取出,也就是说最先取出的是最后添加的东西(Activity),以此类推,最后取出的是第一次添加的Activity,而Activity在Task中的顺序是可以控制的,在Activity跳转时用到Intent Flag可以设置新建activity的创建方式;
  
Intent.FLAG_ACTIVITY_NEW_TASK

默认的跳转类型,它会重新创建一个新的Activity,不过与这种情况,比如说Task1中有A,B,C三个Activity,此时在C中启动D的话,如果在AndroidManifest.xml文件中给D添加了Affinity的值和Task中的不一样的话,则会在新标记的Affinity所存在的Task中压入这个Activity。如果是默认的或者指定的Affinity和Task一样的话,就和标准模式一样了启动一个新的Activity.

FLAG_ACTIVITY_SINGLE_TOP

这个FLAG就相当于加载模式中的singletop,比如说原来栈中情况是A,B,C,D在D中启动D,栈中的情况还是A,B,C,D

FLAG_ACTIVITY_CLEAR_TOP

这个FLAG就相当于加载模式中的SingleTask,这种FLAG启动的Activity会把要启动的Activity之上的Activity全部弹出栈空间。类如:原来栈中的情况是A,B,C,D这个时候从D中跳转到B,这个时候栈中的情况就是A,B了

FLAG_ACTIVITY_BROUGHT_TO_FRONT

这个网上很多人是这样写的。如果activity在task存在,拿到最顶端,不会启动新的Activity。这个有可能会误导大家! 他这个FLAG其实是这个意思!比如说我现在有A,在A中启动B,此时在A中Intent中加上这个标记。此时B就是以FLAG_ACTIVITY_BROUGHT_TO_FRONT方式启动,此时在B中再启动C,D(正常启动C,D),如果这个时候在D中再启动B,这个时候最后的栈的情况是 A,C,D,B。如果在A,B,C,D正常启动的话,不管B有没有用FLAG_ACTIVITY_BROUGHT_TO_FRONT启动,此时在D中启动B的话,还是会变成A,C,D,B的。

FLAG_ACTIVITY_NO_USER_ACTION

onUserLeaveHint()作为activity周期的一部分,它在activity因为用户要跳转到别的activity而要退到background时使用。比如,在用户按下Home键,它将被调用。比如有电话进来(不属于用户的选择),它就不会被调用。
那么系统如何区分让当前activity退到background时使用是用户的选择?

它是根据促使当前activity退到background的那个新启动的Activity的Intent里是否有FLAG_ACTIVITY_NO_USER_ACTION来确定的。

注意:调用finish()使该activity销毁时不会调用该函数

FLAG_ACTIVITY_NO_HISTORY

意思就是说用这个FLAG启动的Activity,一旦退出,它不会存在于栈中,比方说!原来是A,B,C这个时候再C中以这个FLAG启动D的,D再启动E,这个时候栈中情况为A,B,C,E。

**********************************************************************

Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance。以下逐一举例说明他们的区别:

standard:Activity的默认加载方法,即使某个Activity在 Task栈中已经存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入栈中。例如:现在栈的情况为:A B C D,在D这个Activity中通过Intent跳转到D,那么现在的栈情况为: A B C D D 。此时如果栈顶的D通过Intent跳转到B,则栈情况为:A B C D D B。此时如果依次按返回键,D  D C B A将会依次弹出栈而显示在界面上。

singleTop:如果某个Activity的Launch mode设置成singleTop,那么当该Activity位于栈顶的时候,再通过Intent跳转到本身这个Activity,则将不会创建一个新的实例压入栈中。例如:现在栈的情况为:A B C D。D的Launch mode设置成了singleTop,那么在D中启动Intent跳转到D,那么将不会新创建一个D的实例压入栈中,此时栈的情况依然为:A B C D。但是如果此时B的模式也是singleTop,D跳转到B,那么则会新建一个B的实例压入栈中,因为此时B不是位于栈顶,此时栈的情况就变成了:A B C D B。

singleTask:如果某个Activity是singleTask模式,那么Task栈中将会只有一个该Activity的实例。例如:现在栈的情况为:A B C D。B的Launch mode为singleTask,此时D通过Intent跳转到B,则栈的情况变成了:A B。而C和D被弹出销毁了,也就是说位于B之上的实例都被销毁了。

singleInstance:将Activity压入一个新建的任务栈中。例如:Task栈1的情况为:A B C。C通过Intent跳转到D,而D的Launch mode为singleInstance,则将会新建一个Task栈2。此时Task栈1的情况还是为:A B C。Task栈2的情况为:D。此时屏幕界面显示D的内容,如果这时D又通过Intent跳转到D,则Task栈2中也不会新建一个D的实例,所以两个栈的情况也不会变化。而如果D跳转到C,则栈1的情况变成了:A B C C,因为C的Launch mode为standard,此时如果再按返回键,则栈1变成:A B C。也就是说现在界面还显示C的内容,不是D。
好了,现在有一个问题就是这时这种情况下如果用户点击了Home键,则再也回不到D的即时界面了。如果想解决这个问题,可以为D在Manifest.xml文件中的声明加上
                                                 
                                                 
                                              

加上这段之后,也就是说该程序中有两个这种声明,另一个就是那个正常的根 activity,在打成apk包安装之后,在程序列表中能看到两个图标,但是如果都运行的话,在任务管理器中其实也只有一个。上面的情况点击D的那个图标就能回到它的即时界面(比如一个EditText,以前输入的内容,现在回到之后依然存在)。

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

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将不存在了。



Using the manifest file

当在manifest文件中声明activity时,可以指定这个activity开启时如何与当前task关联。

<activity>标签的launchMode属性可以设置为四种不同的模式:

    “standard”(默认模式)

    “singleTop”

    “singleTask”

    “singleInstance”

    这几种模式的区别体现以下四点上:

    1)当这个activity被激活的时候,会放入哪个任务栈。

    对于“standard”和“singleTop”模式,这个新被激活的activity会放入和之前的activity相同的任务栈中――除非Intent对象包含FLAG_ACTIVITY_NEW_TASK标志。

    “singleTask并不会每次都新启动一个task。如果已经存在一个task与新activity亲和度(taskAffinity)一样,则activity将启动到该task。如果不是,才启动一个新task。同一个application里面,每个activity的taskAffinity默认都是一样的

    “singleInstance”模式则表示这个新被激活的activity会重新开启一个任务栈,并作为这个新的任务栈的唯一的activity。

    2)是否可以存在这个activity类型的多个实例。

    对于“standard”和“singleTop”模式,可以有多个实例,并且这些实例可以属于不同的任务栈,每个任务栈也可以包含有这个activity类型的多个实例。 

  “singleTop"要求如果创建intent的时候栈顶已经有要创建 的Activity的实例,则将intent发送给该实例,而不发送给新的实例。 

  singleTask”和”singleInstance”则限制只生成一个实例。

  3)包含此activity的任务栈是否可以包含其它的activity。

    “singleInstance”模式表示包含此activity的任务栈不可以包含其它的activity。若此activity启动了另一个activity组件,那么无论那个activity组件的启动模式是什么或是Intent对象中是否包含了FLAG_ACTIVITY_NEW_TASK标志,它都会被放入另外的任务栈。在其它方面“singleInstance”模式和“singleTask”模式是一样的。

    其余三种启动模式则允许包含此activity的任务栈包含其它的activity。

    4)是否每次都生成新实例

    对于默认的“standard”模式,每当响应一个Intent对象,都会创建一个这种activity类型的新的实例。即每一个activity实例处理一个intent。

    对于“singleTop”模式,只有当这个activity的实例当前处于任务栈的栈顶位置,则它会被重复利用来处理新到达的intent对象。否则就和“standard”模式的行为一样。

    “singleInstance”是其所在栈的唯一activity,它会每次都被重用。

     对于“singleTask”模式的acitvity,在其上面可能存在其它的activity组件,所以它的位置并不是栈顶,在这种情况下,intent对象会被丢弃。(虽然会被丢弃,但是这个intent对象会使这个任务栈切换到前台)

    注意:

    当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法 
若为了处理一个新到达的intent对象而创建了一个activity实例,则用户按下“BACK”键就会退到之前的那个activity。但若这个新到达的intent对象是由一个已经存在的activity组件来处理的,那么用户按下“BACK” 键就不会回退到处理这个新intent对象之前的状态了。



Using Intent flags

当开启一个activity时,可以通过在intent中包含标志来修改activity的默认的与当前task的关联,然后将该intent传递给startActivity().可以修改的默认的标志为:

  • FLAG_ACTIVITY_NEW_TASK
    在一个新的task中开启一个activity。如果包含该activity的task已经运行,该task就回到前台,activity通过onNewIntent()接受处理该intent。

    这是与"singleTask"登录模式相同的行为。
  • FLAG_ACTIVITY_SINGLE_TOP
    如果要被开启的activity是当前的activity(在返回栈的顶部),已经存在的实例通过onNewIntent()接收一个调用,然后处理该intent,而非重新创建一个新的实例。

    这与"singleTop"登录模式有相同的行为。
  • FLAG_ACTIVITY_CLEAR_TOP
    如果要被开启的activity已经在当前的task中运行,系统不会生成该activity的一个新的实例,在该栈顶部的所有其他的activity会被销毁,这个intent通过 onNewIntent()被传递给该重新运行的activity的实例(现在在栈顶部)。
    manifest中没有相对应的属性。

    FLAG_ACTIVITY_CLEAR_TOP经常和FLAG_ACTIVITY_NEW_TASK一起使用.当一起使用时,这些标志可以确定一个存在的activity在另一个task中的位置,并且将其放置于可以响应intent的位置(FLAG_ACTIVITY_NEW_TASK确定该activity,然后FLAG_ACTIVITY_CLEAR_TOP销毁顶部其他的activity)。如果指定的activity的登录模式是"standard",也会被从栈中移除,一个新的实例也会被登录到它的位置来处理到来的intent。那是因为当登录模式为 "standard"时,一个新的实例总是被创建

 注意: 其实以上的解释一起用非常复杂,比如一般系统默认activity是 standard,但当我activity代码设置为FLAG_ACTIVITY_NEW_TASK时仍然还是生成新的activity,当设置FLAG_ACTIVITY_CLEAR_TOP 时也是生成新的activity,当FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_NEW_TASK时也是生成新的activity,或许这句好是经典“登录模式为 "standard"时,一个新的实例总是被创建”,以下的两种方式是我经常用的。

     

Activity的两种启动模式:FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_FRONT

1. 如果已经启动了四个Activity:A,B,C和D。在D Activity里,我们要跳到B Activity,同时希望C finish掉,可以在startActivity(intent)里的intent里添加flags标记,如下所示:

  1. Intent intent = new Intent(this, B.class);    
  2. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);   
  3. startActivity(intent);  

  这样启动B Activity,就会把D,C都finished掉,如果你的B Activity的启动模式是默认的(multiple ,则B Activity会finished掉,再启动一个新的Activity B。

  如果不想重新再创建一个新的B Activity,则在上面的代码里再加上:

  1. intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  

 这样B Activity就会再创建一个新的了,而是会重用之前的B Activity,同时调用B Activity的onNewIntent()方法。

2. 如果已经启动了四个Activity:A,B,C和D,在D Activity里,想再启动一个Actvity B,但不变成A,B,C,D,B,而是希望是A,C,D,B,则可以像下面写代码:

  1. Intent intent = new Intent(this, MainActivity.class);   
  2. intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);    
  3. startActivity(intent);   



0 0
原创粉丝点击