最近在准备面试,在这里将知识点记录下来。一方面自己做一些总结,另一方面也方便自己的查看。(总结于《Android开发艺术探索》及慕课网的面试视频)
Activity的内容分为一下几点:
- 什么是Activity
- Activity的生命周期
- Activity的启动模式
- Activity的标志位
- 一些记录的Activity的面试题
一.什么是Activity
Activity从字面上的意思来理解就是活动,它是Android四大组件之一,承载着显示Android应用界面并于用户进行交互的重任。当然,如果直接翻译为界面能让我们更直白的理解,毕竟Activity是唯一让用户看得见摸得着的基本组件。
二.Activity的生命周期
这个就比较熟悉了,先上图:
上图向我们展示了一个完整的Activity生命周期。
首先,生命周期是什么? 是Android组件从创建到销毁的过程中所调用的生命周期方法。
下面分两种情况来讨论下:正常情况与异常情况
(1)正常情况
Activity完整的生命周期(包含七个生命周期方法):onCreate(创建) -> onStart(可见)-> onResume(可见并可交互) ->onPause(暂停) ->onStop (正在停止)->onDestory(销毁),再加上 onRestart(重启) 方法。
- 针对某一的Activity,第一次启动,回调如下:onCreate -> onStart-> onResume
- 当用户打开新的Activity或点击Home键时回调如下:onPause ->onStop 。特殊情况,如Activity采用透明主题,则不会调用onStop。
- 当用户再次回到该Acticvity时,回调如下:onRestart -> onStart-> onResume
- 当用户按返回键回退时,回调如下:onPause ->onStop ->onDestory
- 当被销毁的Activity再次被调用时,其回调与第一点一致。但只是生命周期方法一致,不代表所有过程一样
当资源相关的系统配置发生改变时或者系统内存不足时,都有可能导致Activity被杀死。
1. 资源配置相关的,如横竖屏切换,就会导致Activity被杀死并重启,如果我们不做特殊处理,其生命周期方法如:
横竖屏切换的生命周期回调如下:onPause -> OnSaveInstanceState ->onStop ->onDestory ->onCreate->onStart ->onRetoreInstanceState ->onResume。
当系统配置发生变化之后,Activity在onStop之前调用OnSaveInstanceState来保存之前的状态。注意:OnSaveInstanceState方法只会被调用在Activity被异常终止的情况。在Activity恢复之后,系统会调用onRetoreInstanceState来恢复之前状态。这个状态包括Activity中的组件的数据:如文本框中的输入数据,ListView滚动的位置等。
如想要避免横竖屏切换Activity的销毁重建,则可以进行配置:AndriodManifest的中对应Activity配置
android:configChanges="orientation | screenSize"
这样便避免横竖屏切换Activity的销毁重建,而是回调了onConfigurationChanged ()这个方法。
2.内存不足导致Activity被杀死
这里要先说明一下
活动优先级:前台Activity > 可见但非前台Activity > 后台Activity。
进程优先级:前台 > 可见 > 服务 > 后台 > 空。
前台Activity:正在与用户交互的,优先级最高。
可见但非前台Activity:已失去焦点,可以看到,但无法与用户交互,如弹出对话框,Activity可见但无法操作。
后台Activity:已经被暂停的Activity,优先级最低。
当系统内存资源不足时。系统会按照上述的优先级去杀死目标Activity所在的进程,并会通OnSaveInstanceState和onRetoreInstanceState来保存和恢复数据。因此,一些后台工作不适合脱离四大组件独自运行在后台中,这样会很容易被杀死,一般的解决办法是将后台工作放入Service中从而保证进程有一定的优先级,不会轻易的被系统杀死。
三.Activity的启动模式
Activity的启动模式,AndriodManifest的中对应Activity配置如下:
android:launchMode="standard"
启动模式有如下四种:standard(标准模式),singleTop(栈顶复用模式),singleTask(站内复用模式),singleInstance(单实例模式)。
- standard(标准模式),系统默认的模式。每启动一次就会创建新的Activity实例并压入任务栈中,不管这个实例是否存在。压入任务栈是压入启动该Activity的组件所在的任务栈中。当启动该Activity的组件没有所谓的任务栈时,这样程序就会发生异常,解决办法是为该Activity添加标志位FLAG_ACTIVITY_NEW_TASK,这样会在启动该Activity时创建一个新的任务栈。
- singleTop(栈顶复用模式),当需要启动的Activity位于栈顶时,那么该Activty就不会被创建,但会回调onNewIntent方法----通过此方法的参数,我们可以取出当前的请求信息。如果新的实例已经存在,但不是位于栈顶,那么新的Activity仍然会被重新创建。
- singleTask(站内复用模式)这是一种单实例模式,默认具有clearTop的属性。这种模式下,一个栈中只允许一个Activity实例存在,多次启动都不会再创建。与singleTop一样,onNewIntent方法会被调用。当一个任务栈中有需要启动的Activity(singleTask模式)的实例,系统会先寻找Activty所需的任务栈,如果不存在,则创建该任务栈,并将Activity压入栈中。如果存在该任务栈,则看任务栈中是否有该Activity的实例,有则把Activity实例调到栈顶并调用onNewIntent方法。如果Activity不存在,则把Activity压入栈。
- singleInstance(单实例模式),这是一个加强版的singleTask模式。具有此种模式的Activity,只能位于一个单独的任务栈中。也就是说,该任务栈中只能有一个Activity实例。
注意:Activity所需的任务栈,是由 TaskAffinity 这个属性来指定的,默认情况下为程序的包名。一般与singleTask模式一起使用。
四.Activity的Flags
Activity的Flags很多,这里介绍集中常用的,用于设定Activity的启动模式。可以在启动Activity时,通过Intent的addFlags()方法设置。
(1)FLAG_ACTIVITY_NEW_TASK 其效果与指定Activity为singleTask模式一致。
(2)FLAG_ACTIVITY_SINGLE_TOP 其效果与指定Activity为singleTop模式一致。
(3)FLAG_ACTIVITY_CLEAR_TOP 具有此标记位的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。如果和singleTask模式一起出现,若被启动的Activity已经存在栈中,则清除其之上的Activity,并调用该Activity的onNewIntent方法。如果被启动的Activity采用standard模式,那么该Activity连同之上的所有Activity出栈,然后创建新的Activity实例并压入栈中。
五.一些面试题
1.onStart与onResume的区别 :
onStart是可见,已经显示出来,但还没有获取到焦点,不可以与用户交互。onResume表示已经显示在前台并且用户可以交互了。
2.从一个Activity到另一个Activity的生命周期执行
旧的Activity的onPause先执行,然后新的Activity进行onCreate -> onStart-> onResume。
3.什么情况下Activity执行onCreate而不执行onStart?
在onCreate中出现可捕获的异常或程序直接退出时。