
android
文章平均质量分 83
赵彦军
android开发工程师、烧菜能手、暖男
展开
-
Android SVG认知误区?
为了更好的视觉效果,经常在项目中使用了 svg (可缩放矢量图形),如下:查看包体积:查看apk 包体积,可以看到在 xhdpi、xxhpdi、xxxhpdi 分别生成了图片,并且有的比较大。原创 2023-02-06 20:14:04 · 748 阅读 · 1 评论 -
Android Glide 4.9 常见方法总结
DrawableImageViewTarget 代替原来的 SimpleTarget。图片会缩放 ,铺满 imageView , 四周会被裁剪。图片保持原来比例,在 imageView 中居中显示。submit 有两个方法。原创 2023-01-13 17:10:17 · 1385 阅读 · 0 评论 -
Android hilt 依赖注入使用详解
的对象都是一个新对象,如果我们要想在 Activity 作用域中实现对象共享,类似于 jetpack 中的 viewModel。如果是 Activity 实例的 context , 需要添加 @ActivityContext。在 android 项目中,但凡一个类要使用 hilt 依赖注入能力,就要在类头部加入。修饰的注入类,在 Activity 类多次申明注入,得到的实例只有一个。如果是 Activity 实例的 context , 需要添加。注解作用在类的构造函数中。申明需要使用的注入类。原创 2022-12-23 23:13:57 · 1731 阅读 · 2 评论 -
Android BottomSheetDialogFragment 使用详解,设置圆角、固定高度、默认全屏等
MD风格的底部弹窗,比自定义dialog或popupwindow使用更简单,功能也更强大。其实细分来说,是BottomSheet、BottomSheetDialog、BottomSheetDialogFragment。原创 2022-11-21 20:15:54 · 8063 阅读 · 0 评论 -
Android DataStore 使用详解
Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。原创 2022-10-19 11:26:22 · 8747 阅读 · 0 评论 -
Android PorterDuffXfermode使用及工作原理详解
类继承自。在用Android中的Canvas进行绘图时,可以通过使用将所绘制的图形的像素与Canvas中对应位置的像素按照一定规则进行混合,形成新的像素值,从而更新Canvas中最终的像素颜色值,这样会创建很多有趣的效果。当使用时,需要将将其作为参数传给方法,这样在用该画笔paint进行绘图时,Android就会使用传入的,如果不想再使用Xfermode,那么可以执行。这个类中的Porter和Duff。原创 2022-10-12 18:22:50 · 1467 阅读 · 1 评论 -
Android Glide 3.8 常见方法总结 【圆角、下载、回调】
发现公司的一个项目,glide用的还是3.8版本。总结一下,常见的方法,加速开发,拒绝加班。在几年前,总结过3.7版本的使用方法,原创 2022-07-30 14:08:09 · 1939 阅读 · 0 评论 -
Android 服务动态发现 SPA 之 Auto Service
动态服务发现机制,可以很好的解耦,不必直接依赖接口实现类。ServiceLoader.load每次都会创建一个新对象。生命周期用完即销毁缺点也很明显,要手动往写入文件。有没有一种自动写入的工具,可以解放双手?有的,下面我们就介绍auto-serviceauto-service的优势是,自动的往写入文件,解放了双手,666666我们看一眼这个目录,在build目录可以看到。......原创 2022-07-18 20:54:19 · 4214 阅读 · 0 评论 -
Android LayoutInflater布局文件解析过程分析
今天在项目中因为LayoutInflater参数使用错误,导致布局中的最外层的宽高都失效。排查好好久,都没有解决,一度怀疑是不是框架的问题。最后发现是LayoutInflater参数使用错误,恍然大悟。原创 2022-07-18 19:05:36 · 518 阅读 · 0 评论 -
Java 动态代理Proxy.newProxyInstance()
这种方式就是我们通常编写代码的方式。原创 2022-07-17 18:55:33 · 1883 阅读 · 0 评论 -
Android 全面剖析SharedPreferences
最近接手了一个项目,由于项目比较老,没有一个好的架构,发现的代码满天飞。比如;随即产生一个疑问,如果我多次调用,那么获取的SharedPreferences实例是一个,还是多个????????直接说答案相同的fileName,不管调用多少次,SharedPreferences都是同一个实例。也就是说SharedPreferences一旦被创建,就会在一个map中保存起来,map的key就是SharedPreferences的fileName。中。...原创 2022-07-17 18:38:30 · 340 阅读 · 0 评论 -
Android 探究RecyclerView onViewAttachedToWindow 触发时机
所以在特定场景下,可以通过这两个回调来解决少量Item移出屏幕,移进屏幕所需要的工作。答案recyclerView已经有adapter了,又绑定了一个新的adapter,就会执行。当第一次setAdapter的时候,屏幕内所有item会调用。适合做item曝光埋点,但是要注意,这个方法可能会执行多次。方法的话,会触发当前在屏幕中的所有Item的。,屏幕类所有的item会先执行。进来,移出的时候,当然也要。出去,所以对应的自然是。综上,Adapter的。......原创 2022-07-16 18:08:42 · 4839 阅读 · 0 评论 -
Android 探究View onDetachedFromWindow 触发时机
当 Activity 销毁的时候, 的 handleDestroyActivity 方法会执行,精简版如下:简单说一下,每个方法的含义: 遍历移除所有子View 是 的意思 。在这里其实是 实例 是 是 实例先看看 就是 把 的 置为 null 。 的 原来是, 的意思是:在来看 root 是 ViewRootImpl 实例 是 又因为 没有覆写 , 所以我们要看 的 方法。遍历子view , 调用其 dispatchDetachedFromWindow 方法,然原创 2022-07-09 00:52:40 · 3944 阅读 · 0 评论 -
Android 探究View onAttachedToWindow 触发时机
我们先从 的 说起。会调用当前 的 通过递归调用,会逐级调用 parent 的 ,最终会走到 的 因为 的 parent 是 ,所以最终会走调用 后续会执行 精简代码如下:调用 方法,从逻辑中我们发现 host 其实就是 。所以就相当于 因为 也是一个 ViewGroup ,并且没有覆写 方法。所以我们直接看 的 方法 的 方法 ,遍历 子view , 然后调用 。发现 的 会调用 。到此 , 已经分析完。...........................原创 2022-07-04 20:28:25 · 4287 阅读 · 3 评论 -
Android 使用ViewTreeLifecycleOwner获取Lifecycle
是中提供的的一个扩展方法,可以快速地获取一个最近的或者的。通过 将当前 设置到通过 将当前 设置到根通过 将当前 设置到通过 将当前 设置到随着 的普及,我们可能需要在 内部基于 进行 订阅等工作,当嵌套比较深时,使用扩展方法可以避免的层层传递,简化代码.............原创 2022-07-03 17:04:38 · 2870 阅读 · 0 评论 -
Android ktx使用
Android KTX 是包含在 Android Jetpack 及其他 Android 库中的一组 Kotlin 扩展程序。KTX 扩展程序可以为 Jetpack、Android 平台及其他 API 提供简洁的惯用 Kotlin 代码。简单来说 , ktx 就是:官方地址:https://developer.android.google.cn/kotlin/ktxmaven版本号:https://mvnrepository.com/artifact/androidx.core/core-ktx添加依赖:原创 2022-07-02 17:33:30 · 2968 阅读 · 0 评论 -
Android View onFinishInflate
的 是一个空方法。我们知道 的 方法,最终会调用 的 。 的 方法,会使用 解析布局,并且把布局添加到 中,可以理解为添加到 中在完成把 添加到 中,会调用原创 2022-06-20 19:15:57 · 672 阅读 · 0 评论 -
Git 可视化工具 Fork 使用指南
最近遇到一个新项目,经过数年的积累,大概有 30000 个分支,用可视化工具打开直接卡死。由于分支实在是太多了,一般的可视化工具,直接卡死,比如 就直接卡死,测试了很多软件,最终 Fork 脱颖而出,可以完全胜任几万分支的情况。fork: 一款 git 可视化工具官网:https://git-fork.com/下载:https://cdn.fork.dev/mac/Fork-2.18.dmg把文件从 移动到 注意:被选中的 commit 都会被合并到前一个 。所以 合并到 合并结果:Dro原创 2022-06-05 19:41:28 · 32122 阅读 · 7 评论 -
Android中使用 Protobuf
Protobuf,类似于json和xml,是一种序列化结构数据机制,可以用于数据通讯等场景,相对于xml而言更小,相对于json而言解析更快,支持多语言。Protobuf使用 文件来定义数据格式,所以我们首先新建立一个文件,并在文件中填下如下内容:这样我们就定义好了一个基本的Person对象,下面我们对文件中的关键字进行一一说明:syntax:指定proto的版本,protobuf目前有proto2和proto3两个常用版本,如果没有声明,则默认是proto2.package:指定包名。import:导原创 2022-06-03 22:30:38 · 5707 阅读 · 0 评论 -
Android硬件加速
Android 硬件加速原理Android 硬件加速原理理解Android硬件加速原理的小白文硬件加速控制(Controlling Hardware Acceleration)android提供了以下四个级别的硬件加速控制:ApplicationActivityWindowViewApplication级别在应用的Android清单文件中,把下列属性添加到元素中,能够开启整个应用程序的硬件加速:<application android:hardwareAccelerated=原创 2022-03-08 11:40:05 · 6270 阅读 · 0 评论 -
Android骨架屏实现方案
Skeletonhttps://github.com/ethanhua/Skeleton依赖引入buildscript { repositories { jcenter() }}allprojects { repositories { jcenter() }}dependencies { implementation 'com.ethanhua:skeleton:1.1.2' implement原创 2022-03-07 11:30:58 · 3884 阅读 · 0 评论 -
Android通过Scheme协议打开APP界面
转载请标明出处:http://blog.youkuaiyun.com/zhaoyanjun6/article/details/123238777本文出自。原创 2022-03-03 14:21:48 · 12754 阅读 · 1 评论 -
Android Bitmap 研究与思考(中篇)
文章目录质量压缩采样率压缩矩阵缩放RGB_565压缩createScaledBitmap 压缩BitmapFactory.Options 属性介绍bitmap 保存为文件文件转为 bitmap高效加载大位图bitmap 转为 drawabledrawable 转为 bitmap总结质量压缩 private fun compressQuality() { //把 drawable 转成 bitmap val bm = BitmapFactory.decodeResourc原创 2022-02-25 17:48:09 · 1278 阅读 · 0 评论 -
android gradle自定义钉钉群提醒
今天接到一个需求,写一个 gradle 小插件,在执行完某个 gradle 任务后,向钉钉群聊机器人发送一条消息,并自动 @所有人。首先在钉钉群中创建智能机器人,并获取到 Webhook 链接有了 Webhook 链接就可以给机器人发消息了。下面我们来自定义 gradle 工具。在项目的跟目录创建 dingding.gradledingding.gradle 代码如下:import groovy.json.JsonBuilderimport groovy.json.JsonOutput原创 2022-02-16 20:10:04 · 1548 阅读 · 0 评论 -
Shell脚本学习笔记
什么是 ShellShell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 脚本Shell 脚本(shell script),是一种为 shell 编写的脚本程序。Shell 环境Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。Shell 语法打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩原创 2022-02-14 15:55:04 · 564 阅读 · 0 评论 -
Android如何实现全局的护眼模式
最近接到一个做护眼模式的需求,要求是在Android App 全局,在任何一个页面都显示。在做需求之前要先弄清楚几个概念蓝光短波蓝光是波长处于400nm-480nm之间具有相对较高能量的光线。该波长内的蓝光会使眼睛内的黄斑区毒素量增高,严重威胁我们的眼底健康。蓝光诱发致盲眼病,最有效的解决方案是对电视进行贴膜处理。防蓝光贴膜技术已经很成熟,成本很低,可以有效阻止蓝光穿透。在这里,特别提出一点,蓝光并不都是有害蓝光,真正有害的是波长400到450以内的蓝光,而480到500纳米之间的蓝光有一种调整生物原创 2022-02-11 17:26:33 · 3237 阅读 · 1 评论 -
OkHttp ResponseBody没有关闭造成的内存泄漏
在网络请求中,ResponseBody 用完时需要关闭的。日常开发中,我们需要操作的不多,是因为常用的框架已经做好了。response.body().string() 的 string() 方法已经自动关闭资源。类似的方法还有:response.body().bytes() 也会自动关闭再比如常用的 GsonConverter ,会把 ResponseBody 转成 Bean 对象,也会自动关闭 。...原创 2021-12-13 14:45:09 · 4236 阅读 · 0 评论 -
Android复盘OkHttp HttpLoggingInterceptor造成的OOM
文章目录前言HttpLoggingInterceptor 简介下载文件请求阶段需要等很久以及OOM前言最近项目中发生了很多 oom,通过 oom 日志分析来看,都跟 okhttp 有关。经过艰难的分析定位,终于发现了造成 oom 的凶手HttpLoggingInterceptor 。原因是 HttpLoggingInterceptor 作为 okhttp 请求的过程的日志输出工具, 会把 ResponseBody 里面内容全部读出来,放在内存里。对于普通的网络请求,影响并不大。但是对于下载来说,它会把原创 2021-12-13 14:13:19 · 2700 阅读 · 2 评论 -
Android Kotlin Flow 如何使用callbackflow
首先我们来看一个例子:我们有一个网络接口,在耗时3秒后会回调一个结果,把结果 3 ,回调出去。代码如下: /** * 模拟网络请求 */ fun requestApi(block: (Int) -> Unit) { thread { Thread.sleep(3000) block(3) } }如果我们要把这个用 Flow 的形式把结果发送出去改怎么写:原创 2021-12-09 19:47:14 · 5891 阅读 · 1 评论 -
Retrofit 注解参数详解
文章目录GET@Path@Query@QueryMapPOST@Bodyform表单1:@FormUrlEncodedform表单2:FormBody@Multipart上传文件对Retrofit已经使用了一点时间了,是时候归纳一下各种网络请求的service了。下面分为GET、POST、DELETE还有PUT的请求,说明@Path、@Query、@QueryMap、@Body、@Field的用法。添加依赖implementation 'com.squareup.retrofit2:retrofit原创 2021-10-28 15:54:54 · 1480 阅读 · 2 评论 -
Android 断点续传实现原理
下载原理在介绍断点续传之前,我们先说说下载的原理。代码示例用 OkHttp 作为示例。下载核心思路是把 responseBody 写入文件,核心代码如下:但是这种做法有个明显的问题,假如手机在下载文件的时候下载了80%,某些原因断网了,如果不支持断点续传,那就只有被迫重头开始下载。但是如果有断点续传的加持,就只需要下载最后 20% 的资源,避免重新下载。断点续传原理1、java.io.RandomAccessFile断点续传/下载需要使用到 java.io.RandomAccessFile 类原创 2021-10-25 17:36:19 · 1553 阅读 · 0 评论 -
Android Context Hook
Context Hook在 Android 编程中,我们常常会和 Context打交道,而且 Context 遍布各个地方,就算使用 Jetpack Compose 也都离不开它。正因为 Context 被广泛的使用和传播,当我们面对一些特殊问题时,常常能够从 Context对象入手,去解决许多看似不能改变的代码问题。这常常就会用到 Context Hook 这种手法。Context Hook 形式其实特别简单,就是使用 ContextWrapper 对原有的 Context 进行代理,从而实现 Con原创 2021-10-25 17:04:17 · 1730 阅读 · 0 评论 -
Android View Binding的使用
什么是View BindingView Binding是Android Studio 3.6推出的新特性,目的是为了替代findViewById(内部实现还是使用findViewById)。。在启动视图绑定后,系统会为改模块中的每个xml文件生成一个绑定类,绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。View Binding 的优点Null 安全:由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险。此外,如果视图仅出现在布局的某些配置原创 2021-10-13 21:08:52 · 2165 阅读 · 2 评论 -
Java线程安全集合总结
从Java5开始,在Java.util.concurrent包下提供了大量支持高效并发访问的集合接口和实现类,如下图:从图中可以看出,这些线程安全的集合主要分为两类,以Concurrent开头的集合类和以CopyOnWrite开头的集合类。1、以Concurrent开头的集合类,可以支持多个线程并发写入访问,写入操作都是线程安全的,读取操作不必锁定,采用更复杂的算法保证永不会锁住整个集合,因此在并发写入时有较好的性能。ConcurrentLinkedQueue实现多线程高效、无须等待的访问,不能使用原创 2021-10-13 18:08:01 · 3201 阅读 · 0 评论 -
Android ConstraintLayout ConstraintSet动态布局
在传统布局方式中,如果要改变某个控件的位置,需要获取 LayoutParams , 后台修改属性值就行了。但是在约束布局 ConstraintLayout 中,要改变控件的约束条件,需要用到 ConstraintSet 类。主要有 5 个步骤第一步:创建 ConstraintSet() 实例 val set = ConstraintSet()第二步:需要复制一份父布局的约束,方法有三个如下set.clone(constraintLayout: ConstraintLayout);set原创 2021-10-12 19:58:06 · 7039 阅读 · 1 评论 -
Kotlin重载运算符operator
定义运算符重载就是对已有的运算符赋予他们新的含义。重载的修饰符是operator。比如我们的+号,它的含义是两个数值相加:1+1=2。+号对应的函数名是plus比如我们定义一个类,如何才能使用 + 这个符号呢?其实也很简单,使用 operator 重载 plus 函数就能搞定,我们试试吧重载 plus首先我们定义一个类 Point ,然后重载 plus 函数class Point(private val x: Int, private val y: Int) { operator fu原创 2021-09-26 21:01:51 · 5556 阅读 · 0 评论 -
Kotlin by属性委托
在 Kotlin 中,通过 by 实现属性委托,属性委托 是什么意思呢?简单来说,就是属性的 set、get 的操作,交给另一个对象器完成。举个例子:class Example { var p: String by Delegate()}语法是: val/var <属性名>: <类型> by <表达式>。在 by 后面的表达式是该 委托, 因为属性对应的 get()(与 set())会被委托给它的 getValue() 与 setValue() 方法。原创 2021-08-26 21:33:18 · 1454 阅读 · 0 评论 -
Android Annotation注解详解
文章目录Java注解元注解说明@Retention@Target通过反射获取注解信息方法使用注解方法的参数使用注解Java注解Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。Jav原创 2021-08-24 19:59:41 · 2211 阅读 · 5 评论 -
Android 应用目录分析
沙箱私有目录内部存储空间中的应用私有目录val filesDir = filesDir/data/user/0/com.example.myapplication/filesval cacheDir = cacheDir/data/user/0/com.example.myapplication/cache是 app 的私有目录,也称沙箱。App 卸载后,此目录随之删除。文件管理器无法访问,除非root。还有一种方法,把手机连到到电脑上,运行 app debug 模式,用 Android原创 2021-08-12 17:57:01 · 1360 阅读 · 0 评论 -
Kotlin实战指南十九:use 函数魔法
转载请标明出处:http://blog.youkuaiyun.com/zhaoyanjun6/article/details/117365712本文出自【赵彦军的博客】文章目录往期精彩文章use函数往期精彩文章Kotlin实战指南十七:JvmField、JvmStatic使用Kotlin实战指南十六:Synchronized、VolatileKotlin实战指南十五:协程泄漏本文章转载于:Kotlin use函数的魔法use函数实现了Closeable接口的对象可调用use函数use函数会自动.原创 2021-05-28 16:48:18 · 3095 阅读 · 0 评论