美文网首页Android开发Android开发经验谈Android技术知识
阿里面试官一面就问到:你给我讲讲Fragment和Activit

阿里面试官一面就问到:你给我讲讲Fragment和Activit

作者: Android开发架构师 | 来源:发表于2020-05-18 22:13 被阅读0次

    小编整理了一些关于面试类的文章,含有从基础到进阶。含有BATJ.字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等应有尽有。还有辅之相关的视频+学习笔记

    话不多请看下图↓↓↓ (把所以的知识+每日一题整理成了这份983页的PDF)

    image

    可以简信联系我回复【666】获取完整PDF

    一丶Fragment

    1 、谈一谈 Fragment 的生命周期?

    参考回答: Fragment 从创建到销毁整个生命周期中涉及到的方法依次 为:onAttach()→onCreate()→ onCreateView()→onActivityCreated()→onStart()→onR esume()→onPause()→onStop()→onDestroyView()→onDestroy()→onDetach(),其中和 Activity 有不少名称相同 作用相似的方法,而不同的方法有:

    • onAttach(): 当 Fragment 和 Activity 建立关联时
      调用;
    • onCreateView(): 当 fragment 创建视图调用,在
      onCreate 之后;
    • onActivityCreated(): 当与 Fragment 相关联的
      Activity 完成 onCreate()之后调用;
    • onDestroyView(): 在 Fragment 中的布局被移除时
      调用;
    • onDetach(): 当 Fragment 和 Activity 解除关联时
      调用;

    2 、谈谈 Activity 和 和 Fragment 的区别?

    参考回答: 相似点: 都可包含布局、可有自己的生命周期 不同点:

    • Fragment 相比较于 Activity 多出 4 个回调周期,
      在控制操作上更灵活;
    • Fragment 可以在 XML 文件中直接进行写入,也可以
      在 Activity 中动态添加;
    • Fragment 可以使用 show()/hide()或者 replace()
      随时对 Fragment 进行切换,并且切换的时候不会出
      现明显的效果,用户体验会好;Activity 虽然也可
      以进行切换,但是 Activity 之间切换会有明显的翻
      页或者其他的效果,在小部分内容的切换上给用户
      的感觉不是很好;

    3 、Fragment 中 add 与 与 replace 的区别(Fragment 重叠)

    参考回答:

    • add 不会重新初始化 fragment,replace 每次都会。所以
      如果在 fragment 生命周期内获取获取数据,使用 replace
      会重复获取;
    • 添加相同的 fragment 时,replace 不会有任何变化,add
      会报 IllegalStateException 异常;
    • replace 先 remove 掉相同 id 的所有 fragment,然后在
      add 当前的这个 fragment,而 add 是覆盖前一个
      fragment。所以如果使用 add 一般会伴随 hide()和
      show(),避免布局重叠;
    • 使用 add,如果应用放在后台,或以其他方式被系统销
      毁,再打开时,hide()中引用的 fragment 会销毁,所以依
      然会出现布局重叠 bug,可以使用 replace 或使用 add
      时,添加一个 tag 参数;

    4 、 getFragmentManager、 getSupportFragmentManager 、

    getChildFragmentManager 之间的区别? 参考回答:

    • getFragmentManager()所得到的是所在 fragment 的 父容器
      的管理器, getChildFragmentManager()所得到的是在
      fragment 里面 子容器的管理器, 如果是 fragment 嵌套
      fragment,那么就需要利用
      getChildFragmentManager();
    • 因为 Fragment 是 3.0 Android 系统 API 版本才出现的组
      件,所以 3.0 以上系统可以直接调用
      getFragmentManager()来获取FragmentManager()对象,
      而 3.0 以下则需要调用 getSupportFragmentManager() 来
      间接获取;

    5 、FragmentPagerAdapter 与 与 FragmentStatePagerAdapter 的区别与使用场景

    参考回答: 相同点 : 二者都继承 PagerAdapter 不同点 : FragmentPagerAdapter 的每个 Fragment 会持久的保存在 FragmentManager 中,只要用户可以返回到页面 中,它都不会被销毁。因此适用于那些数据 相对静态的 页,Fragment 数量也比较少的那种;FragmentStatePagerAdapter 只保留当前页面,当页面不 可见时,该 Fragment 就会被消除,释放其资源。因此适用 于那些 数据动态性较大、 占用内存较多,多 Fragment 的情 况;

    二、Activity

    1丶说下 Activity 生命周期?

    参考解答: 在正常情况下,Activity 的常用生命周期就只有如下 7 个

    • onCreate(): 表示 Activity 正在被创建,常用来 初始化工作,比
      如调用 setContentView 加载界面布局资源,初始化 Activity 所
      需数据等;
    • onRestart():表示 Activity 正在重新启动,一般情况下,当前
      Acitivty 从不可见重新变为可见时,OnRestart就会被调用;
    • onStart(): 表示 Activity 正在被启动,此时 Activity 可见但不
      在前台,还处于后台,无法与用户交互;
    • onResume(): 表示 Activity 获得焦点,此时 Activity 可见且在
      前台并开始活动,这是与 onStart 的区别所在;
    • onPause(): 表示 Activity 正在停止,此时可做一些 存储数据、
      停止动画等工作,但是不能太耗时,因为这会影响到新 Activity
      的显示,onPause 必须先执行完,新 Activity 的 onResume 才会
      执行;
    • onStop(): 表示 Activity 即将停止,可以做一些稍微重量级的回
      收工作,比如注销广播接收器、关闭网络连接等,同样不能太耗
      时;
    • onDestroy(): 表示 Activity 即将被销毁,这是 Activity 生命周
      期中的最后一个回调,常做 回收工作、资源释放;

    延伸: 从 整个生命周期来看,onCreate 和 onDestroy 是配对的,分别标识着 Activity 的创建和销毁,并且只可能有 一次调用; 从 Activity 是否可见来说,onStart 和 onStop 是配对的,这两个方法可能被 调用多次; 从 Activity 是否在前台来说,onResume 和 onPause 是配对的,这两个方法可能被 调用多次; 除了这种区别,在实际使用中没有其他明显区别;

    2 、 Activity A 启动另一个 Activity B 会调用哪些方法?如果 B 是透明主题的又或则是个 DialogActivity 呢 ?

    参考解答: Activity A 启动另一个 Activity B,回调如下

    • Activity A 的 onPause() → Activity B 的 onCreate() →
      onStart() → onResume() → Activity A 的 onStop();
    • 如果 B 是透明主题又或则是个 DialogActivity,则不会回调 A 的onStop;

    3 、说下 onSaveInstanceState() 方法的作用 ? ? 何时会被调用?

    参考解答:

    发生条件:异常情况下( 系统配置发生改变时导致 Activity被杀死并重新创建、资源内存不足导致低优先级的 Activity 被杀死

    • 系统会调用 onSaveInstanceState 来保存当前 Activity 的状态,
      此方法调用在 onStop 之前,与 onPause 没有既定的时序关系;
    • 当 Activity 被重建后,系统会调用 onRestoreInstanceState,
      并且把 onSave(简称)方法所保存的 Bundle 对象 同时传参给
      onRestore(简称)和onCreate(),因此可以通过这两个方法判断Activity 是否被重建,调用在 onStart 之后;

    4 、说下 Activity 的四种启动模式、应用场景 ?

    参考回答:

    • standard 标准模式: 每次启动一个 Activity 都会重新创建一个
      新的实例,不管这个实例是否已经存在,此模式的 Activity 默认
      会进入启动它的 Activity 所属的任务栈中;
    • singleTop 栈顶复用模式: 如果新 Activity 已经位于任务栈的栈顶,那么此 Activity 不会被重新创建,同时会回调 onNewIntent方法,如果新 Activity 实例已经存在但不在栈顶,那么Activity 依然会被重新创建;
    • singleTask 栈内复用模式: 只要 Activity 在一个任务栈中存在,那么多次启动此 Activity 都不会重新创建实例,并回调
      onNewIntent 方法,此模式启动 Activity A,系统首先会寻找是
      否存在 A 想要的任务栈,如果不存在,就会重新创建一个任务
      栈,然后把创建好 A 的实例放到栈中;
    • singleInstance单实例模式: 这是一种加强的 singleTask 模
      式,具有此种模式的 Activity 只能单独地位于一个任务栈中,且
      此任务栈中只有唯一一个实例;

    5 、了解哪些 Activity 常用的标记位 Flags ?

    参考回答:

    • FLAG_ACTIVITY_NEW_TASK : 对应 singleTask 启动模式,其效果和在 XML 中指定该启动模式相同;
    • FLAG_ACTIVITY_SINGLE_TOP : 对应 singleTop 启动模式,其效果和在 XML 中指定该启动模式相同;
    • FLAG_ACTIVITY_CLEAR_TOP : 具有此标记位的 Activity,当它启动时,在同一个任务栈中所有位于它上面的 Activity 都要出栈。这个标记位一般会和 singleTask 模式一起出现,在这种情况下,被启动 Activity 的实例如果已经存在,那么系统就会回调onNewIntent。如果被启动的 Activity 采用 standard 模式启动,那么它以及连同它之上的 Activity 都要出栈,系统会创建新的Activity 实例并放入栈中;
    • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS : 具有这个标记的Activity 不会出现在历史 Activity 列表中;

    6 、说下 Activity 跟 跟 window , view 之间的关系?

    参考回答: Activity 创建时通过 attach()初始化了一个 Window 也就是 PhoneWindow,一个 PhoneWindow 持有一个 DecorView 的实例,DecorView 本身是一个 FrameLayout,继承于 View,Activty 通过setContentView 将 xml 布局控件不断 addView()添加到 View 中,最终显示到 Window 于我们交互;

    7 、横竖屏切换的 Activity 生命周期变化?

    参考回答:

    • 不设置 Activity 的 android:configChanges 时,切屏会销毁当前Activity,然后重新加载调用各个生命周期,切横屏时会执行一
      次,切竖屏时会执行两次;onPause()→onStop()→onDestory()→onCreate()→onStart()→onResume()
    • 设置 Activity 的 android:configChanges=" orientation",经过
      机型测试 在 Android5.1 即 即 API 3 23 级别下,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次 在 Android9 即 即 API 8 28 级别下,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法 官方纠正后,原话如下
      如果您的应用面向 Android 2 3.2 即 即 API 级别 3 13 或更
      高级别(按照 minSdkVersion 和 targetSdkVersion)

    最后

    今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

    最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

    还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

    【算法合集】

    image

    【延伸Android必备知识点】

    image

    【Android部分高级架构视频学习资源】

    Android精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

    【Android进阶学习视频】、【全套Android面试秘籍】关注我+转发,简信回复【666】就可免费领取方式!

    相关文章

      网友评论

        本文标题:阿里面试官一面就问到:你给我讲讲Fragment和Activit

        本文链接:https://www.haomeiwen.com/subject/ilkmohtx.html