安卓技术栈
文章平均质量分 83
安卓相关技术栈,高效工作稳如狗
little-sparrow
小小鸟
展开
-
算法 & 数据结构面试篇
切题四件套Clarification、Possible solutions、Coding、Test cases常用数据结构数组、链表、队列、栈、堆、哈希表、树、二叉查找树、字母树、LRU缓存常用算法递归、贪心、分治、广度优先搜索、深度优先搜索、二叉树遍历、动态规划、二分查找、图时间/空间复杂度O(1)、O(logn)、O(n)、O(nlogn)、O(n2)、O(n3)、O(2n)、O(n!)常见算法复杂度二分查找:O(logn)、二叉树遍历:O(n)、归并排序:O(nlo原创 2021-09-18 12:17:48 · 198 阅读 · 0 评论 -
安卓视图绑定
视图绑定功能可按模块启用。要在某个模块中启用视图绑定,请将 viewBinding 元素添加到其 build.gradle 文件中,如下例所示android { viewBinding { enabled = true }}如果您希望在生成绑定类时忽略某个布局文件,请将 tools:viewBindingIgnore="true" 属性添加到相应布局文件的根视图中<LinearLayout ... tools:viewBindingIg原创 2021-09-18 09:59:02 · 204 阅读 · 0 评论 -
Android 构建流程
Gradle定义:Gradle是以Groovy语言为基础,面向Java应用为主,基于DSL(领域特定语言)语法的自动化构建工具Gradle工作流程(生命周期):初始化、配置(afterEvaluate、whenReady)、执行Gradle依赖管理:声明依赖有三种方式:compile maven库的地址、compile files或fileTree引入jar包、compile本地工程,依赖...原创 2017-06-07 18:15:50 · 427 阅读 · 0 评论 -
LiveData 原理
声明周期变化时调用LiveData.dispatchingValue在调用 observe 时,我们需要传入 LifecycleOwner 和 Observer,在 observe 方法内部通过 LifecycleBoundObserver 将Observer 和LifecycleOwner 关联,并监听LifecycleOwner 状态public void observe(LifecycleOwner owner, Observer<? super T> observer)...原创 2021-09-03 18:21:50 · 164 阅读 · 0 评论 -
HashMap 原理
在 JDK 1.7 中,HashMap 采用数组+链表的方式实现 在 JDK 1.8 中,HashMap 采用数组+链表 / 红黑树实现Entry[] table=new Entry[capacity];基础变量DEFAULT_INITIAL_CAPACITY(Table 数组的初始大小):1 << 4,这里需要是 2 的 n 次方,数组扩容的时候也是每次扩容 2 倍,根本原因是在计算哈希散列时,会使用下面的公 hashCode 的高 16 位和低 16 位进行异或运算,避免只使原创 2021-09-03 15:32:51 · 68 阅读 · 0 评论 -
如何设计一个图片加载框架
线程池:Glide使用了三个线程池,不考虑动画的话就是两个public final class GlideBuilder { ... private GlideExecutor sourceExecutor; //加载源文件的线程池,包括网络加载 private GlideExecutor diskCacheExecutor; //加载硬盘缓存的线程池 ... private GlideExecutor animationExecutor; //动画线程池 ...原创 2021-08-23 19:02:28 · 171 阅读 · 0 评论 -
Glide 图片框架
Glide 框架专注于图片列表更快、更平滑的滚动。实际上,该框架几乎能满足图片拉取 / 缩放 / 显示的一切需求 对外提供了高性能、可扩展的图片解码管道(Pipeline)以及自动的资源缓冲池 多种格式支持,包括视频快照、图片、GIF 图 默认基于定制化的 HttpUrlConnection 的网络栈,但同时也提供了快速集成OkHttp 的工具库 框架充分考虑了 Android 图片加载性能的两个关键指标 图片解码速度 解码图片带来的资源压力(避免主线程 IO 操作和频繁的垃圾回收) .原创 2021-08-19 12:19:45 · 616 阅读 · 0 评论 -
UML 类图
1、策略模式定义个策略接口,不同的实现类提供不同的具体策略算法, 同时它们之间可以互相替换IStrategy 接口定义了策略方法,Strategy1 和 Strategy2 通过实现 IStrategy 提供不同的策略,而 User 组合了 IStrategy ,可以通过给 User 对象设置不同具体实现类来让其获得不同的策略2、工厂模式针对每一种产品提供一个工厂类,通过不同的工厂实例来创建不同的产品实例不同工厂类实现同一个工厂接口,返回不同产品3、装饰者模式动态的给一个原创 2021-08-18 11:52:05 · 253 阅读 · 0 评论 -
View 加载流程
ActivityThread.handleStartActivityActivityThread.performStartActivityInstrumentation.newActivityActivity.attach 初始化 PhoneWindow 实例 Instrumentation.callActivityOnCreate...原创 2021-08-17 12:18:01 · 268 阅读 · 0 评论 -
LeakCanary
如何获取上下文信息LeakCanary 只需引入依赖,不需要初始化代码,就能执行内存泄漏检测了,它是通过 ContentProvider 获取应用的 Context。这种获取 Context 方式在开源第三方库中十分流行。如下 AppWatcherInstaller 在 AAR 包的Manifest 文件中注册internal sealed class AppWatcherInstaller : ContentProvider() { override fun onCreate(): B.原创 2021-08-16 21:51:59 · 194 阅读 · 0 评论 -
Dialog & PopupWindow
Dialog 和 PopupWindow 在开发中是比较常用的两个 View,二者都需要在 Window 上显示出来,正所谓有 View 的地方就有 Window,同时二者都需要调用 setContentView 方法,具体原理请查看文章(https://blog.csdn.net/xgangzai/article/details/81390630)Dialog 与 PopupWindow 的区别二者可以手动设置显示位置。Dialog 默认居中Gravity.CENTER,PopupWindow .原创 2021-08-14 09:16:34 · 244 阅读 · 0 评论 -
依赖注入框架
依赖注入是用于实现控制反转的常见方式之一,另一种实现方式是“依赖查找”依赖注入的实现方式基于构造函数public class Man { Car car; public Man(Car car) { this.car = car; }}基于 setter 方法public class Man { public void setCar(Car car) { this.car = car; }}基于 inje原创 2021-08-13 17:51:55 · 441 阅读 · 0 评论 -
Kotlin Flow
Flow 非常适合实时数据更新和无休止的数据流,Flow 已经被集成到许多 Jetpack 库中原创 2021-08-09 12:48:28 · 519 阅读 · 0 评论 -
Kotlin Coroutines
什么是协程,谈谈你对协程的认识协程是一段可执行的任务,可挂起/恢复执行,概念上语言无关,通常实现是用户态的协作式调度,从具体实现上来说,可以分为两大类:有栈协程和无栈协程有栈协程:协程切换会保存完成上下文,可以在其任意嵌套函数中被挂起 无栈协程:通过状态机维护代码运行状态,协程切换的本质是指令指针寄存器的改变Coroutine ScopeCoroutineScope public interface CoroutineScope { /** * The conte.原创 2021-08-07 19:48:45 · 709 阅读 · 0 评论 -
应用启动流程
Activity 启动流程系统在启动时通过 android.intent.action.MAIN 和 android.intent.category.HOME启动 Launcher App Launcher App通过PackageManager遍历已安装应用,通过android.intent.action.MAIN 和 android.intent.category.LAUNCHER 拿到所有应用的入口 用户点击图标时通过Activity#startActivity启动应用,Activity...原创 2021-07-22 12:05:49 · 297 阅读 · 0 评论 -
Retrofit 原理
Retrofit是对OkHttp网络库的封装,真正的网络请求是通过OkHttp完成的Retrofit主要用到了适配器模式使用Retrofit五个步骤:创建网络请求接口,设置请求类型和参数 创建Retrofit实例,设置数据解析器(Gson、XML、Protobuf)和网络适配器(RxJava、Coroutines) 创建接口对象(动态代理),配置网络请求参数 调用接口方法返回Call对象或适配器封装的对象 处理适配器逻辑或直接通过Call对象发送网络请求 处理服务器返回的数据cla原创 2021-04-27 15:32:19 · 462 阅读 · 0 评论 -
进程间通讯
Linux进程间通讯方式:管道、消息队列、共享内存、SocketBinder产生的背景:为了方便程序开发,系统提供了大量服务,但只有Socket支持Client-Server模式,当然也可以在这些底层机制上架设一套协议来实现Client-Server通信,但这样增加了系统的复杂性,另外,Socket作为一款通用接口,其开销大,传输效率低,主要用在跨网络的进程间通信;消息队列和管道采用存储-转发...原创 2019-02-22 11:00:52 · 288 阅读 · 0 评论 -
安卓数据存储
数据库SQLiteOpenHelper:A helper class to manage database creation and version management.class DatabaseHelper(context: Context?, name: String?, factory: CursorFactory?, version: Int) : SQLiteOpenHelper(context, name, factory, version) { compan..原创 2021-07-06 16:17:07 · 168 阅读 · 0 评论 -
Android 杂记
Android各个布局异同:LinearLayout按照垂直和水平顺序依次排列子元素,尽量少用layout_weight(子元素占用剩余空间的大小比例),会导致二次测量;FrameLayout所有子元素都叠放在左上角;RelativeLayout按照各个子元素之间的关系完成布局;TableLayout为表格布局,适用于N行N列的布局格式;AbsoluteLayout是绝对位置布局,在此布局中的...原创 2018-03-08 21:35:05 · 533 阅读 · 0 评论 -
异步处理 & 定时任务
安卓系统常用的异步处理机制:Handler、HandlerThread、IntentService、AsyncTask、Thread、ThreadPool、RxJava、CoroutinesHandlerHandler机制主要有四个类实现,分别为Handler、Looper、MessageQueue、Message,作用如下:Message用于承载线程之间传递的消息 MessageQueue是一个用链表实现的先进先出队列,用来存储Message Handler用于把Message插入Mess原创 2021-07-05 16:32:31 · 314 阅读 · 0 评论 -
安卓常见布局 & 布局优化
过度绘制:开发者选项(调试GPU过度绘制)优化方法:移除默认的Window背景:getWindow().setBackgroundDrawable(null);移除不必要的背景:ViewPager加载多个Fragment 组成的首页界面,如果每个Fragment都设置有背景色的话,你就可以不用给Activity的根布局设置背景减少透明度的使用:由于需要混色处理,至少渲染两次...原创 2019-04-25 11:00:35 · 454 阅读 · 0 评论 -
Service & Broadcast
Service生命周期:当我们既想绑定一个Service(实现Activity和Service交互)又想在 Activity停止时,Service不会停止,我们可以先StartService,然后再BindService(),这样当Activity退出的时候,Service的onUnbind()方法就会被调用,但Sercvice并不会停止,然后我们可以再进入Activity重新绑定该Service,这个时候Service就会调用onRebind()方法。但是onRebind()方法被调用还有个前提是先前的o原创 2021-07-03 16:01:19 · 481 阅读 · 0 评论 -
Intent 参数详解
Intent封装了Android应用启动某个组件(Activity、Service、BroadcastReceiver)的“意图”,不仅如此,Intent还是各个组件之间通信的重要媒介(使用Intent携带Bundle对象)使用Intent启动不同组件的方法:startActivity、startActivityForResult、startService、bindService、sendBr...原创 2017-05-15 13:55:18 · 1919 阅读 · 0 评论 -
Fragment 生命周期
生命周期、使用方式、hide、show、attach、detach、remove、add、replace作用:我们可以把Fragment当成Activity界面的一个组成部分,甚至Activity的界面可以完全由不同的Fragment组成,而且Fragment拥有自己的生命周期并能进行事件处理,这样就不必在Activity中写一堆事件处理逻辑了,更为重要的是,你可以动态的添加、替换和移除某个F...原创 2017-05-13 21:26:49 · 378 阅读 · 0 评论 -
RecyclerView
你想要控制Item显示方式,请使用LayoutManager 你想要控制Item间隔,请使用ItemDecoration 你想要控制Item增删动画,请使用ItemAnimator 你想要控制点击、长按事件,请自己写下面是一个Demo,主要讲解如何使用RecyclerView,后面会分别介绍各个功能public class HomeActivity extends AppCompat...原创 2019-03-26 10:47:27 · 327 阅读 · 0 评论 -
安卓动画原理解析
安卓动画主要有三类:逐帧动画(Drawable Animation、Frame Animation)、补间动画(View Animaiton、Tweened Animation)、属性动画(Property Animation),其中,View Animation只能修改View组件的部分属性、动画效果是绘制出来的,组件并没有真正改变,而Property Animation可以修改View组件的任...原创 2017-05-13 16:58:44 · 473 阅读 · 0 评论 -
内存基本原理 & 常见优化手段 & 图片基础知识
1、基础知识如何把图片解析成Bitmap:当ImageView可展示的像素点小于图片的像素点,这时我们就需要压缩图片,避免浪费内存空间。BitmapFactory类提供了多个解析方法(decodeByteArray, decodeFile, decodeResource等)用于创建Bitmap对象,而且每一种解析方法都提供了一个可选的BitmapFactory.Options参数,将这个参数的...原创 2018-12-28 10:50:38 · 999 阅读 · 0 评论 -
OKHttp 原理
网络库比较:HttpClient代码扩展性差,已经废弃;HttpUrlConnection是一个轻量级的http客户端,从4.4开始,底层实现采用okHttp,okHttp是一个高性能的http库,支持ip切换、url重试、线程管理、缓存管理、连接复用等,volley一个简单的一步http库,缺点是不支持同步,不适合大文件下载,volley在2.3以上使用的是HttpUrlConnection,2...原创 2019-02-18 16:29:11 · 8910 阅读 · 0 评论 -
RxJava 基本原理
Retrofit是对网络框架的封装,真正的网络请求是通过OkHttp完成的Retrofit主要用到了适配器模式使用Retrofit五个步骤:创建网络请求接口,设置请求类型和参数 创建Retrofit实例,设置数据解析器(Gson、XML、Protobuf)和网络适配器 创建接口对象(动态代理),配置网络请求参数 调用接口方法返回Call对象或适配器封装的对象 处理适配器逻辑或直...原创 2019-05-03 15:49:51 · 826 阅读 · 1 评论 -
ViewModel
程序架构主要是为了分离业务逻辑、数据、界面显示三大模块,在改进和个性化定制界面的同时,不需要重新编写业务逻辑MVP与MVC的区别:在MVC中View可以与Model直接交互。在MVP中View与Model不能直接交互,而是通过Presenter来控制View、ModelMVP架构的优点:模型和视图完全分离,我们可以修改模型而不影响视图 可以将Presenter用于多个视图,而不需...原创 2019-01-04 18:12:11 · 450 阅读 · 1 评论 -
Activity Lifecycle & LaunchMode
Task是一个具有栈结构的对象,一个Task可以管理多个Activity。Activity四种launchMode:standard、singleTop、singleTask、singleInstance,我们可以在AndroidManifest.xml中通过Android:launchMode属性来配置启动模式原创 2017-05-15 14:34:15 · 797 阅读 · 1 评论 -
网络协议基础
URI和URL的区别:URI是uniform resource identifier,统一资源标识符,用来唯一标识一个资源,格式如下:file://a:1234/a/b/c.txt,对应的是scheme、host、port、path。URL是uniform resource locator,统一资源定位器,它是一种具体的URIHTTP协议特点:应用层协议、支持Client-Server模式...原创 2019-01-17 17:53:07 · 349 阅读 · 1 评论 -
JAVA 基础
JDK和JRE有什么区别:JDK(Java Development Kit)提供了Java开发环境(Javac、调试分析工具)和Java运行环境(JRE)==对于基本类型来说是值比较,对于引用类型来说是引用比较;而equals默认情况下是引用比较,只是很多类重写了equals方法,比如String、Integer等把它变成了值比较,所以一般情况下equals比较的是值是否相等String...原创 2019-02-15 12:49:37 · 403 阅读 · 1 评论 -
自定义属性
Demo演示:自定义属性的声明文件(values/attrs.xml)<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="test"> <attr name="text" format="string" /> ...原创 2019-04-23 15:13:18 · 283 阅读 · 0 评论 -
自定义 View
自定义View基础知识:事件分发机制、Android坐标体系、Canvas变换、自定义属性、补间动画原理(Matrix矩阵变换、第一帧和后续帧的区别)、LayoutInflaterActivityThread#handleStartActivity方法会调用Activity#onCreate方法,进而Activity#setContentView调用PhoneWindow#setContent...原创 2019-04-23 11:56:27 · 242 阅读 · 1 评论 -
View 坐标系
View坐标体系:View真实位置是可以响应点击事件的,需要区分Canvas变换(补间动画绘制)View的原始位置主要由四个顶点来决定,分别对应View的四个属性:left、top、right、bottom,我们可以通过get方法来得到这四个参数,而且width =right -left、hight =bottom -top,子视图的原始位置受父视图原始坐标、父视图的Padding和当...原创 2019-04-21 11:55:05 · 322 阅读 · 0 评论 -
下拉刷新原理(基础理论)
下拉刷新布局主要包含Loading视图、主体视图如果下拉刷新布局包的是CoordinatorLayout,一般用AppBarLayout的偏移来控制是否开始下拉刷新,是否开始下拉刷新操作,由上层来控制原创 2020-02-21 15:47:43 · 535 阅读 · 0 评论 -
事件分发 & 嵌套滑动 & 滑动冲突
推荐一篇事件分发好文章:https://mp.weixin.qq.com/s/5zrZOVQlV6LAOgpD9DF35g要求:中插卡片不支持ViewPager左右滑动,支持Feed流竖向滑动,支持内部卡片横向滑动。UI效果图如下原创 2020-02-21 15:49:41 · 313 阅读 · 0 评论 -
Kotlin Language
Kotlin是一门全栈语言----------词法部分----------数据类型:Boolean、Byte(8)、Short(16)、Int(32)、Long(64)、Float(32)、Double(64)自动装箱拆箱:Int -> int Integer、Char -> char Character不可隐式转换:val anInt: Int = 5 val...原创 2019-10-01 22:19:13 · 631 阅读 · 1 评论 -
Fragment 注意事项
viewPager里有FragmentA和FragmentB,viewpager同级有个Button,点击后在FragmentA里显示一个popupwindow有问题的代码截图:原创 2021-05-20 16:31:36 · 175 阅读 · 0 评论