面试_Android
文章平均质量分 86
常见面试题目
-Sloth-
脚踏实地 仰望星空
展开
-
RecyclerView详解
RecyclerView 简称 RV, 是作为 ListView 和 GridView 的加强版出现的,目的是在有限的屏幕之上展示大量的内容,因此 RecyclerView 的复用机制的实现是它的一个核心部分。RV 常规使用方式如下:解释说明。setLayoutManager:必选项,设置 RV 的布局管理器,决定 RV 的显示风格。常用的有线性布局管理器(LinearLayoutManager)、网格布局管理器(GridLayoutManager)、瀑布流布局管理器(StaggeredGr原创 2020-12-28 16:49:58 · 39936 阅读 · 1 评论 -
IntentService
IntentService是一种特殊的Service,它继承了Service并且它是一个抽象类,因此必须创建它的子类才能使用IntentService。客户端startService发送请求,IntentService就被启动,然后会在一个工作线程中处理传递过来的Intent,当任务结束后就会自动停止服务。IntentService是自己维护了一个线程,来执行耗时的操作,然后里面封装了HandlerThread,能够方便在子线程创建Handler。转载 2023-05-11 16:02:21 · 253 阅读 · 0 评论 -
Retrofit源码解析
Retrofit源码解析https://www.kancloud.cn/smartsean/android/1543907转载 2020-12-31 14:40:16 · 130 阅读 · 0 评论 -
Glide相关
一、Gilde的使用方法:Glide.with(content) .load(url) .into(imageView);with绑定生命周期,load指定加载资源,into指明加载目标。二、生命周期绑定with()方法的重载种类非常多,既可以传入Activity,也可以传入Fragment或者是Context,实际上只有两种情况而已,即传入Application类型的参数,和传入非Application类型的参数。 Application:自动就是和应用程序的生命周期是同步的。原创 2020-12-30 16:45:31 · 299 阅读 · 0 评论 -
Android数据库比较
一:OrmLite简述: 优点: 1.轻量级;2.使用简单,易上手;3.封装完善缺点:1.基于反射,效率较低二:GreenDao优点:库文件比较小,小于100K,编译时间低,而且可以避免65K方法限制; 性能最大化(官方词汇); API 非常易用,提升了开发效率; 最小的内存开销; 可支持原生语句,从Android原生SQLite过度到GreenDao相对还是比较容易; 数据表结构和Entity数据结构convert支持,Entity的不同数据结构和数据库存储结构之间做...原创 2020-12-30 14:21:20 · 948 阅读 · 0 评论 -
优化网络编程
对于网络编程,你做过哪些优化?https://kaiwu.lagou.com/course/courseInfo.htm?courseId=67#/detail/pc?id=1887总结1.DNS 解析优化,分安全性和速度提升两方面。安全性:HttpDns速度性:IP 直连方式、DNS 解析超时2.网络请求数据缓存,对于请求返回的数据需要缓存到本地数据库中。实际上,在某些场景中对于请求对象 Request 自身也需要做缓存操作。比如“发送埋点”的请求,这样请求失败就将其保存到本地数据转载 2020-12-29 19:23:24 · 167 阅读 · 0 评论 -
UI 卡顿优化
面对 UI 卡顿,如何入手分析解决问题?https://kaiwu.lagou.com/course/courseInfo.htm?courseId=67#/detail/pc?id=1881Choreographer小结Choreographer 是一个承上启下的角色。承上:接收应用层的各种 callback 输入,包括 input、animation、traversal 绘制。但是这些 callback 并不会被立即执行。而是会缓存在 Choreographer 中的 Callback转载 2020-12-29 18:14:02 · 195 阅读 · 0 评论 -
内存泄漏优化
面对内存泄漏,如何进行优化?https://kaiwu.lagou.com/course/courseInfo.htm?courseId=67#/detail/pc?id=1880总结:Activity 内存泄漏预防将 Activity 单独做预防,是因为 Activity 承担了与用户交互的职责,因此内部需要持有大量的资源引用以及与系统交互的 Context,这会导致一个 Activity 对象的 retained size 特别大。造成 Activity 内存泄漏的场景主要有以下几种转载 2020-12-29 17:07:36 · 198 阅读 · 0 评论 -
Android 崩溃处理
Android 崩溃的那些事儿转载:https://kaiwu.lagou.com/course/courseInfo.htm?courseId=67#/detail/pc?id=1879总结:如果要给 crash 日志进行分类,可以分成 2 大类:JVM 异常(Exception)堆栈信息、native 代码崩溃日志。JVM 异常堆栈信息Java 中异常(Exception)分两种:检查异常 checked Exception 和非检查异常 unchecked Exception。.转载 2020-12-29 15:15:05 · 375 阅读 · 0 评论 -
APK包体积优化
APK 如何做到包体积优化?https://kaiwu.lagou.com/course/courseInfo.htm?courseId=67#/detail/pc?id=1878总结:安装包监控:Android Studio 的 APK Analyser:这是 Android Studio 提供的一个 APK 检测工具,通过它可以查看一个 APK 文件内部各项内容所占的大小,并且按照大小排序显示。APK Analyzer 的使用非常简单,只要将需要分析的 APK 文件拖入 Andr转载 2020-12-28 22:31:49 · 208 阅读 · 0 评论 -
OKHttp详解
OkHttp 是一套处理 HTTP 网络请求的依赖库,由 Square 公司设计研发并开源,目前可以在 Java 和 Kotlin 中使用。对于 Android App 来说,OkHttp 现在几乎已经占据了所有的网络请求操作,RetroFit + OkHttp 实现网络请求似乎成了一种标配。因此它也是每一个 Android 开发工程师的必备技能,了解其内部实现原理可以更好地进行功能扩展、封装以及优化。网络请求流程分析先看下 OkHttp 的基本使用:除了直接 new OkHttpClien转载 2020-12-28 17:45:22 · 75820 阅读 · 0 评论 -
RecyclerView的缓存机制
Android深入理解RecyclerView的缓存机制https://www.jianshu.com/p/e1b257484961RecyclerView 高级面试题 | 滚动时表项是如何被填充或回收的?https://www.jianshu.com/p/897ee5e3d13e转载 2020-12-27 22:58:54 · 200 阅读 · 0 评论 -
Handler内存泄露全面分析
前言Handler内存泄露的原因是什么?你会怎么答呢?这是错误的回答"内部类持有了外部类的引用,也就是Hanlder持有了Activity的引用,从而导致无法被回收呗。"其实这样回答是错误的,或者说没回答到点子上。内存泄漏Java虚拟机中使用可达性分析的算法来决定对象是否可以被回收。即通过GCRoot对象(虚拟机栈中的引用的对象、方法区中的类静态属性引用的对象、方法区中的常量引用的对象、本地方法栈中JNI的引用的对象)为起始点,向下搜索走过的路径(引用链),如果发现某个对象或者对转载 2020-12-24 19:03:06 · 350 阅读 · 1 评论 -
EventBus原理
EventBus相信大部分Androider都很熟悉,虽然现在谷歌官方出了JetPack来替代,但EventBus的一些设计思路还是值得借鉴的。下面就以阿里面试中我手写的一个EventBus案例为例;其实EventBus原理并不难,就是维护了几个数组,然后根据对应的key找到对应的注册对象,通过放射的方式调用对应的方法。EventBus3.0之前和之后有比较大的区别,最大的差别在于3.0之后通过apt再编译期间生成一个引用对象,这样做很大程度上提高了性能。最简单的使用//注册事件Even转载 2020-12-23 16:02:05 · 578 阅读 · 0 评论 -
Bitmap知识点集合
前言今天聊聊Bitmap相关的面试题/知识点,看看你是否都弄明白了呢? Bitmap是什么,怎么存储图片? Bitmap内存如何计算? Bitmap内存 和drawable目录的关系。 Bitmap加载优化?不改变图片质量的情况下怎么优化? inJustDecodeBounds是什么? Bitmap内存复用怎么实现? 高清大图加载该怎么处理? 如何跨进程传递大图? Bitmap是什么,怎么存储图片。Bitmap,位图,本转载 2020-12-23 15:26:26 · 365 阅读 · 0 评论 -
RxJava本质与问题
经历这么多版本,RxJava本质上不变的是什么?https://mp.weixin.qq.com/s/F8oApgGM7OY9KxxB2RMt0QRxJava 这8问,你顶得住吗?https://mp.weixin.qq.com/s/wuUNPyrZRl43rjJN8l27JA转载 2020-12-23 15:22:13 · 133 阅读 · 0 评论 -
Android 启动优化总结
前言性能优化包括很多方面,比如:启动优化、布局优化、内存优化、卡顿优化、网络优化、数据库优化、内存泄漏优化、包体积优化等等。冷启动、温启动、热启动首先了解下启动的这三个概念,也是面试常被问到的: 冷启动。冷启动指的是该应用程序在此之前没有被创建,发生在应用程序首次启动或者自上次被终止后的再次启动。简单的说就是app进程还没有,需要创建app的进程并启动app。 比如开机后,点击屏幕的app图标启动应用。冷启动的过程主要分为两步:1)系统任务。加载并启动应用程序;显示应用程序的空转载 2020-12-23 11:05:51 · 534 阅读 · 0 评论 -
Android插件化原理
一、Android插件化技术我们在平时的开发过程中,会经常遇到产品需求的变更或者出现bug,在传统的模式中,我们需要首先需要修改代码,然后重新打包Apk再上线,用户在打开应用的时候就会进行更新了。但是这种模式有几个缺点,一是上线周期长,从修改代码到用户更新需要较长的时间;二是用户更新代价较大,每次用户更新都需要下载整个Apk包,整个Apk包包括了一个应用的所有代码,要消耗用户较多的流量,并且,如果是一些重要的更新,为了确保用户都能更新到,还需要用到强制更新,即用户打开App后如果不更新应用则退出应用,这转载 2020-12-22 17:21:14 · 1224 阅读 · 0 评论 -
Android热修复原理
前言热修复框架很多,但热修复框架的核心技术主要有三类,分别是代码修复、资源修复和动态链接库修复,其中每个核心技术又有很多不同的技术方案,每个技术方案又有不同的实现,另外这些热修复框架仍在不断的更新迭代中,可见热修复框架的技术实现是繁多可变的。1.代码修复代码修复主要有三个方案,分别是底层替换方案、类加载方案和Instant Run方案。1.1 类加载方案类加载方案基于Dex分包方案,什么是Dex分包方案呢?这个得先从65536限制和LinearAlloc限制说起。65536限制随着应用转载 2020-12-22 14:42:08 · 604 阅读 · 0 评论 -
Android事件分发机制抽象--钓钩模型
页面中有一个 300*300 的蓝色背景 FrameLayout,正中有一个 100*100 的红色背景 TextView。如下图所示:▼接下来的问题只需要围绕 FrameLayout 和 TextView 两个控件的顺序说出事件分发相关方法调用即可。因为场景固定,不存在如果,即答案对应的是唯一路径,不存在如果...就...为了便于理解,在回答上述问题前,我先介绍一下事件分发机制的核心方法以及对应的功能:dispatchTouchEvent:控件事件分发主体逻辑,View 中的该方法用于调转载 2020-12-13 14:38:04 · 125 阅读 · 0 评论 -
Handler 10问
概述在安卓面试中,关于 Handler 的问题是必备的,但是这些关于 Handler 的知识点你都知道吗?题目层次 Handler 的基本原理 子线程中怎么使用 Handler MessageQueue 获取消息是怎么等待 为什么不用 wait 而用 epoll 呢? 线程和 Handler Looper MessageQueue 的关系 多个线程给 MessageQueue 发消息,如何保证线程安全 Handler 消息延迟是怎么处转载 2020-12-05 17:43:51 · 193 阅读 · 0 评论 -
APP的回收和重启机制
前言我们在打开APP以后长期锁屏或者将APP放置后台,然后再点击APP图标或者任务栏点击指定的APP,重新打开APP时,会出现一段时间的白屏,那么这个时候其实APP曾经就被回收了,然后随着我们重新打开而重启了整个进程。在讲这个机制之前我们先思考几个问题,然后再带着这几个问题再去深入源码:app是如何被干掉 app被干掉以后,做了哪些处理 启动app进程的时候是怎么检测到app之前被干掉,从而重建APP 系统是如何保存现场的,保存在哪里 系统是如何恢复现场的,从哪里恢复不过对于首个转载 2020-12-05 17:24:32 · 1430 阅读 · 0 评论 -
SharedPreferences的设计与实现
起源就在前几日,有幸拜读到HiDhl的文章,继腾讯开源类似功能的MMKV之后,Google官方维护的 Jetpack DataStore 组件横空出世——这是否意味着无论是腾讯三方还是Google官方的角度,SharedPreferences都彻底告别了这个时代?无论是MMKV的支持者还是DataStore的拥趸,SharedPreferences似乎都不值一提;值得深思的是,笔者通过面试或者其它方式,和一些同行交流时,却遇到了以下的情形:在谈及SharedPreferences和MMKV,大多..转载 2020-11-22 17:35:21 · 259 阅读 · 1 评论 -
直面底层:Android 中的Window
window机制的关键类PhoneWindow是窗口类,继承自抽象类Window,也是唯一子类。WindowManager是Window管理接口,继承自ViewManager,他的唯一实现类是WindowManagerImpl。WindowManagerImpl并没有真正实现windowManager接口逻辑,而是把逻辑转给了WindowManagerGlobal,WindowManagerGlobal是全局单例。Window和View的联系通过ViewRootImpl桥梁,同时ViewRootIm转载 2020-11-21 20:38:32 · 1289 阅读 · 0 评论 -
Android UI 显示原理
问题:介绍一下 Android 屏幕显示原理,开发编写的 View 控件,是怎么变成屏幕上显示的图像的?思路是先整体串讲,宏观的把Android UI 显示原理的关键知识点都涉及到,然后再细化具体介绍,知识点如下: Activity 显示原理(Window/DecorView/ViewRoot) UI 刷新机制(Choreographer/vSync) UI 绘制原理(Measure/Layout/Draw) Surface 原理(Surface/SurfaceFli转载 2020-11-21 19:39:59 · 1342 阅读 · 0 评论 -
Android动态换肤实现原理
换肤分为动态换肤和静态换肤静态换肤这种换肤的方式,也就是我们所说的内置换肤,就是在APP内部放置多套相同的资源。进行资源的切换。这种换肤的方式有很多缺点,比如, 灵活性差,只能更换内置的资源、apk体积太大,在我们的应用Apk中等一般图片文件能占到apk大小的一半左右。当然了,这种方式也并不是一无是处, 比如我们的应用内,只是普通的 日夜间模式 的切换,并不需要图片等的更换,只是更换颜色,那这样的方式就很实用。动态换肤适用于大量皮肤,用户选择下载,像QQ、网易云音乐这种。它是将皮肤包下载转载 2020-10-30 14:56:12 · 484 阅读 · 0 评论 -
用Glide加载Gif导致卡顿的优化思路[拓展]
前言Glide图片框架是可以直接加载GIF图的,但是做一个银行合作项目的时候,由于有需要出货页面需要加载一个GIF图,但是发现在使用Glide框架加载Gif图片,明显发现有延迟.经过查看glide加载Gif图片的源码得知:Glide在加载Gif的图片帧的时候,上一帧的渲染以及下一帧的准备是串行的,这个过程中,如果出现下一帧的准备阶段时间超过了Gif间隔播放的时长,就会造成播放卡顿.而且此过程中,StandardGifDecoder只保留上一帧的数据,每次获取当前需要绘制的帧的时候都会从BitmapP转载 2020-10-25 19:04:12 · 288 阅读 · 0 评论 -
Android从按下开机键到启动发生了什么
作为一个Android开发者,了解整个系统架构是必须的,要了解Android手机启动过程,先来了解一下基于linux系统的电脑从按下电源键的那一刻起,发生了什么,这样类比可以更好的理解Android手机的启动过程。基于Linux的pc启动过程我们都知道,所有的程序软件包括操作系统都是运行在内存中的,然而我们的操作系统一般是存放在硬盘上的,当我们按下开机键的时候,此时内存中什么程序也没有,因此需要借助某种方式,将操作系统加载到内存中,而完成这项任务的就是BIOS。装过系统的人一定知道BIOS这个东转载 2020-10-25 18:35:41 · 387 阅读 · 0 评论 -
Gradle Plugin入门使用 [拓展]
一、Gradle Plugin 的作用是什么?模块化构建脚本的功能 公共的功能可以抽取出来成为插件,可以供多个 build.gradle 使用,增加复用性。二、定义一个 Gradle Plugin2.1、插件的处理和应用为了将构建脚本的逻辑封装到插件中,Gradle 需要做以下两件事:处理插件,应用插件到目标中。处理插件Gradle 会自动找到插件所在的位置,例如一个 buildSrc 名字 module 就会 Gradle 识别为插件工程。应用插件一旦插件被应用到执行的构转载 2020-10-11 20:38:53 · 663 阅读 · 2 评论 -
OutOfMemoryError 可以被 try catch 吗 ?
OutOfMemoryError 可以被 try catch 吗?注意看下面的 Gif,每点击一次 Allocate 20MB ,都会给数组容量增加 20*1024*1024,当然应该并不是 20 MB。如下面代码所示:binding.allocate.setOnClickListener{try{bytes=ByteArray(bytes.size+1024*1024*20)refreshMemory()}catch(e:OutOfMemoryErr...转载 2020-12-28 16:50:14 · 2129 阅读 · 0 评论 -
Binder原理深入解析(二)
1. Binder概述从IPC角度来说:Binder是Android中的一种跨进程通信方式,该通信方式在linux中没有,是Android独有; 从Android Driver层:Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder; 从Android Native层:Binder是创建Service Manager以及BpBinder/BBinder模型,搭建与binder驱动的桥梁; 从Android Framework层:Binder是各种Manager(Acti转载 2020-09-26 18:27:55 · 1672 阅读 · 0 评论 -
Binder原理深入解析(一)
概述Android系统中,每个应用程序是由Android的Activity,Service,Broadcast,ContentProvider这四剑客的中一个或多个组合而成,这四剑客所涉及的多进程间的通信底层都是依赖于Binder IPC机制。例如当进程A中的Activity要向进程B中的Service通信,这便需要依赖于Binder IPC。不仅于此,整个Android系统架构中,大量采用了Binder机制作为IPC(进程间通信)方案,当然也存在部分其他的IPC方式,比如Zygote通信便是采用soc原创 2020-09-26 22:51:59 · 1022 阅读 · 0 评论 -
App启动流程
系统的启动过程在学习APP的启动之前先简单了解下系统的启动,有助于我们更好的学习APP的启动。系统的启动过程很复杂,这里简单化,只关心大致流程和涉及到的一些名词以及相关类的作用APP的启动可以简单总结为一下几个流程:加载BootLoader --> 初始化内核 --> 启动init进程 --> init进程fork出Zygote进程 --> Zygote进程fork出SystemServer进程系统中的所有经常进程都是由Zygote进程fork出来的 Syst转载 2020-09-13 12:36:49 · 855 阅读 · 0 评论 -
parcelable和serializable区别
一、Seralizable1.Serializable 是java的序列化技术,最简单的使用方式为在需要序列化的class增加implements Serializable,并增加一个唯一个序列化id: private static final long serialVersionUID = 1L;默认方式最好直接设置为1L,因为java sdk会自动进行hash计算,并生成唯一的UID值。手动设置serialVersionUID的好处是当前class如果改变了成员变量,比如增加或者删除之后,这个U..原创 2020-09-08 21:22:56 · 1166 阅读 · 0 评论 -
Android中mmap原理及应用简析
1.mmap介绍mmap是一种内存映射文件的方法,即将一个文件或者其他对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对应关系;实现这样的映射关系后,进程就可以采用指针的方式读写操作这一块内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必调用read,write等系统调用函数,相反,内核空间堆这段区域的修改也直接反应到用户空间,从而可以实现不同进程间的文件共享。网上很多文章都说 mmap 完全绕开了页缓存机制,其实这并不正确。我们最终映射的物理原创 2020-09-06 11:05:20 · 2583 阅读 · 1 评论 -
Activity的启动过程详解
文章目录一、概述 二、流程分析 2.1 Activity启动的发起 2.2 Activity的管理——ATMS 2.3 线程切换及消息处理——mH 2.4 Activity启动核心实现——初始化及生命周期 三、根Activity的启动—应用进程启动 3.1 应用进程的创建 3.2 根Activity的启动 总结一、概述话说Android中有四大组件:Activity、Service、BroadcastReceiver、Cont.转载 2020-09-05 18:32:07 · 1310 阅读 · 0 评论 -
View的工作原理
文章目录1、ViewRoot 和 DecorView 2、 MeasureSpec 2.1MeasureSpec 2.2MeasureSpec和LayoutParams的对应关系 3、View的工作流程 3.1 Measure过程 3.1.1 view的测量过程 3.1.2 ViewGroup的测量过程 3.1.3 获取View宽高的时机 1、Activity/View # onWindowFocusChanged 2、view.post(runnable)转载 2020-09-05 18:14:52 · 373 阅读 · 0 评论 -
Android中子线程更新UI
Android的UI访问是不加锁的,所以UI控件不是线程安全的。不加锁是因为 一是加锁会让UI访问变得复杂;二是加锁会降低UI访问效率,会阻塞一些线程访问UI。例如:新建一个工程,activity_main.xml布局如下所示:<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android...原创 2020-09-05 16:42:42 · 276 阅读 · 0 评论 -
Android屏幕刷新机制—VSync、Choreographer
一、背景和疑问在Android中,当我们谈到 布局优化、卡顿优化 时,通常都知道 需要减少布局层级、减少主线程耗时操作,这样可以减少丢帧。如果丢帧比较严重,那么界面可能会有明显的卡顿感。我们知道 通常手机刷新是每秒60次,即每隔16.6ms刷新一次。 问题来了:丢帧(掉帧) ,是说 这一帧延迟显示 还是丢弃不再显示 ? 布局层级较多/主线程耗时 是如何造成 丢帧的呢? 16.6ms刷新一次 是啥意思?是每16.6ms都走一次 measure/layout/draw ? measure/layo转载 2020-09-05 14:58:56 · 893 阅读 · 1 评论 -
SharePreference原理
SharedPreferences是Android提供的数据持久化的一种手段,适合单进程、小批量的数据存储与访问。因为SharedPreferences的实现是基于单个xml文件实现的,并且,所有持久化数据都是一次性加载到内存,如果数据过大,是不合适采用SharedPreferences存放的。而适用的场景是单进程的原因同样如此,由于Android原生的文件访问并不支持多进程互斥,所以SharePreferences也不支持,如果多个进程更新同一个xml文件,就可能存在同不互斥问题。SharedPref转载 2020-08-27 20:19:24 · 3833 阅读 · 1 评论