1,谈谈你对Activity的生命周期的理解?
答: Activity作为四大组件中最重要和最常用的组件, 官方会给他设置 6 个生命周期的回调方法(不包括 onRestart), 是有一定的原因的, 这六大生命周期分别对应着 Activity 的三种状态 --- 是否创建, 是否可见, 是否位于前台. 详细介绍: Activity 生命周期详解.
2, onStart()和onResume()/onPause()和onStop()的区别?
答: 这四个生命周期的回调就如上题所说的那样, onStart 和 onStop 对应 activity 是否可见, onResume 和 onPause 对应是否位于前台, 除此外, 无太大区别, 当尤其需要注意 onPause 回调, 该回调会影响下一个 Activity 的启动速度.
3, Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个Dialog呢?
答: A 启动 B, 会回调 A 的 onPause, onStop,和 onSaveInstanceState(此方法会在 onStop 之前回调) 方法, 如果 B 是完全透明的, 只会调用到 onPause 方法, 其他方法不会回调, 如果启动的是一个 dialog , 不会回调其任何生命周期方法, 这和下拉通知栏一样, 这也是为什么官方说道 onResume 不是你的 activity 可以交互的最好指示, 如果要确定是否可交互, 应该采用 onWindowFocusChanged,以上答案均由本人亲自实践. 18 年 10 月9 号, 8.0 系统再次实践证明, dialog 不会回调 onPause 方法.
4, 谈谈onSaveInstanceState()方法?何时会调用?
答: 这个方法可以用一句话来表明何时会得到调用 : 不是因为用户行为所导致的 activity 被销毁的情况下便会得到回调, 还有两种情况便是按下 home 键 和 从当前 activity 启动一个新的 activity时. 此方法主要是用来保存 UI 元素的状态, 如 滑动位置, 文本框的输入,等等. 其主要实现原理是通过调用所有含有 id 的子 view 的 onSaveInstanceState 方法, 所以说该方法具体能保存哪些数据关键至于子 view 的 onSaveInstanceState 的实现.
5, 如何避免配置改变时Activity重建?
答: 在 manifest 文件中为 activity 指定 configChange 属性即可, 比如在屏幕旋转时不重建 activity, 指定 orientation 和 screenSize 属性即可, 多个属性间用 | 连接.
6, 优先级低的Activity在内存不足被回收后怎样做可以恢复到销毁前状态?
答: UI 界面的状态主要通过系统回调 onSaveInstanceState 方法和 onRestoreInstanceState 方法来保存和恢复界面状态, 当然, 我们也可以重写这两个方法来保存一些自定义数据, 以便重建时得到恢复. 如果 activity 所在的进程被回收, 那么数据的恢复主要是通过系统保存相应的信息(如用来启动 activity 的 intent, 和 activity 的回退栈)来恢复状态. 详细介绍: https://www.jianshu.com/p/72ccb08e7f34.
7, 说下Activity的四种启动模式
答:
8, 谈谈singleTop和singleTask的区别以及应用场景
答: 就如上题说描述的那样, singleTop 是栈顶复用模式, 只有当这个 activity 被启动时位于栈顶, 才会复用对象, 而 singleTask 属于栈内复用模式, 只要该栈内存在要启动的 activity 的实例对象, 就会进行复用, 而且该模式还默认具有 clear_top 的作用. 此处说一下 singleTask 的使用场景, 当别的应用要启动我们的应用的 activity 时, 而且按下返回键不会对我们应用的 activity 栈产生任何影响, 那么我们可以使用 singleTask 和 taskAffinity 配合使用来完成这个需求. 还有就是 app 的主页也通常可以使用 singleTask 属性.
9, onNewIntent()调用时机?
答: 此方法会在一个 activity 重新回到前台而又没有创建一个新的实例对象时会被回调, 此方法回调位于 onResume 之前. 官方只描述了 singleTop 和 singleTask 相关回调, 但是亲自实践两次, 8.0 系统, singleInstance 模式下也会得到回调. 需要注意的是, activity 被一个新的 intent 重新启动后, 如果我们采用 getIntent 方法依然会返回之前的那个 intent, 如果需要更新 intent, 在 onNewIntent 中使用 setIntent 方法来替换即可.
10, 了解哪些Activity 的启动模式和标记位?
答: 启动模式常见的有四种, 标准, 栈顶复用, 栈内复用, 和单实例模式. 常见的标记位也有四个, 分别是:
NEW_TASK : 对应于 singleTask 启动模式.
SINGLE_TOP : 对应于 singleTop 启动模式.
CLEAR_TOP : 启动这个 activity 时, 位于它之上的都会被出栈, 其中 singleTask 默认就具有该标志位.
EXCLUDE_FROM_RECENTS : 把这个 activity 从最近列表中排除.
10, 如何启动其他应用的 activity ?
答: 通过给 intent 设定 componentName, 第一个参数为包名, 第二个参数为要启动的 activity 的全限定类名, 如果要启动的 activity 不是此应用的入口 activity , 那么此 activity 在注册文件中必须指定 exported 为 true ,否则会抛出异常, 服务也是如此. 而主入口 activity 不需要指定是因为其包含了一个 Launcher 意图过滤器, 其把 exported 属性默认指定为 true. 还有就是通过隐试启动也能启动其他应用的 activity.
11, Activity的启动过程?