Android面试之Activity部分

一.说下Activity的生命周期?

正常情况下的生命周期:
onCreate()->onStart()->onResume()->onPause()->onStop()->onDestroy()
异常情况下的生命周期:
1. 资源相关的系统配置发生改变导致Activity被杀死并重新创建
默认情况下,如果我们的Activity不做任何处理,那么当系统配置发生改变后,Activity就会被销毁并重新创建,其生命周期如图所示。

意外情况
重新创建
Activity
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onRestoreInstanceState

注1:onSaveInstanceState方法和onPause没有既定的时序关系,它既可能在其之前,也可能在其之后调用

注2:onRestoreInstanceState的调用时机在onStart之后

2. 资源内存不足导致优先级低的Activity被杀死
优先级排序:
前台Activity > 可见但非前台Activity > 后台Activity
当系统内存不足的时候,会按照上述优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。

二. onStart()和onResume(),onPause()和onStop()的区别?

onStart和onStop()是从Activity是否可见这个角度来回调的,而onResume和onPause是从Activity是否位于前台这个角度来回调的,除此之外,在实际使用中没有其它明显区别。

三. Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明的呢?如果启动的是一个Dialog呢?

启动另一个Activity B的话,A会回调onPause()、onStop()、onDestroy()方法。
如果Activity B是完全透明的,A会回调onPause()。
如果启动一个Dialog,如果是当前Activity弹出的dialog则不会执行Activity任何生命周期中的方法,只有其它Activity弹出了Dialog或者拦住了当前的Activity才会执行onPause() 。

四. onSaveInstanceState()与onPause()的区别?

onSaveInstanceState()只会出现在Activity被异常终止的情况下,正常情况下不会别调用,而onPause()会。

五. 如何避免配置改变时Activity重建?

系统配置中有很多内容,如果当某项内容发生改变后,我们不想系统重新创建Activity,就可以给Activity指定configChanges属性。比如不想让Activity在屏幕旋转的时候重建,就可以给configChanges属性添加orientation这个值。
android:configChanges=“orientation”
如果想指定多个值,可以用"|"连接起来,比如android:configChanges=“orientation|keyboardHidden”。
常用的有locale(切换系统语言)、orientation(屏幕方向改变)、keyboardHidden(调出了键盘)。

六. 优先级低的Activity在内存不足被回收后怎样做可以恢复到销毁前的状态?

  1. 当app处于后台被系统回收时,app的进程被杀死了,Activity 也被回收了,而app的task和activity栈以及相应的intent和数据会被系统保存起来。当app被切回前台时,系统会恢复task和activity栈以及相应的intent和数据。
  2. 不要在Application类和全局单例类中存放数据,会导致app无法正确恢复状态。运行时的临时数据应存放在SharedPreference、临时文件或数据库中
  3. Activity之间传数据应该用系统提供的intent机制。

回答来自 华-山 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/mountain_hua/article/details/82698344?utm_source=copy

七. Activity的四种启动模式?

  1. 标准模式:standard mode
    系统默认的模式,每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否存在。当我们用ApplicationContext去启动一个standard模式的Activity的时候会报错。
  2. 栈顶复用模式:singleTop
    如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息。
    注意:这个Activity的onCreate和onStart不会被系统调用,因为它并没有发生改变。
  3. 栈内复用模式:singleTask
    只要Activity在一个栈中存在,那么多次启动此Activity都不会创建实例,会回调onNewIntent。默认具有clearTop的效果。
    比如创建一个Activity A,会首先寻找是否存在A想要的任务栈,如果没有会新建一个任务栈,把A放入。
    如果有,把A调用到栈顶并调用onNewIntent()。
  4. 单实例模式:singleInstance
    singleTask模式的加强版,除了具有singleTask模式的所有特性外,它只能单独的位于一个任务栈中。

注意:参数TaskAffinity标识了一个Activity所需要的任务栈的名字,默认情况下,所有的Activity所需的任务栈的名字为应用的包名。
任务栈分为前台任务栈和后台任务栈,后台任务栈中的Activity位于暂停状态。

八. 了解哪些Activity启动模式的标记位?

  1. FLAG_ACTIVITY_NEW_TASK
    指定“singleTask”模式。
  2. FLAG_ACTIVITY_SINGLE_TOP
    指定“singleTop”模式
  3. FLAG_ACTIVITY_CLEAR_TOP
    clearTop效果。
  4. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
    该Activity不会出现在历史Activity的列表中。

九. 如何启动其它应用的Activity?

使用Intent过滤器

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值