Android Activity's launchMode

Android Activity有四种launchMode分别是standard,singleTop,singleTask,singleInstance.

standard

默认Activity加载模式,当启动一个Activity就会重新创建这个Activity的实例(不管当前栈中有没有该Activity)并压入栈顶

singleTop

当要创建的Activity在栈顶,则该Activity不会被创建,会调用栈顶Activity的onNewIntent()。因此在使用singleTop时需要在onCreate()和onNewIntent()中处理intent

singleTask

在系统中一个Activity只能有一个实例,当要创建的Activity已经在栈中,则会pop出在它之上的Activity并detroy,然后调用onNewIntent();如果Activity不在栈中会创建新的压入栈顶

singleInstance

在系统中一个Activity只能有一个实例并且所在Task的栈中只能有该Activity,当要启动另一个Activity,则会创建一个新的Task将新Activity压入新Task的栈中

点击Home键再返回App - Activity恢复问题

  • 当singleTask Activity为LAUNCHER,Activity恢复时会将singleTask Activity之上的Activity都pop出。比如,有两个Activity A和B,A为singleTask并且为LAUNCHER,App启动后从A进入B -> 点击Home -> 打开App -> A恢复,B不可见

  • 当singleTask Activity不为LAUNCHER,Activity恢复按照栈顺序恢复,比如,有三个Activity A,B,C,其中A为LAUNCHER,B为singleTask,App启动后从A进入B -> B进入C -> 点击Home -> 打开App -> C恢复

  • 当singleInstance Activity为LAUNCHER,Activity恢复时只会恢复该singleInstance Activity

  • 当singleInstance Activity不为LAUNCHER,Activity恢复会按照LAUNCHER Activity所在Task栈中的Activity顺序恢复。比如,A为LAUNCHER,B为singleInstance,C为standard,App启动 -> A进入B -> B进入C -> 点击Home -> 打开App -> C恢复 -> 点击back -> A恢复 -> 点击back -> 退出App;App启动 -> A进入B -> 点击Home -> 打开App -> A恢复 - > 点击back -> 退出App

  • 总结:当点击Home键再返回App,Activity恢复会按照LAUNCHER Activity所在Task栈中的Activity顺序恢复

    • 当LAUNCHER Activity为singleInstance或singleTask的时候,只会恢复该LAUNCHER Activity,对于singleTask会将在其上的所有Activity都pop出并destroy,而对于singleInstance栈中只会有它一个Activity;
    • 当LAUNCHER Activity为普通Activity的时候,Activity按栈顺序恢复

测试Demo

Launch Mode Test Demo