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就开始创建并可见了,最后才是第一个Activity的onStop(),所以为了第二个Activity更可能快的显示,避免在Activity的onPause()方法中做耗时操作。
返回上一个Activity
当前TestActivity2在前台
和跳转类似,当前你Activity先onPause(),然后开始重启上一个Activity,还是那句话,避免在Activity的onPause()方法中做耗时操作。
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就不一样了~