GVKun编程网logo

Android面试知识点总结宝典助你通关!系列教学(android面试基础知识)

22

对于想了解Android面试知识点总结宝典助你通关!系列教学的读者,本文将提供新的信息,我们将详细介绍android面试基础知识,并且为您提供关于2021年Android面试心得,系列教学、2021最

对于想了解Android面试知识点总结宝典助你通关!系列教学的读者,本文将提供新的信息,我们将详细介绍android面试基础知识,并且为您提供关于2021年Android面试心得,系列教学、2021最新中高阶Android面试题总结,系列教学、71道经典Android面试题和答案_android面试题库,android面试题-Android文档类资源-CSDN下载、Android 四大组件知识点总结的有价值信息。

本文目录一览:

Android面试知识点总结宝典助你通关!系列教学(android面试基础知识)

Android面试知识点总结宝典助你通关!系列教学(android面试基础知识)

腾讯面试中的重点及经常问到技术点:

数据结构算法,调优,View,SDK**,**动画音视频等以及你使用过的框架且第一轮的基础很重要,通过后录取可能性就相对高了!

金三银四已经到了,在这也免费分享一些Java程序员面试常问架构面试专题和答案以及架构视频资料(文末领取),希望那些有需要朋友能在今年第一波招聘潮找到一个自己满意顺心的工作!

第二层

面试官对我的偷鸡取巧并不满意啊,他需要我提速,这个速度不行啊。

What??是有时间复杂度更低的吗?不不不,这是一道核心竟然是一道多线程的题目。

  1. 将10亿的数据分片,通过分治的思维对数据进行第一次处理。
  2. 开启多线程然后对其进行这些分片的数据进行优先级队列操作。
  3. 然后每个子线程筛选出其中最大的k个数
  4. 当所有线程执行完毕之后合并数据

我猜测的第三层

  1. 是不是考虑下多少个数据一分片,然后如何把效能提升到最高的问题?
  2. 构建多少个线程读取效率是最高的?

这个都是我没想到的,各位大佬有想法的可以聊一下啊。

题二:一篇文章内的单词数量

这题乍一看卧槽貌似不难,foreach循环碰到一个空格或者标点的情况下sum++,是不是就可以解决这个问题。

然而事情并没有想想的这么简单。面试被问到这种问题最难的是什么,可能是对于这题目真实的边界问题的思考。

  1. 如果这篇文章内容很大怎么办,会不会把内存吃光?
  2. 如何给单词去除重复?

是不是可以考虑逐行读取呢?

将其转化成IO流,逐行读取流,之后对这个输入内容进行一次计数操作,是不是就可以解决这个问题呢。

单词重复的问题

卧槽,这个真简单HashSet啊!!!!那么如果海量数据我是不是又炸了?

卧槽,死亡螺旋吗。或许我们可以考虑下用hash的方式来解决,只保留单词的hashcode,是不是可能可以解决呢。

同样的这个也可以使用多线程分片去优化

方式的话基本也和上面是完全一样的,只要把数据分片,之后多线程调度,然后合并结果就可以了。

总结

【Android 详细知识点思维脑图(技能树)】

image

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

详细整理在腾讯文档:Android架构视频+BAT面试专题PDF+学习笔记​

频+BAT面试专题PDF+学习笔记](https://docs.qq.com/doc/DSkNLaERkbnFoS0ZF)​**

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2021年Android面试心得,系列教学

2021年Android面试心得,系列教学

Android没凉,只是比以前难混了

7年前Android异军突起,成了新的万亿级市场,无数掘金人涌入,期待可以一展拳脚。

那时候大环境下的手游圈,只要你能有个可以运行的连连看就能找到工作,走上赛道被浪潮推着前进,这个行业不可谓不光明。

2020了,浪潮速度放缓,漫天飞舞着唱衰Android的讯息,“凉凉”是最多的字眼。

但放心,Android真的没凉!

Android入门相对简单,初级Android很多很多,趋近饱和,你随意打开一个招聘app就能很直观的判断出来,现在Android准入的条件越来越高了。

当一个行业的标准越来越高,基础的东西越来越稳定,这哪叫凉,叫成熟。

二、面试

下面主要列举下在面试过程中遇到过的剑指 offer 原题或者类似问题,大家应该清楚,面试过程中遇到原题不要太高兴,而刷剑指 offer 就能让遇到原题的可能性大大增加。

1.字节跳动春招

面试题 68 - II. 二叉树的最近公共祖先

2.京东金融电话面试

面试题 10- II. 青蛙跳台阶问题
面试题 13. 机器人的运动范围

3.猿辅导面试

面试题 22. 链表中倒数第 k 个节点
面试题 09. 用两个栈实现队列

4.百度面试

面试题 25. 合并两个排序的链表

5.腾讯面试

面试题 24. 反转链表
面试题 34. 二叉树中和为某一值的路径
面试题 16. 数值的整数次方

6.快手面试

面试题 35. 复杂链表的复制

7.微策略面试

面试题 36. 二叉搜索树与双向链表

8.宜信面试

面试题 68 - II. 二叉树的最近公共祖先

三、为何推荐剑指 Offer ?

开始刷题前,学长们清一色地向我力荐剑指 Offer 。一年以来,我已将剑指 Offer 刷了数遍,这使我在科研学习、秋招求职中受益匪浅。总体上看,剑指 Offer 或许是最友好、最适合求职初学者的题库之一,优点如下:

1. 知识全面
LeetCode 的题库庞大,以下每个分类都能筛选出数百道问题。而由于精力有限,我们只能做完部分题目。因而我们需要解决两个难题:从哪个分类开始做题?每个分类做哪些题?

数据结构: 数组、栈、队列、字符串、链表、树、图、堆、哈希表、……
算法: 动态规划、回溯算法、查找算法、搜索算法、贪心算法、分治算法、位运算、双指针、排序、模拟、数学、……
剑指 Offer 的短短 75 道题,涵盖了以上所有分类,能够帮助我们 快速入门 。

2. 题目典型
做典型题目可以事半功倍,无论是对于面试准备,还是知识积累。剑指 Offer 原题活跃在各大公司的笔面试中。根据笔者亲身经历,面试手撕算法 的遭遇概率较高,笔试 相对较低(但有许多原题的变种)。

3. 资料完备
对于初学者来说,遇到新的题目常常无从下手。因此,优良的题解资料尤其重要,其很大程度上 决定了刷题效率和质量 。剑指 Offer 热度较高,无论是在 LeetCode 的题解区和评论区,还是在搜索引擎和各大平台中,都可以找到丰富的学习资料。

剑指 Offer 系列题解
经过笔者近三个月的日夜奋斗,已更新 近 70 道原创题解 ,希望可以帮助到像我当初同样一头雾水的同学。

题解中均介绍最优解决方法之一(部分题目介绍多解法),内容包括:

解题思路: 介绍解法的来龙去脉,解法往往是从简单的想法、数据结构的定义、算法的原理导出的。
算法流程: 可理解为详细的代码注释,致力于帮助各位养成结构化、模块化的代码编写习惯。
复杂度分析: 时间和空间复杂度是评价解法优劣性的最有力的尺度之一,且面试经常会被问到。
清晰配图: 帮助各位理解解法的重难点,并提供测试样例的可视化运行。

面试复习路线,梳理知识,提升储备

自己的知识准备得怎么样,这直接决定了你能否顺利通过一面和二面,所以在面试前来一个知识梳理,看需不需要提升自己的知识储备是很有必要的。

关于知识梳理,这里再分享一下我面试这段时间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)

资料获取方式:前往我的腾讯文档

  • 架构师筑基必备技能
  • Android高级UI与FrameWork源码
  • 360°全方面性能调优
  • 解读开源框架设计思想
  • NDK模块开发
  • 微信小程序
  • Hybrid 开发与Flutter

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结:

Android开发七大模块核心知识笔记

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看api文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

4207399)]

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看api文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

2021最新中高阶Android面试题总结,系列教学

2021最新中高阶Android面试题总结,系列教学

越来越多的人在提“移动端的下半场”、“Android 开发的焦虑”之类的,也有人在喊“技术天天在变,学也学不完”,“昨天 Kotlin 今天 Flutter”。其实我却认为,如果你技术达到了一定程度,你无需太过在意这些。

移动端真正进入下半场了吗?于我看来并没有,最多说“Android 技术的探索”进入了下半场,而整个市场还是乐观的。以前是 BAT 的天下,而近两年出来越来越多的独角兽:头条、抖音、拼多多、快手、小猿搜题等,这些公司的业务都在移动端上,他们需要招聘更多的移动端人才。如果真要说下半场,只能说很多小型创业公司在退出市场,这确实会导致很多入门工程师失业,但这也说明了这个行业在更加规范。

而且,对于 Android 工程师而言,这更是个好的时代。互联网下沉,那么下沉市场里的用户是使用 Android 多还是 iOS 多,大家都清楚。

那么,对于工程师而言需要做什么才能存活呢?很简单,要么转行,要么提高。我相信,一个技术不错的工程师,不但无需焦虑,而且在这个时代,能够拥有稳定的职业生涯和丰厚的收入。

1. Android架构设计模式

  • MVC架构设计模式:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。
  • MVP架构设计模式:MVC全名是Model View Persenter,MVP由MVC演变而来,是现在主流的开发模式。
  • MVVM架构设计模式:MVVM全名是Model-View-viewmodel,它本质上就是MVC的改进版。

各种模型的**主要目的**都是是分离视图(View)和模型(Model),即将UI界面显示和业务逻辑进行分离。

1.1 架构设计模式-MVC

(1) 定义:

在android开发过程中,比较流行的开发框架曾经采用的是MVC框架模式。

  • M(Model)层:实体模型,处理业务逻辑。如:数据库操作,网络操作,I/O操作,复杂操作和耗时任务等。
  • V(View)层:处理数据显示。在Android开发中,它一般对应着xml布局文件。
  • C(Controller)层:处理用户交互。在Android开发中,它一般对应着Activity/Feagment。android中主要通过activity处理用户交互和业务逻辑,接受用户的输入并调用Model和View去完成用户的需求。

(2) 特点

  • 低耦合
  • 可重用易拓展
  • 模块职责划分明确

(3) 实例

android本身的设计结构符合 MVC 模式。

(4) MVC优缺点

  • MVC的优点:MVC模式通过Controller来掌控全局,同时将View展示和Model的变化分离开
  • MVC也有局限性:

View层对应xml布局文件能做的事情非常有限,所以需要把大部分View相关的操作移到Controller层的activity中。导致activity相当于充当了2个角色(View层和Controller层),不仅要处理业务逻辑,还要操作UI。一旦一个页面的业务繁多复杂的话,activity的代码就会越来越臃肿和复杂。

1.2 架构设计模式-MVP

MVP是从经典的MVC模式演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。在Android开发中,MVP的具体实现流程是当Presenter接收到View的请求,便从Model层获取数据,将数据进行处理。处理好的数据再通过View层的接口回调给Activity或Fragment。这样MVP能够让Activity或Fragment成为真正的View,只做与UI相关的事而不处理其他业务流程。

(1) 定义

  • M(Model)层:实体模型,处理业务逻辑。如:数据库操作,网络操作,I/O操作,复杂操作和耗时任务等。
  • V(View)层:负责View的绘制以及与用户交互。在Android开发中,它一般对应着xml布局文件和Activity/Fragment
  • P(Presenter)层:负责完成Model层和View层间的数据交互业务逻辑

(2) 实例

(3) MVC和MVP的区别

MVP中的View并不直接使用Model,它们之间的通信是通过Presenter来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不通过Controller

  • MVC和MVP的最大区别:MVC的Model层和View层能够直接交互;MVP的Model层和View层不能直接交互,需通过Presenter层来进行交互。
  • Activity职责不同:Activity在MVC中属于Controller层,在MVP中属于View层,这是MVC和MVP很主要的一个区别。可以说Android从MVC转向MVP开发也主要是优化Activity的代码,避免Activity的代码臃肿庞大
  • View层不同:MVC的View层指的是XML布局文件(或用Java自定义的View);MVP的View层是Activity(或Fragment)
  • 控制层不同:MVC的控制层是Activity(或Fragment);MVP的控制层是Presenter,里面没有很多的实际东西,主要负责Model层和View层的交互。

(4) MVP优缺点

  • MVP的优点如下:

模型与视图完全分离,我们可以修改视图而不影响模型;项目代码结构清晰,一看就知道什么类干什么事情;我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑,这个特性非常的有用,因为视图的变化总是比模型的变化更频繁 ;协同工作(例如在设计师没出图之前可以先写一些业务逻辑代码)

  • MVP也有不足之处:

接口过多,一定程度影响了编码效率。一定程度上导致Presenter的代码量过大。
为了降低Presenter中业务繁多的问题,Google又推出了MVVM,试图通过数据驱动来减少Presenter的代码量。

1.3 架构设计模式-MVVM

(1) 定义

  • M(Model)层:仍然是实体模型(但是不同于之前定义的Model层),主要负责数据获取、存储和变化,提供数据接口供 viewmodel 层调用。
  • V(View)层:对应Activity/Feagmentxml布局文件 ,负责View的绘制以及与用户交互
    说明:View层仅能操作UI(数据绑定来实现 UI 更新);不能做任何和业务逻辑有关的数据操作
  • VM(viewmodel)层:负责完成Model层和View层间的数据交互业务逻辑
    说明:viewmodel层仅能做和业务逻辑有关的数据操作;不能做UI相关的操作

2. android插件化

插件化来由:随着业务的增多,业务逻辑代码越来越多,apk包也逐渐增大,不利于维护和升级。通过插件化开发可将功能模块解耦,不同的维护团队仅维护某模块的业务,同时当app升级时可仅对某功能模块进行升级而不需整体升级。

2.1 插件化要解决的问题—如何动态加载apk

(1) android类加载器及区别

类加载器作用:java字节码通过类加载器加载到java虚拟器。

  • PathClassLoader:仅能加载文件目录下的apk。
  • DexClassLoader:可以加载apk文件中的字节码(从dex实体jar文件中加载java字节码)。主要用于动态加载和代码热更新等。

(2)反射: java中的反射使我们在运行时获得这个类的属性、方法和class内部的信息机制,最重要的是我们可以在运行时实例化这个对象调用方法,这也是java反射的最大优点。
(3) 实现动态加载apk

什么是动态加载apk:android中有一个速度程序会主动到指定的sd卡中去加载apk,并通过代理activity去执行。

实现:需要一个代理activity去执行apk中的activity,主要通过反射去获得它的属性和方法,从而进行apk的调用。
实现原理:类加载器(加载类)+反射(获取属性和方法)+动态代理(执行)

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

下图是我进阶学习所积累的历年腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节

以上【历年大厂高级工程师面试题集】、【Android高级进阶教学视频】、【Android高级知识点学习PDF】皆无偿分享给大家。如有需要,点击**【Android架构视频+BATJ面试专题PDF+学习笔记】**即可免费获取。

B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)**即可免费获取。

整理不易,望各位看官老爷点个关注转发,谢谢!祝大家都能得到自己心仪工作。

71道经典Android面试题和答案_android面试题库,android面试题-Android文档类资源-CSDN下载

71道经典Android面试题和答案_android面试题库,android面试题-Android文档类资源-CSDN下载

71道经典Android面试题和答案_android面试题库,android面试题-Android文档类资源-CSDN下载

Android 四大组件知识点总结

Android 四大组件知识点总结

预备知识

1. Intent

Intent 是信使,负责完成 Android 四大组件之间的信息传递,同类、不同类的组件无法直接传递对象,一旦需要沟通只能通过 Intent(不建议通过静态变量或静态方法传递数据,容易造成数据异常、内存泄露等问题)。

2. 生命周期

生命周期是指组件的实例对象从创建到销毁可能会被系统调用的一些方法,每个方法的调用都有特定的条件,可以根据需要重写生命周期方法来达到在某些特定时刻执行特定任务的目的。生命周期方法不建议自行调用,应由系统管理。

3. 注册组件

四大组件都需要通过项目中的 AndroidManifest.xml 文件进行静态注册后才可正常使用,其中 BroadcastReceiver 可以在其他组件中动态注册(Android6.0 版本开始限制静态注册,除少部分广播如开机广播之外,大部分广播的静态注册是无效的)。

4. 响应时间

应用主线程未在规定的时间内执行完任务,系统会报 ANR(应用程序无响应)错误,因此应将耗时任务交由子线程完成,具体的限定时间和执行位置如下:

  1. Activity:5 秒内执行完成,包括各个生命周期方法、View 的触摸点击事件、输入输出操作等。
  2. Service:20 秒内执行完成,主要是各个生命周期方法。
  3. BroadcastReceiver:10 秒内执行完成,主要是 onReceive () 方法。

1. Activity

1.1 基本知识

概念

Activity 直译为 “活动”,在应用中的一个 Activity 可以理解为一个界面,可以包含各类布局与控件展现丰富的可视化效果,主要用于和用户进行交互。一个应用必须通过 Activity 来启动和运行,一个应用可以只有一个 Activity,也可以由多个 Activity 组成。

应用中的所有 Activity 都被系统保存在 TaskStack 任务栈中,一般一个应用只有一个 TaskStack 任务栈,但也可以调整 Activity 的启动模式来开启多个 TaskStack 任务栈。既然叫栈,自然是有栈的特性,当前可交互的 Activity 在栈顶,先启动的 Activity 在栈底,栈顶 Activity 出栈则底层 Activity 被用户可见并开始交互,任务栈清空时应用结束。

作用

Activity 是应用最直观的入口,一个应用可以没有其他组件,但是不能没有 Activity。用户的 IO 操作都由 Activity 进行处理,应用的数据展示、吸引人的动画、优秀的界面设计等都需要 Activity 进行展示,用户只关心看得见的东西,看不见效果再好的应用都没用户量,再牛逼的应用最少也得有文字展示一下不是吗?

生命周期

Activity 的生命周期已经是翻烂的书了,最基础的知识点,千万不可忽视。首先就得上个图:
Activity生命周期
Activity状态转换
生命周期大多是成对出现的:


  1. onCreate() onDestroy(),生命的起始与终结。
  2. onStart() onStop(),界面的可见与否。
  3. onResume() onPause(),是否可进行交互。

详细介绍:

  1. onCreate():第一个调用的方法,通常在该方法中加载布局文件、初始化资源、注册事件与 BroadcastReceiver 等较重的任务。
  2. onStart():在 onCreate() 方法后调用,通常在该方法中处理 UI 的显示控制逻辑,任务不可过重,用户此时无法交互也无法直接看见当前 Activity
  3. onResume():在 onStart() 方法后调用,通常在该方法中进行简单的数据处理与 UI 控制,如开始动画,只执行轻量任务,方法执行后用户可进行交互并可直接看见当前 Activity。此时,当前 Activity 进入 Resumed 状态(运行状态),当一个 Paused 状态的 Activity 重新位于栈顶时(从其他 Activity 返回),会再次调用该方法。
  4. onPause():当前 Activity 被其他 Activity 覆盖时调用,让当前 Activity 进入 Paused 状态 (暂停状态),此时当前 Activity 可见但不可交互。通常在此方法中进行简单的数据处理与 UI 控制,如暂停动画,只执行轻量任务。内存不足且无其他优先级更低的 Activity 时,当前 Activity 可能会被销毁。当前 Activity 重新位于栈顶时(从其他 Activity 返回),会调用 onResume() 方法。
  5. onStop(): 当前 Activity 被其他 Activity 完全覆盖(若上层 Activity 透明或半透明时,只调用 onPause() 方法)时调用,当前 Activity 进入 Stopped 状态 (停止状态),当前 Activity 不可见。通常在此方法中处理 UI 的显示控制逻辑,任务不可过重。内存不足且无其他优先级更低的 Activity 时,当前 Activity 可能会被销毁。还行当前 Activity 重新位于栈顶时(从其他 Activity 返回),会调用 onRestart() 方法。
  6. onRestat(): 当一个 Stopped 状态的 Activity 被返回时,该方法被调用,之后再调用 onStart() 方法和 onResume() 方法进入运行状态。
  7. onDestroy(): 当前 Activity 被销毁时调用,通常在该方法中用来执行释放资源等较重的任务。

启动

启动模式

  1. Standard:标准模式,Activity 的默认启动模式。在这种模式下,Activity 可以有多个实例,每次启动 Activity,无论任务栈中是否已经存在这个 Activity 的实例,系统都会创建一个新的 Activity 实例。
  2. SingleTop:栈顶模式,栈顶 Activity 复用的模式。当一个 SingleTop 模式的 Activity 已经位于栈顶时,再去启动它则不再创建新的实例;如果不在栈顶,无论任务栈中是否已经存在这个 Activity 的实例,系统都会创建一个新的 Activity 实例。
  3. SingleTask:单任务模式,栈内 Activity 复用的模式。如果启动的 Activity 已经存在于任务栈中,则会将此 Activity 上层的其他 Activity 出栈,使此 Activity 位于栈顶;否则创建一个新的 Activity 实例。
  4. SingleInstance:单实例模式。在该模式下,系统会启动一个新的栈来管理该 Activity,不同应用之间可以共享该 Activity

Activity 跳转

  1. 显式启动Intent 直接指定要启动的 Activity 所对应的的 class,可以通过 Intent 构造方法、setClasssetClassName 三种方式指定。
  2. 隐式启动Intent 指定匹配条件,由 Activity 注册在 AndroidManifest.xml 文件中的 intent-filter 节点进行匹配,条件有 actioncategorydata 三种,全部或者部分匹配都可以。

1.2 疑难点

两个 Activity 跳转时的生命周期

常见的场景就是两个 Activity 跳转,如 A 跳转到 B,此时 A 和 B 的生命周期交织在一起,并不是简单的 A 执行完所有的生命周期再从头执行 B 的生命周期。

  1. 当 B 无实例,且不是透明或半透明时:A.onPause ()> B.onCreate () > B.onStart () > B.onResume () > A.onStop ()。
    此时从 B 返回 A:B.onPause ()> A.onRestart () > A.onStart () > A.onResume () > B.onStop () > B.onDestroy ()。
  2. 当 B 无实例,且为透明或半透明时:A.onPause ()> B.onCreate () > B.onStart () > B.onResume ()。
    此时从 B 返回 A:B.onPause ()> A.onResume () > B.onStop () > B.onDestroy ()。

透明的 B 将导致 A 被 B 覆盖时不执行 A.onStop () 方法,B 返回 A 时也不执行 A.onRestart () > A.onStart () 这两个方法。接下来的就不考虑透明的情况了,举一反三。

  1. 当 B 有实例,B 为 SingleTop 模式,且 B 位于栈顶(B 不位于栈顶时相当于无实例,参考 1、2 两点):此时 A 不在栈顶,其生命周期并不执行,B 无生命周期变化,但系统会调用 B.onNewIntent () 方法告知 B 接收到了新的 Intent。
  2. 当 B 有实例,B 为 SingleTask 模式:A.onPause ()> B.onRestart () > B.onStart () > B.onNewIntent () > B.onResume ()(onNewIntent () 与 onResume () 无确定先后顺序,位置可能交换)> A.onStop () > 原本栈内位于 B 之上的 Activity 进入销毁流程。

1.3 面试常考

说一下 Activity 的生命周期 / 各个生命周期的作用 ?

考察基础,必背知识点。答案见上

onStart () 和 onResume ()/onPause () 和 onStop () 的区别?

是否位于前台,对用户是否可见的区别。

Activity A 启动另一个 Activity B 会回调哪些方法?如果 Activity B 是完全透明呢?如果启动的是一个 Dialog 呢?

参考本文《1.2 疑难点 - 两个 Activity 跳转时的生命周期》,对话框则不会调用生命周期方法。

如何将一个 Activity 设置成窗口的样式?

只需要给我们的 Activity 配置如下属性即可。
android:theme="@android:style/Theme.Dialog"

谈谈 onSaveInstanceState () 方法?何时会调用?

当 Activity 意外销毁时再重新创建时会调用此方法,比如横竖屏切换,会导致重新创建 Activity,onSaveInstanceState () 方法的调用在 onStop () 之前,用于保存当前 Activity 的状态,当 Activity 被重新创建后,会调用 onRestoreInstanceState () 来恢复 Activity 的状态,onRestoreInstanceState () 的调用在 onStart () 之前。

onSaveInstanceState () 被执行的场景有哪些:

系统不知道你按下 HOME 后要运行多少其他的程序,自然也不知道 activity 是否会被销毁,因此系统都会调用 onSaveInstanceState (),让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则:

  1. 当用户按下 HOME 键时
  2. 长按 HOME 键,选择运行其他的程序时
  3. 锁屏时
  4. 从 activity A 中启动一个新的 activity 时
  5. 屏幕方向切换时

onSaveInstanceState () 与 onPause () 的区别?

两者执行没有固定的先后顺序。

onSavedinstance () 方法的触发时机,其典型的情景是按 Home 键或者切换 Activity,这样的 Activity 可能被销毁的场合,但是按 Back 键退出程序,则不会调用此方法,适合保存一些非持久性的数据(即程序运行期间需要储存的数据)。

而 onPause (),不管是可能销毁还是退出程序,都必须调用,适合保存持久性的数据,但是 Android 本身没有为此方法提供 Bundle 参数,因此我们可以选用做一个静态变量或者是提供一个 SharedPreference 作为数据载体。

如何避免配置改变 / 横竖屏切换时 Activity 重建?

在清单文件下每个 activity 注册时写上 android:configChanges=“XXX”
比如横竖屏切换:android:configChanges=“orientation”

优先级低的 Activity 在内存不足被回收后怎样做可以恢复到销毁前状态?

  1. Task 和 Activity 栈以及相应的 Intent 和数据会被系统保存起来。当 APP 被切回前台时,系统会恢复 Task 和 Activity 栈以及相应的 Intent 和数据。Activity 之间传数据应该用系统提供的 intent 机制。
  2. 不要在 Application 类和全局单例类中存放数据,会导致 app 无法正确恢复状态。运行时的临时数据应存放在 SharedPreference、临时文件或数据库中。
  3. 充分利用 onSaveInstanceState () 和 onRestoreInstanceState () 方法,当 Activity 被重新创建后方便恢复 Activity 的状态。

说下 Activity 的四种启动模式?(有时会出个实际问题来分析返回栈中 Activity 的情况)

参考本文《1.1 基本知识 - 启动》,《1.2 疑难点 - 两个 Activity 跳转时的生命周期》。

谈谈 singleTop 和 singleTask 的区别以及应用场景?onNewIntent () 调用时机?

参考本文《1.1 基本知识 - 启动》,《1.2 疑难点 - 两个 Activity 跳转时的生命周期》。

了解哪些 Activity 启动模式的标记位?

Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// 指定 singleTask 模式,与在 AndroidManifest.xml 中指定 android:launchMode"singleTask" 效果相同

Intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
// 指定 singleTop 模式,与在 AndroidManifest.xml 中指定 android:launchMode"singleTop" 效果相同

Intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// 具有这个标志的 Activity 启动时,在同一个任务栈中所以位于它上面的 Activity 都要出栈,一般会和 singleTask 模式一起出现

Intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
// 具有这个标志的 Activity 不会出现在历史的 Activity 列表中,它等同于在 AndroidManifest.xml 中指定 android:excludeFromRecents=“true”
标记位优先级比在 AndroidManifest 中指定优先级高

如何启动其他应用的 Activity?

SingleTask 和 taskAfiinity 配合使用。

谈一谈 Fragment 的生命周期?

Fragment生命周期
Fragment与Activity的生命周期对应

Activity 和 Fragment 的异同?

1、从最基础的开始说 —> 生命周期

Activity 有 7 个生命周期:onCreate (); onStart (); onResume (); onPause (); onStop (); onDestroy (); onRestart ();

Fragment 有 11 个生命周期:onAttach (); onCreate (); onCreateView (); onActivityCreate (); onStart (); onResume (); onPause (); onStop (); onDestroyView (); onDestroy (); onDetach ();

所以 Fragment 比较与 Activity 来说会更加灵活,因为生命周期多了,你可以控制的地方也就多了。

2、从灵活性上来说

Activity 是四大组件之一,是每个页面的承载,一个就是一个,Fragment 的显示要依赖于 Activity,从 Fragment 的生命周期中就可以了解到。

Fragment 是一个一个的小碎片

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

Activity 和 Fragment 的关系?

Fragment 的显示要依赖于 Activity,从 Fragment 的生命周期中就可以了解到。

何时会考虑使用 Fragment?

类似微信下方菜单栏,以及手机和平板适配等。

2. Service

2.1 基本知识

概念

Service 直译为 “服务”,主要用于在后台处理一些耗时的逻辑,或者执行一些需要长期运行的任务。必要的时候,甚至可以让服务在程序退出的情况下继续运行。

作用

承担大部分的数据处理工作,为其他组件提供繁重耗时的后台服务,可监控其他组件的运行状态。

生命周期

Service 的生命周期得分两种情况,根据 Service 的启动方式分为 Unbounded 和 Bounded 两种,如下图:
Service生命周期

  1. Unbounded 是 Service 被 startService () 方法启动时经历的生命周期,Service 不处于活动状态时,经历 onCreate () > onStartCommand () 流程进入活动状态,此时再次启动 Service 只调用 onStartCommand () 方法。
  2. Bounded 是 Service 被 bindService () 方法启动时经历的生命周期,Service 不处于绑定状态时,经历 onCreate () > onBind () 流程进入绑定状态,此时再次绑定 Service 只调用 onBind () 方法。

启动

Service 的启动方式有两种:startService () 和 bindService ()。

  1. 使用 startService () 方法启动 Service,调用者与 Service 之间没有关系,即使调用者退出了,Service 仍然运行。Service 不会自动销毁,需要外部调用 stopService () 方法或在 Service 内部调用 stopSelf () 方法,此时 Service 的 onDestroy () 方法被调用。
  2. 使用 bindService () 方法启动 Service,调用者与 Service 绑定在了一起,调用者一旦销毁,Service 也就终止了,调用者需要解绑时可调用 unBindService () 方法。Service 被解绑或调用者销毁时,Service 经历 onUnbind () > onDestroy () 的过程。

2.2 疑难点

Service 超时 ANR / 启动子线程

通常出现 ANR 时,应用在主线程执行了较重的耗时任务,所以需要将耗时任务交给子线程进行。Service 面临需要启动子线程的情况时,直接使用多线程也是可以的,但是如果 Service 必然是需要子线程的情况,建议使用 IntentService 完成任务。

IntentService 是 Service 的子类,它和 Service 的不同点在于:

  1. 内部有一个工作线程来完成耗时的操作,只需实现 onHandleIntent 方法即可。
  2. 完成全部工作任务后,会自动终止服务。
  3. 如果同时执行多个任务时,会以工作队列的方式依次执行。

IntentService 非常适合用于处理应用中的耗时任务,当然如果需要并行执行还是考虑线程池,建议将应用中可串行执行的耗时任务都交由 IntentService 来完成。

2.3 面试常考

谈一谈 Service 的生命周期?

参考本文《2.1 基本知识 - 生命周期》。

Service 的两种启动方式?区别在哪?

参考本文《2.1 基本知识 - 生命周期》,《2.1 基本知识 - 启动》。

一个 Activty 先 start 一个 Service 后,再 bind 时会回调什么方法?此时如何做才能回调 Service 的 destory () 方法?

如果一个 Service 又被启动又被绑定,则该 Service 将会一直在后台运行。并且不管如何调用,onCreate 始终只会调用一次,对应 startService 调用多少次,Service 的 onStart 便会调用多少次。调用 unbindService 将不会停止 Service,而必须调用 stopService 或 Service 的 stopSelf 来停止服务。

Service 如何和 Activity 进行通信?

  1. Binder:
    通过 Binder 接口的形式实现,当 Activity 绑定 Service 成功的时候 Activity 会在 ServiceConnection 的类 的 onServiceConnected () 回调方法中获取到 Service 的 onBind () 方法 return 过来的 Binder 的子类,然后通过对象调用方法。
  2. Aidl:
    aidl 比较适合当客户端和服务端不在同一个应用下的场景。
  3. Messenger:
    它引用了一个 Handler 对象,以便 others 能够向它发送消息 (使用 mMessenger.send (Message msg) 方法)。该类允许跨进程间基于 Message 的通信 (即两个进程间可以通过 Message 进行通信),在服务端使用 Handler 创建一个 Messenger,客户端持有这个 Messenger 就可以与服务端通信了。一个 Messeger 不能同时双向发送,两个就就能双向发送了。
  4. 广播,具体逻辑同 3.。

用过哪些系统 Service?

如进行窗口相关的操作会用到窗口管理服务 WindowManager,进行电源相关的操作会用到电源管理服务 PowerManager,还有很多其他的系统管理服务,如通知管理服务 NotifacationManager、振动管理服务 Vibrator、电池管理服务 BatteryManager……

是否能在 Service 进行耗时操作 / 网络操作?如果非要可以怎么做?

Service 是运行在主线程中的,一般不能在 Service 进行耗时操作。参考本文《2.2 疑难点 - Service 超时 ANR / 启动子线程》。

IntentService 与 Service 的区别(intentservice 的优点)

  1. 内部有一个工作线程来完成耗时的操作,只需实现 onHandleIntent 方法即可,其他方法提供默认实现。
  2. 完成全部工作任务后,会自动终止服务。
  3. 如果同时执行多个任务时,会以工作队列的方式依次执行。

前台服务是什么?和普通服务的不同?如何去开启一个前台服务?

前台服务是那些被认为用户知道(用户所认可的)且在系统内存不足的时候不允许系统杀死的服务。
前台服务必须给状态栏提供一个通知,前台服务的系统优先级更高、不易被回收。
服务启动时,创建一个 Notification,再调用 setForground () 方法。

是否了解 ActivityManagerService,谈谈它发挥什么作用?

ActivityManagerService(简称 AMS)是 Android 中最核心的服务 , 主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似。

Activity、Intent、Service 是什么关系?

Activity 和 Service 都是 Android 四大组件之一。Activity 负责用户界面的显示和交互,Service 负责后台任务的处理。Activity 和 Service 之间可以通过 Intent 传递数据。

Service 和 Activity 在同一个线程吗?

对于同一 app 来说默认情况下是在同一个线程中的,都在 main Thread (UI Thread)。

如何保证 Service 不被杀死?

  1. 在 AndroidManifest.xml 文件中对于 intent-filter 可以通过 android:priority = “1000” 这个属性设置最高优先级,1000 是最高值,如果数字越小则优先级越低,同时实用于广播。
  2. 在 onStartCommand 里面调用 startForeground () 方法把 Service 提升为前台进程级别,然后再 onDestroy 里面要记得调用 stopForeground () 方法。
  3. onStartCommand 方法,手动返回 START_STICKY。
  4. 在 onDestroy 方法里发广播重启 service。service +broadcast 方式,就是当 service 走 ondestory 的时候,发送一个自定义的广播,当收到广播的时候,重新启动 service。(第三方应用或是在 setting 里 - 应用 - 强制停止时,APP 进程就直接被干掉了,onDestroy 方法都进不来,所以无法保证会执行)可以通过双 Service 互相唤起,提高成功率。
  5. 监听系统广播判断 Service 状态。
    通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的 Service 是否还存活。
  6. Application 加上 Persistent 属性。

Service 的 onStartCommand 方法有几种返回值?各代表什么意思?

有四种返回值,不同值代表的意思如下:

  1. START_STICKY: 如果 service 进程被 kill 掉,保留 service 的状态为开始状态,但不保留递送的 intent 对象。随 后系统会尝试重新创建 service, 由于服务状态为开始状态,所以创建服务后一定会调用 onStartCommand (Intent,int,int) 方法。如果在此期间没有任何启动命令被传递到 service, 那么参数 Intent 将为 null。
  2. START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完 onStartCommand 后,服务被异常 kill 掉,系统不会自动重启该服务。
  3. START_REDELIVER_INTENT: 重传 Intent。使用这个返回值时,如果在执行完 onStartCommand 后,服务被异 常 kill 掉,系统会自动重启该服务,并将 Intent 的值传入。
  4. START_STICKY_COMPATIBILITY: START_STICKY 的兼容版本,但不保证服务被 kill 后一定能重启。

Service 的 onRebind (Intent) 方法在什么情况下会执行?

在 onUnbind () 方法返回 true 的情况下会执行。

3. BroadcastReceiver

3.1 基本知识

概念

BroadcastReceiver 直译为 " 广播接收者”,主要用来接收来自系统和应用中的广播。在 Android 系统中,广播体现在方方面面,例如开机广播、网络状态广播、电池电量广播等等。

作用

广播可以用于异步处理消息,此时作用类似于 Handler,比 Handler 更强大的是广播可以在整个设备内互通消息,基于这个特性可以用来解决进程间通信的问题。

生命周期

广播的生命周期从调用开始到 onReceive () 执行完毕结束,需要注意的是,一般广播的生命周期都极短,需要在 10 秒内处理完 onReceive () 中的所有工作,所以,一般不进行耗时长的工作,如果有耗时长的工作,应当通过 Intent 传递给 Service 进行处理。

注意,不要在 onReceive () 中开启线程进行耗时任务处理,否则,在 10s 后,该线程会变成空线程,从而导致任务的丢失。同样的,也不要使用 bindService 来绑定服务。

启动

BroadcastReceiver 的启动过程要从注册说起了:

  1. 静态注册:静态注册的 BroadcastReceiver 在应用启动时自动创建一个实例,应用销毁时自动销毁,完全由系统控制,无需过多关注。
  2. 动态注册:BroadcastReceiver 通常在 Activity 中通过 registerReceiver () 方法动态注册,此时应在 Activity 销毁之前调用 unregisterReceiver () 方法注销。

BroadcastReceiver 将在收到对应广播时自动启动,执行完 onReceive () 方法后自动结束,生命周期短暂而有效。

3.2 疑难点

3.3 面试常考

广播的两种注册形式?区别在哪?

广播接收者的注册有两种方法,分别是程序动态注册和 AndroidManifest 文件中进行静态注册。

动态注册广播接收器特点是当用来注册的 Activity 关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕 app 本身未启动,该 app 订阅的广播在触发时也会对它起作用。

如何判断当前 BroadcastReceiver 接受到的是有序广播还是无序广播?

在 BroadcastReceiver 类中 onReceive () 方法中,可以调用 boolean b=isOrderedBroadcast ();该方法是 BroadcastReceiver 类中提供的方法,用于判断我们当前的接收到的广播是否为有序广播。

4. ContentProvider

4.1 基本知识

概念

ContentProvider 直译为 “内容提供者”,主要用于共享本应用的数据给其他应用使用,根据此特性也可将 ContentProvider 用于进程间通信。提供数据的应用注册 ContentProvider,获取数据的应用创建 ContentResolver 获取对应 ContentProvider 的数据。

作用

Content Provider 使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过 ContentResolver 类从该内容提供者中获取或存入数据。开发人员通常不会使用 ContentProvider 类的对象,大多数是通过 ContentResolver 对象实现对 ContentProvider 的操作。

生命周期

ContentProvider 的生命周期主要就是类似数据库的 CRUD,ContentResolver 也是类似的提供了相应的方法调用。

启动

ContentProvider 并不通过实例使用,一般通过 Context 的 getContentResolver () 方法获得 ContentResolver 实例,ContentResolver 提供了与 ContentProvider 一致的方法,可通过 URI 唤起相应的 ContentProvider 对提供的数据进行 CRUD 操作。

4.2 疑难点

4.3 面试常考

ContentProvider 了解多少?

(1)android 平台提供了 ContentProvider 使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过 ContentResolver 类从该内容提供者中获取或存入数据。

(2)只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。

(3)ContentProvider 实现数据共享。ContentProvider 用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为 android 没有提供所有应用共同访问的公共存储区。

(4)开发人员不会直接使用 ContentProvider 类的对象,大多数是通过 ContentResolver 对象实现对 ContentProvider 的操作。

(5)ContentProvider 使用 URI 来唯一标识其数据集,这里的 URI 以 content:// 作为前缀,表示该数据由 ContentProvider 来管理。

参考文章:
Android 面试题(四大组件篇)
Android 面试题之四大组件相关

今天关于Android面试知识点总结宝典助你通关!系列教学android面试基础知识的介绍到此结束,谢谢您的阅读,有关2021年Android面试心得,系列教学、2021最新中高阶Android面试题总结,系列教学、71道经典Android面试题和答案_android面试题库,android面试题-Android文档类资源-CSDN下载、Android 四大组件知识点总结等更多相关知识的信息可以在本站进行查询。

本文标签: