Activity是Android的四大组件之一,也可以说是出镜率最高的一个类,里面的知识点可以说是非常多,也是面试官必问的,接下来我们就通过学习提问的方式,来学习源码,顺便看看可能有哪些在面试中可能问到,因为Activity的知识点太多,所以可能涵盖不全,还请见谅。
Activity的生命周期
Activities在Android系统中是由一个叫做Activity 栈的来管理的,当一个新的Activity被启动的时候,它会被放在栈顶。
Activity有四种状态- 处于前台的时候,称为活跃状态Active
- 当前Activity处于可见状态,但是由不是前台,例如被dialog或者透明的Activity遮盖,这时候称为暂停paused
- 完全不可见状态,这时候系统会根据需要杀掉当前Activity,stop状态
- 当activity处于stoped或者paused状态的时候,系统有可能会丢弃该Activity
具体的生命周期
- onCreate 初始化UI的方法
- onStart()
- onRestart
- onResume
- onPause一般在系统恢复前一个Activity的时候触发,在该状态的时候一般需要将消耗cpu的操作停止,例如动画、保存数据,这部分操作一定要快速,因为很有可能再次进入onResume或者彻底不见进入onStop
- onStop
- onDestory
onRestart是在onStop之后调用还是在onDestroy之后调用
onStoponResume阶段,是否Activity处于可见状态?
不一定,有时候系统窗口,比如键盘锁会在Activity之前出现,一样会回调该方法不过可以通过onWindowFocusChanged(boolean)方法来判断当前activity是否已经可见。onNewIntent是在什么时候触发?
- 当前Activity的LaunchMode设置为SingleTop
- 启动这个Activity的Intent,设置了android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP
- 如果当前Activity处于栈顶,那么再次启动该Activity,则会触发onNewIntent
onPause一般做什么操作比较合适?为什么?
一般在onPause的时候,会停止当前动画、保存当前Activity的一些状态,因为在onPause以后,系统有可能会根据系统内存情况,杀掉onPause状态的Activity,同时在onPause状态不要做耗时操作,因为只有在onPause执行完以后,其他的Activity才会被创建。onUserLeaveHint()什么时候会触发?
当是因为用户的缘故,Activity进入后台的时候,该方法会触发,例如用户按了home键,则该方法会被触发。但是当有电话需要接听的时候,该方法则不会触发。该方法会在onPause之前被触发,主要用于帮助Activity更好的管理状态通知。onStop方法必然会被调用吗?为什么?
不是,当内存不足的时候,Activity
会从onPause直接进入onDestory- 复写onPause方法,将数据保存在sd卡上,在onCreate的时候恢复,建议在该处保存数据
- 复写onSaveInstanceState(android.os.Bundle) ,将数据保存在bundle中,在onCreate(Bundle bundle)进行读取恢复。但是该部分回调不是每次都会触发,所以不如onPause更加稳定。
屏幕从竖屏切换至横屏当前Activity的生命周期是
如果没有在manifest中配置onConfiguration,则是从onResume->onPause->onStop->onDestory->onCreateActivity的四种启动模式
- Standard
- SingleTop
- SingleInstance
- SingleTask
前两个算一类,因为都会在启动Activity的时候新建一个activity,不同之处是SingleTop是只要在栈顶有该Activity则不用创建新的,后两个是不论如何情况都只会有一个activity,不同之处就是后者会单独创建一个task。
你知道在一个Activity捕获back键有几种方式
- 复写onKeyDown和onKeyUp
- 复写onBackPressed
- 复写dispatchKeyEvent