
android-疑难杂症研究
文章平均质量分 56
ByteFlys
这个作者很懒,什么都没留下…
展开
-
【JVM】Efficient Memory Leak Checker
【代码】【JVM】Efficient Memory Leak Checker原创 2024-10-18 09:34:28 · 363 阅读 · 0 评论 -
【Android】根据URI获取文件扩展名或MimeType
安卓中的URI包含多种格式,可以是文件,可以是媒体库资源,可以是Resource。对于这三种不同的格式,我们要分别采取不同的解析方式。安卓中通过URI访问文件主要包括三种方式。也可以是网络地址,或其它资源标识。这里我们主要针对文件来源的URI。原创 2024-08-28 09:37:54 · 1410 阅读 · 0 评论 -
【Android】Navigation动态设置Graph和Launch参数
在Activity和Fragment中通过以下代码获取AccountCenterViewModel,拿到的将是同一份对象。不同的Fragment如果想要共享数据的话,可以通过共享ActivityScope的ViewModel来实现。NavHost如果指定了Graph,在onCreate后会立刻启动,可能会造成启动两个Fragment栈。Activity和Fragment可以服用,不同的启动方式,Fragment调用栈不同。不同的启动方式,通过代码动态设置,使用不同的NavGraph。原创 2024-08-23 08:24:43 · 1219 阅读 · 0 评论 -
【Android】Glide模块工作原理
再找到Decoder对应的Transcoder,将对应的Resource转为Drawable。Transcoder负责将对应的Resource,转换为Drawable。以及每个Decoder的解码过程,如果成功,最终都将解出Drawable。Decoder负责将DataSource转换为对应的Resource。轮询所有注册的Decoder,挨个尝试解码DataSource。如果解码成功,则视为该Decoder对应的Resource。Glide的加载原理,是采用HitTest的方法。原创 2024-08-23 08:24:09 · 689 阅读 · 0 评论 -
【Android】Android AOP 编程框架
AOP编程全称Aspect Oriented Programming,面向切面编程主要功能是在不改变原代码的前提下,对特点代码节点进行修改,预处理,后期处理如果不想写表达式,可以在想要拦截的方法上加一个切入点注解再定义一个切入点处理器,与注解绑定,来处理拦截工作即可此外,注解还可以携带一些参数,用于扩展需要): Any?!!target!!pointcut可以看到,Activity的背景自动变成黄色了,完全不用改动原代码!而且还能看到,在拦截过程中,我们是可以对原有方法执行流程进行调整的。原创 2024-08-19 10:05:46 · 1876 阅读 · 0 评论 -
【Android】在渲染生效前提前测量View大小
Android的UI机制是基于MessageHandler的,View并不会在添加后就会被立刻测量渲染出来。但有时我们需要动态去计算布局,希望在添加View时,就能知道这个View的高度。measure方法需要提供两个spec,我们根据实际情况自己去创建。此时,我们可以手动去调用measure方法,来测量View大小。原创 2024-07-13 11:30:55 · 401 阅读 · 0 评论 -
【Android】自定义换肤框架05之Skinner框架集成
加载后重新调用setContentView生效,不需要重启Activity或应用。Skinner教程到此结束啦,祝大家工作顺利,学习进步,心情愉悦!在所有功能前调用即可,建议在Application中初始化。在应用该皮肤包前安装即可,建议预安装,或应用皮肤前安装。直接将皮肤资源,保持和原安装包同名,放在res目录下。自定义的资源目录,需要在Gradle中进行配置。在Activity应用皮肤前安装即可,建议在。生成apk格式的压缩包,即可作为皮肤包使用。并且,皮肤包的包名,要和原安装包保持一致。原创 2024-07-07 08:34:29 · 494 阅读 · 0 评论 -
【Android】自定义换肤框架04之Skinner框架设计
到上一章为止,我们已经完整讲解了换肤所用到的所有技术点这一章,我们来梳理下,如何从整体和细节上,进行代码设计毕竟,我们不止是简单实现功能,要做到功能清晰,使用灵活。原创 2024-07-06 13:13:52 · 716 阅读 · 0 评论 -
【Android】自定义换肤框架03之自定义LayoutInflaterFactory
在上一章,我们实现了自定义AssetManager和Resources,但不知道在哪里去应用它们现在我们知道,View是通过InflaterFactory创建的如果我们能让Factory使用自定义Resources,那么基本就实现了换肤的功能先上代码,让大家心里有个底) {代码其实非常简单,如果是自己实现的话,以下点需要注意InflaterFactory一旦创建,不可再被修改,除非通过反射强制去修改。原创 2024-07-06 13:12:44 · 1194 阅读 · 0 评论 -
【Android】自定义换肤框架02之自定义AssetManager和Resource
在上一章中,我们已经讲过,apk中有个资源索引文件其中保存了每个资源对应的id,name,type,path资源文件的解析,主要涉及两个类,AssetManager和Resource拷贝测试皮肤包到存储卡这里我们将测试包放在asset文件夹里面,在应用启动时拷贝到存储卡,从而省去人工操作通过指定皮肤包初始化SkinnerAssetManager使用自定义的SkinnerAssetManager加载资源十万个为什么到目前为止,我们已经实现了从指定apk中加载同名资源下一步问题是,如何让Acti原创 2024-07-05 08:32:52 · 783 阅读 · 0 评论 -
【Android】自定义换肤框架01之皮肤包制作
目前为止,市面上主流的安卓换肤方案,其实原理都是差不多的虽然大多都号称一行代码集成,但其实想要做到完全适配,并不简单这个系列,就是让大家从零开始,完全掌握这方面知识,这样才能对框架不支持的点自己进行补充该系列,我将使用小步慢跑的方式,每篇博客都是教会大家一个小知识点,直到完全掌握。原创 2024-07-05 08:32:08 · 640 阅读 · 0 评论 -
SVG从零基础到完全掌握
首先,毫无疑问,这是一份非常完善且简洁的SVG学习教程它包含了SVG所有的核心内容,而且有说明和示例对于更复杂的细节,最后附有官方文档,我们一般也用不上defs标签,可以包含若干元素,这些元素可以被其它地方引用或复用defs标签下的元素,在被复用前,都不会被展示复用通过use标签来实现,引用通过#来连接其id原创 2024-07-04 09:49:20 · 1029 阅读 · 0 评论 -
【Git】GitIgnore不生效
这里可能有两种原因,一个没有刷新Git缓存,二是Git忽略规则有问题原创 2024-06-29 22:13:18 · 348 阅读 · 0 评论 -
Gradle Compressor Plugin
Compress Any File from Any Where into Any Fromat !原创 2024-06-28 21:11:14 · 1114 阅读 · 0 评论 -
【Gradle】IntelliJ Idea 或 Android Studio 调试Gradle代码
命令行参数不要写在properties文件里面,写在Gradle Run / Debug的Options里面。因为Gradle的运行效果可以由很多因素来决定,因素太多出了问题不好排查。这里我的建议是,统一使用Gradle Run / Debug来执行程序。不容易和系统默认版本的Gradle或JDK产生端口冲突,或者参数冲突。此外,在同一个机子上,可能存在多个版本的Gradle和JDK。这样Gradle和JDK固定使用的就是IDE配置的版本。除了在脚本内部添加断点,也可以在报错代码的位置添加断点。原创 2024-05-17 10:27:35 · 522 阅读 · 0 评论 -
通过GroovySDL实现GradleScript
DSL的语法更加简洁,对专业编程能力要求低,尤其适合用于编写命令脚本,比如Gradle脚本就是这种风格。核心的内容上面已经讲解完了,这一节我们简单演示一下,Groovy内置的一些DSL风格的编译组件。一些比较新的语言,都提供了这种风格的调用方式,比如Groovy DSL,Kotlin DSL。但DSL的简洁性背后,往往都有专业的面向对象风格代码在支撑,但是用户只和DSL这一层打交道。可以看到,上半部分是面向对象风格的代码,下半部分是DSL风格的代码。Groovy提供了专门的类来解析和执行脚本,主要有。原创 2024-03-18 22:54:48 · 850 阅读 · 0 评论 -
【Android】主流单元测试组件,一网打尽!
Android的测试的组件比较多,像JUnit,Espresso,UiAutomator,MockitoAndroid的测试范围也包括很多种,比如Java代码测试,Android逻辑测试,AndroidUI测试每个框架的侧重点各有不同,这里我们专门来介绍前三个Google官方推荐的测试框架有些测试组件是只在AndroidTest中可用的,在JavaTest目录下如果访问不了,不用大惊小怪。原创 2024-03-08 11:10:11 · 774 阅读 · 0 评论 -
【LiveData】LiveData转换及操作符分析
MediatorLiveData会订阅上游SourceLiveData,经过一系列的数据处理和转换工作后,再将新数据发布给自己的订阅者。并且,switchMap在订阅新的LiveData之前,会解除对旧LiveData的订阅。LiveData操作符可以将一个LiveData转换为另一个LiveData。收到上游数据时,生成一个新的LiveData,并订阅新的LiveData。收到重复数据时,不转发给下游,这里的重复是通过equals方法来判断的。收到上游数据时,转换成新的数据格式,并发布给下游订阅者。原创 2024-03-03 16:06:25 · 295 阅读 · 0 评论 -
【RxJava】RxJava3核心功能讲解和源码分析
一个是Observable的订阅顺序,一个是doOnSubscribe的执行顺序,Observable的订阅顺序上面已经得出结论了,是从后往前执行的。当没有指定ObserveOn,但是指定了SubscribeOn时,由于onNext代码是从最上游的Observable.subscribeActual开始的,所以所有的onNext都会在最近一个SubscribeOn指定的线程中执行。reduce:将上游Observable的相邻两个数据进行运算,再拿结果与下一个数据进行运算,如此循环,得到一个最终值。原创 2024-02-27 12:10:22 · 1479 阅读 · 0 评论 -
【RxJava】RxJava单次订阅,onNext后自动解除订阅
每次订阅会产生一个Disposable对象,可以通过在onNext执行完毕后销毁该对象,来达到单次订阅效果。多次订阅该Observable,但希望接收一次Observable数据后,就停止继续接收。在订阅时,可以通过自定义Observer的方式,来控制Disposable。为了简化代码,可以封装一个专门的Observer类,来实现此类功能。有一个Observable一直存在,会不停发送数据。原创 2024-01-08 17:58:17 · 562 阅读 · 0 评论 -
【Android】Hilt比Android好在哪里
Hilt框架的功能和设计理念,和Dagger基本是完全一致的,Hilt也是完全在Dagger基础上进行开发的。但是Dagger的用法比较繁琐,Hilt主要是做了便用性上的改进,主要有以下点。原创 2023-11-21 19:14:25 · 418 阅读 · 0 评论 -
【Android】Dagger2 通过 AndroidInjector 简化模版代码
前面我们已经详细讲解过,如何通过 Component 和 Module 向 Activity 注入对象这是基本的使用方法,它的缺点是当 Activity 特别多时,就需要非常多的 Component 和 Module 类现在我们来讲解,如何通过 AndroidInjector 向基类进行统一注入。原创 2023-11-15 09:59:30 · 532 阅读 · 0 评论 -
【Android】Dagger2 框架设计理念和使用方式详解
现在我们已经知道,可以通过@Singleton来实现全局单例那么如果我们想在实现在某个类里面单例共享,不同类之间允许多例,要怎么做呢我们可以通过 Dagger 的自定义 Scope 特性来实现这个目标,步骤如下首先,自定义一个注解,表示被标记的类在里面是单例共享的Retention;Scope;@Scope实际上,@Singleton和一样,只是一个被@Scope标记的自定义注解,用来标记单例作用域的下一步,指定 Component 的作用域。原创 2023-11-08 09:53:07 · 629 阅读 · 0 评论 -
【Android】Debug时禁用主线程ANR限制
ANR全称Application Not Response,指主线程超过5s无响应,应用会自动退出。这样调试起来会非常麻烦,其实对于Debug应用,是可以临时禁用ANR限制的,方法如下。由于这个线程,如果我们给主线程加了断点,就会触发ANR,导致调试时应用退出。原创 2023-11-07 15:18:49 · 1161 阅读 · 0 评论 -
【RxJava】map过程中各个Observable生命周期分析
发生异常时,所有的OnSubscribe都会执行发生异常时,所有的OnFinally都会执行发生异常时,所有的OnComplete都不会执行发生异常时,后续的OnError都会执行发生异常时,后续的OnNext都不会执行发生异常时,后续的Function都不会执行。原创 2023-11-01 12:26:22 · 1401 阅读 · 8 评论 -
【Android】性能优化方案汇总
Fragment等多页布局,页面展示时再初始化,不要一次性初始化(加快UI启动速度)用启动图片作为背景,取代默认的白色空白出口(让启动在视觉上看起来更流畅)将消耗大的工作放到子线程中初始化,并降低线程优先级(减轻UI线程压力)监测网络请求(Profiler、Wireshark、Fiddler)利用闪屏页面的展示时间处理初始化工作(让启动在视觉上看起来更流畅)布局延迟加载(可以使用ViewStub占位,需要时再加载)图片压缩(可通过tinypng网站在线压缩)将不紧急的工作延时执行(加快UI启动速度)原创 2023-09-06 18:18:14 · 203 阅读 · 0 评论 -
【Android】模块化方案
这个接口定义大业务从哪个界面开始启动,启动前要创建哪些资源,如何退出模块,退出时要销毁哪些资源。业务规范模块:负责登录,升级,定位,权限申请等单个子业务。当业务比较复杂时,该模块只定义接口规范,不负责具体实现。大业务模块:负责公司某个具体方向的大业务。业务配置模块:配置启用哪些业务模块,选择哪种业务方案。主模块:一个套壳模块,什么都不做,根据配置模块决定启动后哪个大业务模块。通用技术模块:负责网络通信,事件订阅发布,常用控件等通用技术方案。定制技术模块:负责播放器,视频通话,表格读写等定制技术方案。原创 2023-08-28 20:29:37 · 275 阅读 · 0 评论 -
【后台定位】Android13后台定位方案
这个每个型号的手机,就都有所不同了,但整体上都围绕下面几个方面,只能靠大家去摸索了。一些特殊功能都有了自己的方案,虽然操作起来比较麻烦,但总算是有比较统一的方法了。在一些比较宽松的手机上,已经足够保证程序在一段时间内,能够在后台获取定位了。服务只有以前台服务的形式进行启动,才能在应用切换到后台后,继续进行定位。但不少第三方的系统,为了节约电量和性能,还必须额外进行一些保活设置。这里我们要前台定位和后台定位权限一起申请,并且将前台权限放在前面。到此为此,我们已经完成了所有必要的设置。原创 2022-12-14 18:29:11 · 5572 阅读 · 0 评论 -
【IDE】Android Studio 工具栏完全自定义教程
开启工具栏右键自定义工具栏搜索或选择自己想要的快捷按钮原创 2022-05-23 17:39:04 · 1691 阅读 · 0 评论 -
【数据结构与算法】【02】Java常用集合类特性分析和底层实现
Java集合类和通用数据结构的区别Java集合类是从数据使用方式的角度,对复杂数据类型进行分类的 List存储有序的单列数据,是纯数值集合,可以根据位置查找数据 Set存储无序的单列数据,是纯数值集合,但是没有顺序和位置的概念 Map存放双列数据集合,是键值対集合,每个数据包含关键字和实际值两列,可以通过关键字查对应值通用数据结构则是从数据内存结构的角度,对复杂数据类型进行分类的误区大多时候,数据的使用方式,就已经决定了其底层采纳的内存结构比如一想到List,就想到数组、链表,一想到Ma原创 2022-05-11 17:17:14 · 380 阅读 · 0 评论 -
【Android】【绘制】如何将Canvas的某块区域清除为透明
今天同事问了我这个问题,我差点把自己也给绕进去了答案是不画即可,根本没有将已绘制区域像素清除为透明的方法最多只能通过XferMode等方式,将其叠加为黑色那为什么同事会问这种问题呢,原因是他对Canvas的绘制方式理解错了他以为Canvas每次都是在上一帧的基础上进行绘制的,所以才有了擦除这样奇怪的想法其实Canvas的每一帧,都是从全透明开始绘制的,根本不需要刻意去擦除内容Canvas的每一帧都是一张静态图像,如果想要某个区域为透明,绘制时跳过这个区域即可由于是同事先入为主的,我一时没反应过原创 2021-10-27 11:59:03 · 1670 阅读 · 2 评论 -
【Android】【UI】软键盘弹出隐藏,兼容弹窗
InputMethodManager和Window关于软键盘的博客网上很多,但是很多没有提及一点就是输入法的布局是绑定在Window上的当我们的界面只有ActivityWindow时,网上的博客都是没问题的但是如果界面布局是展示在Dialog,DialogFragment,PopupWindow里面的网上的很多博客,其实是不生效的,正规的方法如下代码 //打开软键盘 public static void openKeyboard(EditText edit) {原创 2021-10-21 17:01:29 · 498 阅读 · 0 评论 -
【Android】【打开方式】Android11用其它应用打开微信文件
注册自己的Activity通过mimeType和scheme,可以将自己的Activity与特定格式的内容和协议关联起来,从而用自己的Activity去打开这些内容mimeType指的是内容格式,比如是txt,还是doc,还是ppt等scheme指的是协议格式,比如是file,还是http等 <!-- KML预览 --> <activity android:name=".view_window.kml.KmlPreviewActivity" android:原创 2021-08-24 17:34:53 · 123073 阅读 · 8 评论 -
【Android】【GreenDao】GreenDao缓存机制中隐藏的炸弹
一般用法 潜在隐患 解决方法原创 2021-07-13 17:25:30 · 832 阅读 · 3 评论 -
【Android音视频开发】【019】Linux下编译ffmpeg-x86
为什么x86版本的单独出教程没有安装yasmx86版本sh脚本注意事项原创 2021-07-11 16:07:54 · 520 阅读 · 0 评论 -
【Android】【版本适配】Android11权限适配终极解决方案
Android11有了哪些改动Android11主要是进一步收缩了应用权限,在权限管理方面比以前更加严格最主要,影响最大的,就是存储卡访问权限的调整从Android11开始,应用将只能访问自己的私有目录、公共媒体目录、存储卡根目录其它目录,只能判断文件是否存在,但是既不能读取,也不能写入这直接影响到文件选取、拍照录像录音、文件分享、文件下载等功能对开发者影响非常大,特别是严重依赖于外部存储的项目应对方案首先摆正心态,积极适配,不要抗拒变化,逃避问题,影响比较多,我们逐个击破Android1原创 2021-06-24 15:12:38 · 7018 阅读 · 0 评论 -
【高级UI】【012】FontMetric详解,Android文字居中绘制
文字绘制和图片绘制的区别我们绘制一张图片,一条直线,或一个矩形时基本上确定上下左右的坐标,就确定了图片或几何元素的位置但字体元素,由于其特殊的格式,并非从左往右,从上到下直接绘制的字体格式的专业规范Android中的FontMetricAndroid中的FontMetric即是对以上字体规范的一种实现在Android中,文字的绘制是从baseline位置开始的,它的y值为0我们来看看FontMetric中各个字段代表的含义 baseline,基线,文字绘制的起始位置 ascent,上原创 2021-06-13 15:27:49 · 802 阅读 · 3 评论 -
【Android】【IDE】AndroidStudio依赖冲突终极解决方案
库冲突一般原因 查找导致类冲突的Libarary 查找导致库冲突的Dependency 排除有冲突的Dependency 排除重复的Resource 备注原创 2021-05-18 17:17:04 · 2097 阅读 · 4 评论 -
【Android】【ButterKnife】@BindView注入的控件为null
ButterKnife必须配置了插件后才能生效,在build.gradle文件中添加以下代码虽然不是很难,但是不容易想到,特别建新项目时,容易遗漏apply plugin: 'com.jakewharton.butterknife’原创 2021-04-16 09:40:16 · 2089 阅读 · 0 评论 -
【程序人生】2021-01-06随笔
做安卓开发已经有三年了,已经跨越了中级阶段但是由于自己不够勤奋,一直停留在高级守门员的水平实话来讲,今年和去年这两年,没有太大进步,只零零散散学了写东西,没有学成什么系统的知识和技能框架原理,自定义控件,NDK这些,很早就会了,但却没有哪一样算的上精通的基本都是懂原理,能看,能改的水平,我相信很多人应该和我一样,比不学无术的要好点,但是也没什么突出的成就这些东西,如果只是入门的话,可能一周就可以学会,但要是达到一个精通水平,还是离不开大量实践的这里总结一下这方面的高级指标,以便提醒自己,掌握的还原创 2021-01-06 10:48:02 · 247 阅读 · 0 评论