Activity启动模式及Intent 常用Flag

来源:互联网 发布:淘宝上好看的女装店 编辑:程序博客网 时间:2024/05/23 15:39

Activity启动模式共有四种

standard:Activity的默认启动模式,无论栈中是否存在某个Activity实例,另一个activity通过Intent跳转到该Activity,都会重新创建一个该Activity实例压入栈顶中。例如,现在栈内有 A B C D,在D中,以默认模式启动B,B在以默认模式启动D,则栈情况为:A B C D B D,依次按返回键B 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。在该模式下启动Activity会调用onNewIntent方法,而不是onCreate。

singleTask:如果某个Activity的Launch mode设置成singleTask,那么该Activity在栈中只能存在一个实例,如果该Activity的实例已经存在,再次启动该Activity时,会将实例从栈底拿到栈顶,并销毁其之上的所有Activity。例如:现在栈的情况为A B C D。B的Launch mode为singleTask,此时D通过Intent跳转到B,则栈的情况变成了:A 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。

Intent 常用Flag

  • FLAG_ACTIVITY_NEW_TASK
    默认的跳转类型,标记该FLAG的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_NO_HISTORY
    用这个FLAG启动的Activity,一旦离开栈顶,就不会存在于栈中,例如:原来是A B C,这个时候在C中以这个FLAG启动D的 , D再正常启动E,这个时候栈中情况为A B C E。

  • FLAG_ACTIVITY_NO_ANIMATION
    用这个FLAG启动的Activity,不会产生Activity切换动画。这个FLAG需要注意的是:不要调用finish()方法,否则Activity还是使用默认的跳转效果。

  • FLAG_ACTIVITY_BROUGHT_TO_FRONT
    重新创建一个新的Activity(即便堆栈中已经存在这个Activity),并提到栈顶。比如,A B C D都是标准加载,然后我在D中启动A,这个intent加上该FLAG,此时栈内情况为A B C D A。

  • FLAG_ACTIVITY_REORDER_TO_FRONT
    如果栈里已经存在,则将它拿到栈顶,不会启动新Activity。比如栈中有A,B,C三个Activity。此时在C中启动A的话,这时候栈的顺序为B,C,A。