Android 中Activity 的启动模式

standard:Activity的默认加载方式,该方法会通过跳转到一个新的Activity,同时将该实例压入到栈中(不管该Activity是否已经存在在Task栈中,都是采用new操作,生命周期从onCreate()开始)。例如:栈中顺序是A B C D,此时D通过Intent跳转到A,那么栈中结构就变成A B C D A,点击返回按钮的显示顺序是D C B A,依次摧毁。


singleTop:singleTop模式下,当前Activity D位于栈顶的时候,如果通过Intent跳转到它本身的Activity(D),那么不会重新创建一个新的D实例(走onNewIntent()),所以栈中的结构依次为A B C D,如果跳转到B,那么由于B不处于栈顶,所以会新建一个B实例并压入到栈中,结构就变成了A B C D B。应用实例:三条推送,点进去都是一个Activity,这肯定用singletop!


singleTask:singleTask模式下,Task栈中只能有一个对应的Activity实例。例如:Task栈1中结构为:A B C D。此时D通过Intent跳转到B(走onNewIntent()),则栈的结构变成了:A,B。其中的C和D被栈弹出销毁了,也就是说位于B之上的实例都被销毁了。通常应用于首页,首页肯定在栈底部,也只能在栈底部。


singleInstance:singleInstance模式下,会将打开的Activity压入一个新的任务栈中。例如:Task栈1中结构为:A B C,C通过Intent跳转到了D(D的模式为singleInstance),那么则会新建一个Task,栈1中结构依旧为A B C,栈2中结构为D。此时屏幕显示D,之后D通过Intent跳转到D,栈2不会压入新的D,所以两个栈中的情况没发生改变。如果D跳转到了C,那么就会根据C对应的launchMode在栈1中进行对应的操作,C如果为standard,那么D跳转到C,栈1的结构为A B C C ,此时点击返回按钮,还是在C,栈1的结构变为A B C,而不会回到D。


launchMode为singleTask的时候,通过Intent启动到一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这个时候,系统就不会再调用通常情况下我们处理请求数据的onCreate方法,而不是调用onNewIntent方法。


onSavedInstanceState的调用遵循一个重要原则,即当系统”未经你许可”时销毁了你的Activity,则onSavedInstanceState会被系统调用,这时系统的责任,因为它必须要提供一个机会让你保存你的数据,至于onRestoreInstanceState方法,需要注意的是,onSavedInstanceState方法和onRestoreInstanceState方法”不一定”是成对调用的。


onRestoreInstanceState被调用的前提是,Activity A确实被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示Activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到Activity A,这种情况下Activity A一般不会因为内存的原因被销毁,故Activity的onRestoreInstanceState方法不会被执行。


另外,onRestoreInstanceStated的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。

onSavedInstanceState(Bundle bundle)通常和onRestoreInstanceState(Bundle bundle)不会成对出现,onRestoreInstanceState这玩意不太好触发,给大家提个好办法,横竖屏切换的时候100%会触发。然后保存在onRestoreInstanceState bundle里面的数据,就是onCreate的那个参数bundle啦,要怎么恢复就看开发者自己决定了。

猜你喜欢

转载自blog.csdn.net/Angle0306/article/details/72625755