Android开发小记--Activity生命周期和启动模式

本文详细介绍了Android中Activity的生命周期,包括onCreate、onStart、onResume、onPause、onStop和onDestroy等各个阶段的执行顺序。在不同场景下,如普通启动、横竖屏切换及系统内存不足时,Activity生命周期的变化也有所不同。此外,还讨论了四种启动模式:standard、singleTop、singleTask和singleInstance,解释了它们的特点和应用场景。对于启动模式,重点在于理解如何复用和管理Activity实例。最后,文章提供了处理横竖屏切换时数据保存与恢复的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、生命周期

onCreate()

启动 Activity 时,首次创建 Activity 时回调,大多数初始化在该函数内。

onRestart()

当 当前 Activity 重新显示给用户(用户已导航回它)时,在 onStop() 之后调用。之后是onStart(),然后是 onResume()

onStart()

首次启动 Activity 时在onCreate()之后被回调,再次启动时在 onRestart() 之后被回调。此时 Activity 已经可见但还没出现到前台不能与用户交互,通常执行绘制视觉元素、运行动画等操作。

onResume()

onStart()之后被回调,此时 Activity 已经完全可见并且可以与用户交互。

onPause()

当用户返回或者跳转到下一个 Activity 时会回调此方法,表示正在停止当前 Activity,但此时 Activity 依然可见,通常紧接着会回调 onStop()

onStop()

表示 Activity 即将停止。

onDestroy()

表示 Activity 被销毁。

值得注意的地方:

onStartonResume咋看起来差不多,但有一些细微的差别,onStart表示 Activity 虽然此时已经可见但并没有完全显示到前台,onResume表示此时已经完全显示到前台了,并可以与用户交互了,onPauseonStop区别类似于此。

ActivityA 启动 ActivityB 时,他们的生命周期方法执行顺序如下:

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

1、普通情况下的Activity生命周期方法执行顺序:

启动一个 Activity:

onCreate()-->onStart()-->onResume()

在当前 Activity 中跳转到下一个页面时(或者被用户切换到后台时),当前的 Activity 会被暂停:

onPause()-->onStop()

然后再返回这个 Activity 时:

onRestart()-->onStart()-->onResume()

Activity 退出时:

onPause()-->onStop()-->onDestroy()

2、横竖屏切换时Activity生命周期方法执行顺序:

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

在横竖屏切换时 Activity 会先被销毁,然后再重新创建,在销毁时onPause()被调用之后会调用onSaveInstanceState(Bundle bundle),此时我们就有机会将一些需要恢复的信息写入onSaveInstanceState()Bundle参数中。

在 Activity 被重建时,调用onStart()之后会调用onRestoreInstanceState(Bundle bundle),此时我们就可以在onRestoreInstanceState()用来恢复一些必要的信息,而它的参数就是我们在onSaveInstanceState()写入的参数。

3、系统内存不足导致低优先级的 Activity 被回收时的生命周期方法执行顺序

此种情况和第二种横竖屏切换时的情况查不多,也会执行onSaveInstanceState()onRestoreInstanceState()

二、四种启动模式

standard

默认的启动方式,Activity可以被多次实例化,即同一个栈中可以存在多个Activity实例。

如果用ApplicationContext去启动standard模式的 Activit y的时候会报错,这是因为此模式的 Activity 默认会进入启动它的 Activity所属的任务栈中,而非 Activity 类型的 Context 并有没有任务栈。

解决办法就是:在用ApplicationContext启动 Activity 时指定Intent.FLAG_ACTIVITY_NEW_TASKFlag即可,这样在启动 Activity 时就会为它创建一个新栈。

singleTop

栈顶复用模式。以singleTop模式启动的 Activity 如果已经有一个实例存在栈顶,那么再启动这个 Activity 时就会重用这个实例,并回调onNewIntent()方法。如果不在栈顶,则会创建新的实例,效果如standard一致。

singleTask

栈内复用模式。此模式只允许一个栈中只存在一个该 Activity 的实例,启动此模式的 Activity 时,如果栈中没有该 Activity 的实例,则会创建新的实例。如果栈中已经存在该实例了,系统会销毁在其之上的所有 Activity,最终让该 Activity 实例置于栈顶,并回调onNewIntent()方法。

singleInstance

单实例模式。该模式的 Activity 只在一个独立的任务栈中开启,并且这个新的任务栈中有且只有这一个实例。当再次启动该 Activity 实例时,会重用已存在的任务和实例(并调用onNewIntent())。而该 Activity 启动的其他 Activity 会自动运行与另一个任务栈中。

singleInstancesingleTask的区别:

singleInstance在同一个时刻,在系统中只会存在一个实例,而singleTask模式的 Activity 可以有多个实例,只要这些实例在不同的任务栈中即可。比如应用A启动了一个singleInstance的 Activity,而应用B也启动了这个 Activity,那么会重用已经启动的实例。

参考文献:
《Android开发艺术探索》
《Android开发进阶从小工到专家》

转载自作者:CodingBlock
出处:http://www.cnblogs.com/codingblock/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值