Activity篇

1,谈谈你对Activity的生命周期的理解?

答: Activity作为四大组件中最重要和最常用的组件, 官方会给他设置 6 个生命周期的回调方法(不包括 onRestart), 是有一定的原因的, 这六大生命周期分别对应着 Activity 的三种状态 --- 是否创建, 是否可见, 是否位于前台.   详细介绍: Activity 生命周期详解.

 

2onStart()和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的四种启动模式

答: 

  • standard 标准模式, 也是默认模式, 在该模式下总是会创建一个新的 activity 实例对象并且压入栈顶.
  • singTop 栈顶复用模式, 在该模式下, 如果要启动一个 activity 时, 该 activity 位于栈顶, 便会进行复用, 如果不位于栈顶, 依然会创建新的实例对象压入栈顶, 并且回调 onNewIntent .
  • singTask 栈内复用模式, 该模可以配合 taskAffinity 使用来指定 activity 期望进入的 栈 的名字, 在该模式下, 如果当前 activity 期望进入的栈存在, 并且该栈内拥有此 activity 的实例对象, 那么会复用此对象, 如果此 activity 不位于栈顶, 那么会把此 activity 对象之前的 activity 全部出栈.   如果期望进入的栈和activity 都不存在, 那么会创建相应的栈并且压入栈顶.
  • singInstance 单实例模式, 该模式除了拥有 singTask 模式的所有特性外, 系统会为该模式的 activity 创建一个单独的任务栈并且压入栈顶.
  • 补充: activity 任务栈分为前台任务栈和后台任务栈, 默认情况下, 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的启动过程?

你可能感兴趣的:(面试题之Android)