【最新Android高级面试知识点干货分享(四)】

【最新Android高级面试知识点干货分享(三)】
转载请说明出处

前面用了三篇来整理分享了我的java笔记。
接下来从第四篇开始,我将正式开启我的Android面试笔记分享。

《Android篇》

一、Activity启动流程

这是我自己绘制的时序图,从Launcher开始。可能会存在不准确或看不懂的地方;
因此,也建议读者自己根据源码画一下图,加深理解记忆。

Activity启动流程

二、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等笔记。

原创文章 80 获赞 34 访问量 17万+

猜你喜欢

转载自blog.csdn.net/u011153817/article/details/105855186