四大组件之Activity面试解析

最近在准备面试,在这里将知识点记录下来。一方面自己做一些总结,另一方面也方便自己的查看。(总结于《Android开发艺术探索》及慕课网的面试视频

Activity的内容分为一下几点:

  •  什么是Activity
  • Activity的生命周期
  • Activity的启动模式
  • Activity的标志位
  • 一些记录的Activity的面试题
一.什么是Activity

Activity从字面上的意思来理解就是活动,它是Android四大组件之一,承载着显示Android应用界面并于用户进行交互的重任。当然,如果直接翻译为界面能让我们更直白的理解,毕竟Activity是唯一让用户看得见摸得着的基本组件。


二.Activity的生命周期
这个就比较熟悉了,先上图:

上图向我们展示了一个完整的Activity生命周期。

首先,生命周期是什么? 是Android组件从创建到销毁的过程中所调用的生命周期方法。

下面分两种情况来讨论下:正常情况与异常情况

(1)正常情况

Activity完整的生命周期(包含七个生命周期方法):onCreate(创建) -> onStart(可见)-> onResume(可见并可交互) ->onPause(暂停) ->onStop (正在停止)->onDestory(销毁),再加上 onRestart(重启) 方法。

  1. 针对某一的Activity,第一次启动,回调如下:onCreate -> onStart-> onResume
  2. 当用户打开新的Activity或点击Home键时回调如下:onPause ->onStop 。特殊情况,如Activity采用透明主题,则不会调用onStop。
  3. 当用户再次回到该Acticvity时,回调如下:onRestart -> onStart-> onResume
  4. 当用户按返回键回退时,回调如下:onPause  ->onStop ->onDestory
  5. 当被销毁的Activity再次被调用时,其回调与第一点一致。但只是生命周期方法一致,不代表所有过程一样
(2)异常情况

当资源相关的系统配置发生改变时或者系统内存不足时,都有可能导致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中出现可捕获的异常或程序直接退出时。  


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值