一、官方生命周期图
首先会介绍 onCreate(),启动Activity的第一个方法,主要是初始化资料,以及指定画面资源 setContentView() 呈现目前的 Layout.xml,和包含一些需要初始化的组件。
接着 OnStart(),适合执行画面组件的内容。比方说当 Activity 沉到背景后,如果把设定的内容放在 onCreate(),当唤醒后会跳过 onCreate(),直接执行 OnStart()。比如记忆账号、密码 EditText。
onResume(),如对 Button 或 EditText 做点击的动作,此时会获得焦点,进行我们设计好的动作,比如输入或确认的动作,简单来说是 Activity 与使用者互动。
onPause() : 组件暂停,暂停执行中的工作和线程。onPause() 执行完后,通常会马上再执行 onStop()部分,但有例外,如果是碰到Dialog,没有完全遮盖住屏幕,那么便会在 onPause()停止,操作完 Dialog后,再按照原本的生命周期来运行。
onStop() : 停止,停止执行中的工作和线程,画面完全消失,但Activity还留在后台。
onDestory() : 销毁Activity,清除所有建立的资源,生命周期结束,包含GC回收动作。
如果说到这边面试官没有打断,甚至示意让继续说下去,那么我会告诉他几个个常见的动作。
点选主画面按钮
onPause() > onStop()
开启相机或另一个 Activity 或进入待命状态
onPause() > onStop(),当 Activity 结束或屏幕结束待命 onRestart() > onStart() > onResume()
Dialog执行
onResume() > onPause(),操作完后执行onResume()
*在画面转向时,生命周期会重新执行。我猜面试官如果没有当下问这个问题,我不会说死,当他之后再问也可以比较从容地回答这个问题。
补充 :
onCreate只能执行一次,onStart()能执行多次
onStop() 中 Activty 还没有被销毁,还存在内存中,可以透过切换Activity回复。onDestory() 是已经摧毁。
不要再 onStart()执行,判断屏幕方向代码,否则会有无限循环问题。
二、 Launch Mode
2.1> 启动模式
Launch Mode都不会陌生,用于设定Activity的启动方式,无论是哪种启动方式,所启动的Activity都会位于Activity栈的栈顶。有以下四种:
- standerd:默认模式,每次启动Activity都会创建一个新的Activity实例。
- singleTop:如果要启动的Activity已经在栈顶,则不会重新创建Activity,同时该Activity的onNewIntent方法会被调用。如果要启动的Activity不在栈顶,则会重新创建该Activity的实例。
- singleTask:如果要启动的Activity已经存在于它想要归属的栈中,那么不会创建该Activity实例,将栈中位于该Activity上的所有的Activity出栈,同时该Activity的onNewIntent方法会被调用。如果要启动的Activity不存在于它想要归属的栈中,并且该栈存在,则会重新创建该Activity的实例。如果要启动的Activity想要归属的栈不存在,则首先要创建一个新栈,然后创建该Activity实例并压入到新栈中。
- singleInstance:和singleTask基本类似,不同的是启动Activity时,首先要创建在一个新栈,然后创建该Activity实例并压入新栈中,新栈中只会存在这一个Activity实例。
2.2> Intent的FLAG
Intent中定义了很多了FLAG,其中有几个FLAG也可以设定Activity的启动方式,如果Launch Mode设定和FLAG设定的Activity的启动方式有冲突,则以FLAG设定的为准。
- FLAG_ACTIVITY_SINGLE_TOP:和Launch Mode中的singleTop效果是一样的。
- FLAG_ACTIVITY_NEW_TASK:和Launch Mode中的singleTask效果是一样的。
- FLAG_ACTIVITY_CLEAR_TOP:Launch Mode中没有与此对应的模式,如果要启动的Activity已经存在于栈中,则将所有位于它上面的Activity出栈。singleTask默认具有此标记位的效果。
除了这三个FLAG,还有一些FLAG对我们分析栈管理有些帮助。
- FLAG_ACTIVITY_NO_HISTORY:Activity一旦退出,就不会存在于栈中。同样的,也可以在AndroidManifest.xml中设置“android:noHistory”。
- FLAG_ACTIVITY_MULTIPLE_TASK:需要和FLAG_ACTIVITY_NEW_TASK一同使用才有效果,系统会启动一个新的栈来容纳新启动的Activity.
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:Activity不会被放入到“最近启动的Activity”列表中。
- FLAG_ACTIVITY_BROUGHT_TO_FRONT:这个标志位通常不是由应用程序中的代码设置的,而是Launch Mode为singleTask时,由系统自动加上的。
- FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY:这个标志位通常不是由应用程序中的代码设置的,而是从历史记录中启动的(长按Home键调出)。
- FLAG_ACTIVITY_CLEAR_TASK:需要和FLAG_ACTIVITY_NEW_TASK一同使用才有效果,用于清除与启动的Activity相关栈的所有其他Activity。