Activity生命周期和启动模式

210 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

Activity生命周期

onCreate()

Activity创建时被调用,通过setContentView(layoutId)来绑定视图,这时候页面并不可见;

onStart()

此时Activity已经可见,但是并不可以进行交互;

onResume()

此时Activity可见并且可以和用户进行交互了,当前的Activity位于Activity堆栈的栈顶;

onPause()

此时Activity失去焦点;

onStop()

此时的Activity已经完全不可见,也就是退到了后台;

onRestart()

如果Activity从后台切到前台,此时Activity就会进入onRestart()阶段,开始重新可见;

onDestroy()

Activity在被销毁之前就会调用此方法,我们可以在此回调内进行一些资源的释放。

Activity正常启动生命周期变化

正常启动一个Activity:

按Home退到后台

切回到前台

退出Activity

跳转其它Activity

当前TestActivity在前台

这里停顿一下,根据日志可以看出跳转第二个Activity的时候,第一个只是回调了onPause(),紧接着第二个Activity就开始创建并可见了,最后才是第一个ActivityonStop(),所以为了第二个Activity更可能快的显示,避免在ActivityonPause()方法中做耗时操作。

返回上一个Activity

当前TestActivity2在前台

和跳转类似,当前你ActivityonPause(),然后开始重启上一个Activity,还是那句话,避免在ActivityonPause()方法中做耗时操作。

Activity启动模式

standard标准模式

每次启动都会在Activity堆栈中新建一个实例,并且新的实例都会经历标准的启动生命周期。

singleTop栈顶单例模式

我习惯称之为栈顶单例,也就是如果当前要启动的Activity在当前的堆栈栈顶,那么不再去新建它的实例,而是复用此栈顶的实例。它也不会重新去走一遍标准的启动生命周期,但是它会回调onNewIntent(intent)方法。

singleTask栈内单例模式

栈内单例的意思就是如果当前Activity堆栈已经有这个要启动的Activity,那么就不再去创建新的实例,而是复用栈内的对象,如果要启动的Activity不在栈顶,它的生命周期如下:

此时TestActivity不在栈顶,栈顶是TestActivity2,在TestActivity2中启动TestActivity,它的生命周期会依次进行onRestart() -> onStart() -> onNewIntent() -> onResume(),这里同样也是会调用onNewIntent(intent)方法的。

singleInstance单例模式

这种可以称之为真正的单实例模式,无论是是不在同一个Activity堆栈,只会同时存在一个实例。

  • 如果Activity堆栈不存在要启动的Activity,那么就新建一个栈,启动Activity;
  • 如果Activity堆栈已经存在要启动的Activity,那么就复用这个Activity。

我们使用adb shell dumpsys activity processes | grep com.taonce.review来查看Activity所在进程可以看出:

Test2Activity的启动模式为singleInstance,启动之后它的进程和LiveDataActivity就不一样了~