Android Intend FLAG用法整理

这两种加载模式的Activity的四种加载方式:



1.Activity可位于任何Task、任何位置 
standard:默认方式,调用即创建新实例。 
singleTop:实例不在顶端时,才创建新实例。 
2.只实例化一次,且始终在顶?端 
singleTask: Task中唯一实例,其他实例在其他任务中 
(-存在该实例,即重用实例–>将上面的实例移出堆栈 
-不存在该实例,即创建新的实例放入栈中)//常用于应用加密 
singleInstance:独立在一个Activity中 //a–>b–>c(return 返回a)区别:

假设一个Activity的实例A 采用如下两种加载模式:

singleTask:如果A调用startActivity(B)启动B实例, 则A和B位于同一个task中。

singleInstance:如果A调用startActivity(B)启动B实例, 则系统会自动给intent添加一个属性FLAG_ACTIVITY_NEW_TASK, 将B实例放入到一个新的task中, 也就是说A实例所在的task中只能有A自己, 不能存在其他实例

=====================================================================

/*什么是Affinity

       在某些情况下,Android需要知道一个Activity属于哪个Task,即使它没有被启动到一个具体的Task里。这是通过任务共用性(Affinities)完成的。任务共用性(Affinities)为这个运行一个或多个Activity的Task提供了一个独特的静态名称,默认的一个活动的任务共用性(Affinity)是实现了该Activity的.apk包的名字。*/

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了//当要启动的Activity已经存在当前Task中,才会在启动的时候销毁其他的Activity


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。

你可能感兴趣的:(AndroidIntent)