当前位置:   article > 正文

Activity在不同场景以及四种启动模式下的生命周期变化_activity生命周期状态切换的3个应用场景

activity生命周期状态切换的3个应用场景

Activity在不同场景以及四种启动模式下的生命周期变化

前言

最近面试问到了一些生命周期的问题。之前在项目里也会遇到对生命周期认识不全,而导致的bug。找了个时间写了个demo验证了一下,因此这里对几种情况做一下总结。

1.息屏以及按下Home键的情况

当前页面为Activity A,当我们息屏再重新亮屏,或者按下Home键,再重新进入应用时(应用没被杀后台的前提下)。

onPause() -> onStop() -> onRestart() ->onStart() ->onResume()

这种情况下,与Activity A的启动模式无关

2.自启的情况

假设Activity A位于栈顶,此时再启动Activity A。此时生命周期的改变会受启动模式的影响

如果Activity A的启动模式是 Standard:

onPause() ->onCreate()->onStart() ->onResume() ->onStop()

如果Activity A的启动模式是 SingleTopSingleTask 或者 SingleInstance的话:

onPause() -> onNewIntent() -> onResume()

简单分析:

会出现这种不同,是因为在自启的情况下,Standard这种模式,不会复用Activity,会直接再创建一个Activity(注意:原来的Activity A没有被删除,意味着栈里有两个Activity A)。而其他三种启动模式都会复用Activity,且由于页面没有变化,所以也不会调用onRestart()方法

3. A启动B,B又启动A的情况

Activity启动的场景可能非常多,但主要分析 A -> B ->A,这种情况,就能举一反三,进一步分析其他问题了

Activity A的启动模式是Standard

此种情况下,无论 Activity B的启动模式是什么,生命周期的变化都是一样的

A -> B: A onPause() ->B onCreate()->B onStart() ->B onResume() ->A onStop()

B -> A: B onPause() ->A onCreate()->A onStart() ->A onResume() ->B onStop()

简单说明:

在该场景下,没有出现复用Activity的情况,因此生命周期的变化都是一样的。

Activity A的启动模式是SingleTop

此种情况下,如果Activity B的启动模式是StandardSingleTop或者SingleTask,那么和A是Standard的情况下的生命周期的变化是一样的。

A -> B: A onPause() ->B onCreate()->B onStart() ->B onResume() ->A onStop()

B -> A: B onPause() ->A onCreate()->A onStart() ->A onResume() ->B onStop()

如果Activity B的启动模式是SingleInstance,那么 B -> A时候的生命周期会有些不同:

B -> A: B onPause() ->A onRestart() ->A onStart() ->A onNewIntent() -> A onResume() ->B onStop()

简单说明:

只有在SIngleInstance的情况下,才会出现复用Activity A的情况下。注意,此时 A 和 B都处于两个不同的栈中

Activity A的启动模式是SingleTask

此种情况下,A -> B的过程,其实都是一样的,可以参考上面说到的情况,主要会出现不一致的就是 B->A这一步。

如果Activity B的启动模式是StandardSingleTop或者SingleTask,那么此时生命周期的变化是一致的

B -> A: B onPause() ->A onRestart() ->A onStart() ->A onNewIntent() -> A onResume() ->B onStop() ->B onDestroy()

如果Activity B的启动模式是 SingleInstance:

B -> A: B onPause() ->A onRestart() ->A onStart() ->A onNewIntent() -> A onResume() ->B onStop()

简单分析:

在B->A的这个过程中,当B的启动模式是SingleInstance时,A其实位于栈顶,所以可以直接复用。其他三种情况,A位于栈中,但不位于栈顶。由于SingleTask复用栈内的Activity,会把位于A上面的Activity统统出栈。因此 B在onStop()后,还会调用onDestroy().

Activity A的启动模式是SingleInstance

此种场景,无论Activity B的启动模式是啥,生命周期的变化都是一致的。

A -> B: A onPause() ->B onCreate()->B onStart() ->B onResume() ->A onStop()

B -> A: B onPause() ->A onRestart() ->A onStart() ->A onNewIntent() -> A onResume() ->B onStop()

简单分析:

由于A独占一个活动栈,因此无论B的启动模式是哪种,A都会位于栈顶,并且能够复用。

4.切换深色模式

如果当前页面为Activity A,此时切换深色模式,Activity A的生命周期的变化如下:

onPause() -> onStop() ->onDestroy() ->onCreate()->onStart() ->onResume()

demo地址

验证所用的demo程序的地址:lifeTest: 生命周期相关问题验证demo (gitee.com)

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号