札记:Activity生命周期

生命周期图

新的Activity启动并显示,以及隐藏或结束时其生命周期回调的执行顺序如下:

basic-lifecycle

金字塔阶梯式调用

在不同状态间转变时,生命周期方法的调用都会按照图中的顺序,不会跳跃;
比如从stopped进入Resumed时:onStart()->onResume();

Activity的状态

Activity运行期间,当它在不同生命周期阶段间切换时执行不同的生命周期回调。
只有三个生命周期阶段可以长期处于,其它都是临时的。

  • Resumed
    In this state, the activity is in the foreground and the user can interact with it. (Also sometimes referred to as the "running" state.)

  • Paused
    In this state, the activity is partially obscured by another activity—the other activity that's in the foreground is semi-transparent or doesn't cover the entire screen. The paused activity does not receive user input and cannot execute any code.

  • Stopped
    In this state, the activity is completely hidden and not visible to the user; it is considered to be in the background. While stopped, the activity instance and all its state information such as member variables is retained, but it cannot execute any code.

onCreate()和onDestroy()

onCreate()

onCreate()仅执行一次,在这里定义ui,执行初始化。

onCreate()执行结束后,系统依次快速地执行onStart()和onResume(),Activity不会处于Created和Started状态。
从技术上讲,onStart()执行后界面已经用户可见了,但是onResume()很快接着就执行了,之后立即进入Started状态。直到以后当锁屏、来电界面、切换到其它Activity等发生才更变为其它状态。

onDestroy()

最后被执行,之后此Activity对象不再被使用。这里执行一些资源释放等清理操作。
如果在onCreate()中执行了finish()那么系统直接执行onDestroy()而没有其它任何回调被执行。

onResume()和onPaused()

onPaused()

当Activity由完全可见,可获得焦点的状态向不完全可见,不可获得焦点转变时,onPaused()被执行。例如对话框style的其它Activity遮盖当前界面等。

onPaused()执行后,若Activity继续处于部分可见,不可获得焦点,它就处在了Paused状态。
若处在Paused时,界面回到完全可见,可获得焦点,那么onResume()执行,进入Resumed状态。

若用户正在离开当前界面,那么界面直接完全不可见,那么就会快速依次执行onPaused()、onStop()。

onPaused()中不应该执行耗时操作,如写数据库,避免阻塞其它界面的显示。
可以停止一些与焦点、可见状态有关的操作,如动画。

Paused状态下Activity的状态也不会丢失,就像Resumed状态那样。

onResume()

启动Activity时,onResume()执行。
向Resumed状态转变时,onResume()执行。

因为会多次执行,所以它应该配合onPaused(),做一些焦点、界面可见性相关的操作的启动。

Stop and Restart

用户打开其它Activity,或其它App,当前界面完全不可见——进入后台。
onStop()执行,进入Stopped状态,此时系统保持Activity的对象状态,所以在达到Resumed时所做的状态设置都会得到保持,包括View状态,如EditText。
稍后用户返回当前界面时,onStart()执行。

onRestart()

若Activity是从Stopped重新向Resumed状态转变——没有在Stopped时被回收,那么onRestart()执行。

onStop()

在临时进入后台,或finishing过程中,都会执行onStop(),所以它的执行意味着用户很可能不再返回当前Activity了——finishing,或者返回前系统已经杀死当前进程了——系统内容回收时杀死后台进程,此时onStop()后不执行onDestroy()!
因此onStop()中应该执行一些释放资源的操作,它比onPause()更适合执行一些耗时操作。

create和finish

create时依次执行:onCreate、onStart、onResume;
finish时依次执行:onPause、onStop、onDestroy;

Recreating an Activity

basic-lifecycle-savestate

App处于后台状态时,系统可能回收进程,那么Activity可能在Stopped状态被杀死。
之后用户回到当前界面时,对应Activity会重新创建。
如果界面是转屏的,屏幕旋转时Activity也会先销毁后重建。

可以在:protected void onSaveInstanceState (Bundle outState)中保存状态以便重建的Activity可以恢复。
onCreate(Bundle savedInstanceState)参数savedInstanceState中即可以获得之前保存的数据。
也可以在public void onRestoreInstanceState(Bundle savedInstanceState)中恢复状态,它在onStart()之后执行。

系统会自动保存界面的view hierarchy的状态,如ListView的滚动位置,EditText的输入状态。不过需要view被设置了id属性。

onSaveInstanceState()和onRestoreInstanceState()中记得调用super的方法,以便系统恢复view hierarchy的状态。

启动其它Activity时

启动其它Activity时,newActivity的启动和当前Activity进入Stopped状态的过程是交叉的。
所以如果需要在oldActivity和newActivity的停止、启动过程中做一些相互冲突的工作,那么:
简单的依赖生命周期回调顺序+同步是没意义的,这些方法都是在主线程中执行的。

可以使用“设置者标记”法:
不是你设置的,就不要去清除标记。
一般类似:

if (mCurrentXxx == this) {
  mCurrentXxx = null;
}

补充

  • onResume和onPause
    配合开启和关闭一些与可见性、焦点相关的操作,必须是快速完成的轻量操作。
    可能反复执行。

  • onStart和onStop
    配合开启和关闭一些与Activity进入前台、后台相关的操作,可以是耗时操作。
    可能反复执行。

  • onStop和onDestroy
    应该在onStop中做许多操作的停止操作。而onDestroy中做一些最后的清理操作,避免内存泄露。
    onDestroy在后台进程杀死时并不一定执行,而进入后台时onStop一定会执行,但onStop又可能反复执行。所以系统资源的释放尽量在onStop中,这样确保一定可以释放。

(本文使用Atom编写)

posted @   everhad  阅读(199)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示