一.说下Activity的生命周期?
正常情况下的生命周期:
onCreate()->onStart()->onResume()->onPause()->onStop()->onDestroy()
异常情况下的生命周期:
1. 资源相关的系统配置发生改变导致Activity被杀死并重新创建
默认情况下,如果我们的Activity不做任何处理,那么当系统配置发生改变后,Activity就会被销毁并重新创建,其生命周期如图所示。
注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在内存不足被回收后怎样做可以恢复到销毁前的状态?
- 当app处于后台被系统回收时,app的进程被杀死了,Activity 也被回收了,而app的task和activity栈以及相应的intent和数据会被系统保存起来。当app被切回前台时,系统会恢复task和activity栈以及相应的intent和数据。
- 不要在Application类和全局单例类中存放数据,会导致app无法正确恢复状态。运行时的临时数据应存放在SharedPreference、临时文件或数据库中
- Activity之间传数据应该用系统提供的intent机制。
回答来自 华-山 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/mountain_hua/article/details/82698344?utm_source=copy
七. Activity的四种启动模式?
- 标准模式:standard mode
系统默认的模式,每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否存在。当我们用ApplicationContext去启动一个standard模式的Activity的时候会报错。 - 栈顶复用模式:singleTop
如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息。
注意:这个Activity的onCreate和onStart不会被系统调用,因为它并没有发生改变。 - 栈内复用模式:singleTask
只要Activity在一个栈中存在,那么多次启动此Activity都不会创建实例,会回调onNewIntent。默认具有clearTop的效果。
比如创建一个Activity A,会首先寻找是否存在A想要的任务栈,如果没有会新建一个任务栈,把A放入。
如果有,把A调用到栈顶并调用onNewIntent()。 - 单实例模式:singleInstance
singleTask模式的加强版,除了具有singleTask模式的所有特性外,它只能单独的位于一个任务栈中。
注意:参数TaskAffinity标识了一个Activity所需要的任务栈的名字,默认情况下,所有的Activity所需的任务栈的名字为应用的包名。
任务栈分为前台任务栈和后台任务栈,后台任务栈中的Activity位于暂停状态。
八. 了解哪些Activity启动模式的标记位?
- FLAG_ACTIVITY_NEW_TASK
指定“singleTask”模式。 - FLAG_ACTIVITY_SINGLE_TOP
指定“singleTop”模式 - FLAG_ACTIVITY_CLEAR_TOP
clearTop效果。 - FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
该Activity不会出现在历史Activity的列表中。
九. 如何启动其它应用的Activity?
使用Intent过滤器