【最新Android高级面试知识点干货分享(三)】
转载请说明出处!
前面用了三篇来整理分享了我的java笔记。
接下来从第四篇开始,我将正式开启我的Android面试笔记分享。
《Android篇》
一、Activity启动流程
这是我自己绘制的时序图,从Launcher开始。可能会存在不准确或看不懂的地方;
因此,也建议读者自己根据源码画一下图,加深理解记忆。
二、Activity任务栈及启动模式
这个点也是Android面试中经常会问的点。我们会用,但保不齐在没做准备
的情况下面试,出现空白卡壳的情况。
$2.1、 Activity Stack/ Task
从Launcher打开的app都会自动加上FLAG_ACTIVITY_NEW_TASK, 因此可知每个app默认启动在不同的Task里,而Task是在ActivityStack里面创建,ActivityStack栈用于存储Activity,而Task则用于管理Activity.
$2.2、 启动模式
- standard:默认标准模式(每次新开都会创建一个activity实例)
- singleTop:栈顶复用
- singleTask:栈内复用
- singleInstance:单例(一个activity占用一个task)
$2.3、taskAffiny的原理
由于启动App时,每个Activity会默认New_Task,此属性在于将当前Activity关联到指定的task下。但此属性要想生效,它必须满足以下条件:
- 1,当前Activity的启动模式必须为singleTask或singleInstance
- 2,当前Activity的allowTaskReparenting得设置为true,即允许当前Activity从启动的Task转移至用taskAffiny指定的Task.
$2.4、onNewIntent()执行过程
-
1,launchMode为:singleTop/singleTask才有效
-
2,当Activity处于onPause时,onPause–>onNewIntent–>onResume()
-
3,当Activity处于onStop时,onStop–>onNewIntent–>onRestart()—>onStart()—>onResume()
备注:在onNewIntent()方法中,记得调用setIntent()将新intent传过去,以免调用getIntent()时获取到的intent为旧的Intent.
$2.5、按Home键退至后台时,Activity生命周期
- 1,正常打开一个Activity的生命周期:onCreate()—>onStart()—onResume()
- 2,按Home键退至桌面时,栈顶Activity的生命周期为:onPause()—>onSaveInstanceState()—>onStop()
- 3,A界面跳B界面:
A#onPause()---->B#onCreate()—B#onStart()—B#onResume()—A#onSaveInstanceState()----A#onStop() - 4,按返回键退出B界面,回到A界面:
B#onPause()----A#onRestart()—A#onStart()—A#onResume()----B#onStop()—B#onDestroy()
注:onSaveInstanceState()只在以下几种情况下才会被调用:
a)、按Home键退出;
b)、从A跳至B界面时;
c)、按下电源键;
d)、屏幕切换
且onSaveInstanceState()与onPause()并没有固定的先后顺序,但一定是在onStop()前。
onRestoreInstanceState():只有当Activity是被系统回收后,再新建重新打开时,才会被调用。如:
$2.6、 屏幕切换,Activity所执行的生命周期
当手机屏幕切换属于系统配置变化,因此它的Activity会重建,主要由android:configChanges=""来配置。
当未配置时:
-
1,从竖屏–》横屏:onSaveInstanceState()—>onPause()---->onStop()—>onDestroy()—>onCreate()—>onStart()—>onRestoreInstaceState()—>onResume()
-
2,从横屏—>竖屏:上面会执行2次
【但实际写Demo打印日志时,在AndroidManifest.xml中未设置configChanges的情况下,依然只会执行一次】会引起系统变化的属性有: “mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。 “mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。 “locale“ 所在地区发生变化。 “touchscreen“ 触摸屏已经改变。(这不应该常发生。) “keyboard“ 键盘模式发生变化,例如:用户接入外部键盘输入。 “keyboardHidden“ 用户打开手机硬件键盘 “navigation“ 导航型发生了变化。(这不应该常发生。) “orientation“ 设备旋转,横向显示和竖向显示模式切换。 “fontScale“ 全局字体大小缩放发生改变 "screenSize" 屏幕尺寸变化
$2.7、Navigation导航组件
这是Android JetPack包中新出的组件,方便管理页面路由,一个APP可由一个Activity与多个Fragment来完成。
没有使用过的同学,可以查阅官方文档:https://developer.android.google.cn/jetpack/androidx/releases/navigation
下一篇将整理分享关于Service,ContentProvider,Broadcast等笔记。