Activity相关面试基础点

1.Activity的affinity

  1. affinity是Activity内部的一个属性(在Manifest中对应属性为taskAffinity)。默认情况下,拥有相同affinity的Activity属于同一个Task。
  2. Task也有affinity属性,它的属性由根Activity决定(创建Task时,第一个被压入栈的Activity实例)
  3. 默认情况下,所有的Activity的affinity都从Application继承。也就是说Application同样有affinity属性。Application默认的affinity属性为Manifest的包名。

2.Activity 的启动模式

Activity的启动模式分为四种,standard,singleTop,singleTask,singleInstance

  • standard:默认模式,每次启动都会创建一个新的Activity实例,不管当前任务栈中是否已经存在实例,都会创建。

  • singleTop:栈顶模式,当我们创建一个新的Activity的实例的时候,如果当前Activity在任务栈的栈顶,那我们就不需要重复创建。

  • singleTask: 栈内复用模式,当我们创建一个新的Activity的实例的时候,如果当前Activty在任务栈内存在,那我们就不会去重新创建,而是直接将这个实例放置到栈顶,当前Activity上面的所有实例对象都会被移出当前任务栈,进行销毁。

  • singleInstance:此模式有点类似单例模式。当我们创建一个新的Activity的实例的时候,会去创建一个新的任务栈Task,并且这个Task中只有这一个Activity实例。

3.动态设置启动模式

​ 正常情况下,我们可以在Manifest中通过对Activity设置launchMode来指定当前Activity的启动模式,这种设置方式叫做静态设置。而我们在代码中指定Activity的启动模式就为动态设置。如果同时对一个Activity实例设置两种启动模式,那么动态设置的优先级高。

​ 动态设置需要我们在intent进行Activity跳转的时候设置flag标签,例如:

intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK)

​ 常见的Flag有:

  • NEW_TASK
  • SINGLE_TOP
  • CLEAR_TOP
  1. NEW_TASK

    这个flag跟singleInstance有些相似。当我们对Activity设置当前flag的时候,程序会根据当前Activity的affinity进行匹配。如果已经存在与其具有相同affinity属性的task,则直接将Activity压入当前任务栈,如果没有则新建一个task,并将Activity压入新创建的栈内。简单来说就是,根由有没有相同affinity属性的任务栈,有就直接压栈,没有的话就新创建一个。

    这种情况与singleInstance不相同的地方:

    ​ (1) 新的任务栈没有说只可以放一个Activity实例,只是说是否需要创建一个新的Task,而singleInstance模式下新的Task只能存放一个Activity实例。

    ​ (2)在同一个应用下,如果所有的Activity都是默认的affinity,那么当前Flag无效。而singleInstance默认情况下也会创建新的任务栈。

  2. SINGLE_TOP

    当前Flag与静态设置中的singleTop模式等同

  3. CLEAR_TOP

    当我们设置这个flag的时候,如果当前任务栈中已经存在Activity实例,那么我们就将当前Activity实例上面的所有实例都弹出任务栈,需要注意的是:

    (1)如果同时设置Flag_ACTIVITY_SINGLE_TOP,则直接使用栈内对应的Activity

    (2)如果没有设置Flag_ACTIVITY_SINGLE_TOP,则将栈内的对应的Activity销毁,然后重新创建。

    也就是说CLEAR_TOP + SINGLE_TOP相当于我们静态设置的singleTask模式。不同的地方在于他回销毁重新创建。

4.Activity 的生命周期

Activity的生命周期包含:onCreate, onRestart, onStart, onResume, onPause, onStop, onDestory

  • onCreate

    Activity被创建时调用,我们在这个方法中进行初始化操作。

  • onRestart

    Activity由完全不可见变为可见的过程,当Activity由stop方法变为完全不可见之后,如果用户重新返回到当前Activity就会执行这个方法,将会触发这个回调,并且紧接着会调用onStart()来使活动重新可见

  • onStart

    Activity由不可见变为可见,但此时处于后台可见,还不能跟用户进行交互

  • onResume

    可见状态下的Activity由后台进入前台。可以和用户进行交互。

  • onPause

    当用户启动了新的Activity,原来的Activity不再处于前台,也无法与用户进行交互,那么当前Activity就会执行该回调,此方法紧接着会调用onStop方法,但如果用户此时点击返回键重新回到当前Activity就会调用onResume方法让Activity重新回到前台。不允许在onPause方法中执行耗时操作,这样会影响新的Activity的启动速度。

  • onStop

    Activity由可见变为不可见,此方法可以执行一些稍微重量级的操作,需要注意的是,处于onPause和onStop回调的Activity优先级很低,所以在系统内存不足的情况下,就会被杀死,那么再次返回这个Activity的时候,就需要重新执行onCreate方法。

  • onDestory

    Activity即将被销毁,应该在该方法中执行资源的回收和释放工作。

5.Activity 什么时候会发生重建

  • 横竖屏切换,资源重新配置

    可以通过配置android:configChanges属性防止Activity进行重建。

    在API级别为13以下的时候,设置android:configChanges="orientation"

    在API级别为13及13以上的时候,设置android:configChanges="orientation|screenSize"

  • 内存不足,低优先级的Activity会被杀死

    当这种情况的时候,我们可以在onSaveInstanceState存储数据,在onRestoreInstanceState方法中恢复数据,数据可以通过bundle进行存储

关于 onSaveInstanceState 与 onRestoreInstanceState 方法需要注意的一些问题:

  1. onSaveInstanceState的调用时机是在onStop之前,与onPause没有固定的时序关系,而onRestoreInstanceState是在onStart方法之后调用。
  2. 正常情况下的活动销毁并不会调用这两个方法,只有当活动异常销毁并且有机会重现展示的时候才会进行调用,除了资源配置的改变外,activity 因内存不足被销毁也是通过这两个方法保存数据。
  3. 在 onRestoreInstanceState 和 onCreate 都可以进行数据恢复工作,但是根据官方文档建议采用在 onRestoreInstanceState 中去恢复。
  4. 在 onSaveInstanceState 和 onRestoreInstanceState 这两个方法中,系统会默认为我们进行一定的恢复工作,具体地讲,默认实现会为布局中的每个 View 调用相应的 onSaveInstanceState() 方法,让每个视图都能提供有关自身的应保存信息。
  5. onSveInstanceState() 常见的触发场景有:横竖屏切换、按下电源键、按下菜单键、切换到别的 Activity 等;onRestoreInstanceState() 常见的触发场景有:横竖屏切换、切换语言等。

6.Activity中不常用的方法

  • onPostCreate()

    onPostCreate() 方法是指 onCreate() 方法彻底执行完毕的回调。一般我们都没有实现这个方法,它的作用是在代码开始运行之前,调用系统做最后的初始化工作。现在知道的做法是使用 ActionBarDrawerToggle 时在屏幕旋转的时候在 onPostCreate() 中同步下状态。

  • onPostResume()

    onPostResume() 与 onPostCreate() 方法类似,onPostResume() 方法在 onResume() 方法彻底执行完毕的回调。 onCreate() 方法中获取某个 View 的高度和宽度时,返回的值是 0 ,因为这个时候 View 可能还没初始化好,但是在 onPostResume() 中获取就不会有问题,因为 onPostResume() 是在 onResume() 彻底执行完毕的回调。

  • onContentChanged()

    当 Activity 的布局改动时,即 setContentView() 或者 addContentView() 方法执行完毕时就会调用该方法。所以,Activity 中 View 的 findViewById() 方法都可以放到该方法中。

  • onUserInteraction()

    Activity 无论分发按键事件、触摸事件或者轨迹球事件都会调用 Activity#onUserInteraction()。如果想知道用户用某种方式和你正在运行的 activity 交互,可以重写 Activity#onUserInteraction()。所有调用 Activity#onUserLeaveHint() 的回调都会首先回调 Activity#onUserInteraction() 。

    Activity 在分发各种事件的时候会调用该方法,注意:启动另一个 activity ,Activity#onUserInteraction()会被调用两次,一次是 activity 捕获到事件,另一次是调用 Activity#onUserLeaveHint() 之前会调用 Activity#onUserInteraction() 。

    可以用这个方法来监控用户有没有与当前的 Activity 进行交互。

  • onUserLeaveHint()

    当用户的操作使一个 activity 准备进入后台时,此方法会像 activity 的生命周期的一部分被调用。例如,当用户按下 Home 键,Activity#onUserLeaveHint() 将会被调用。但是当来电导致 activity 自动占据前台(系统自动切换),Activity#onUserLeaveHint() 将不会被回调。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272