自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(69)
  • 资源 (5)
  • 收藏
  • 关注

原创 Android中bindService和startService启动服务有何区别

和是 Android 中两种用于与Service交互的方式,它们的区别主要在于和。

2024-12-12 09:43:52 979

原创 类文件具有错误的版本 61.0, 应为 55.0 请删除该文件或确保该文件位于正确的类路径子目录中。

这个错误表明你的项目尝试加载的 .class 文件(编译好的 Java 类)是用比你的运行环境支持更高版本的 Java 编译的。

2024-12-11 19:21:19 2417

原创 如何实现Android项目中线程池的统一管理

通过线程池收束优化,可以灵活、高效地管理 Android 项目中的线程资源,同时兼顾不同类型任务的需求。

2024-12-11 15:19:43 232

原创 重修设计模式-行为型-备忘录模式

如果这一时间点没有对应的全量备份,就先找到最近的一次全量备份,然后用它来恢复,之后执行此次全量备份跟这一时间点之间的所有增量备份,也就是对应的操作或者数据变动。针对这个问题,不同的业务场景有不同的处理方式。备忘录模式通过封装对象的内部状态,提供了一种灵活且安全的状态管理机制,非常适合用于需要保存和恢复状态的复杂系统中,比如在需要实现撤销操作或保存和恢复对象状态的场景,例如文本编辑器、游戏状态保存等。在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。

2024-11-13 18:29:15 1325

原创 重修设计模式-行为型-命令模式

命令模式的主要作用和应用场景,是用来控制命令的执行,比如,异步、延迟、排队执行命令、撤销重做命令、存储命令、给命令记录日志等等,这才是命令模式能发挥作用的地方。

2024-11-13 18:26:04 798

原创 重修设计模式-行为型-迭代器模式

容器对象的遍历与其内部表示分离,可以更好的支持对容器对象的多种遍历算法,并且可以在不修改容器对象本身的前提下增加新的遍历方式。目的是将容器对象的遍历与其内部表示分离,可以更好的支持对容器对象的多种遍历算法,并且可以在不修改容器对象本身的前提下增加新的遍历方式。而且每个迭代器独享自己的游标信息,就可以创建多个迭代器,同时对一个容器进行遍历。通过迭代器来遍历集合元素的同时,如果增加或者删除集合中的元素,有可能会导致某个元素被重复遍历或遍历不到,也有可能正常遍历(运行结果的对错,要视情况而定),这种情况称为。

2024-10-24 15:15:43 882

原创 重修设计模式-行为型-访问者模式

多态表示执行哪个对象的方法,重载表示执行对象的哪个方法。由于 Kotlin 是单分派机制,所以重载代码那里匹配的是 SingleDispatch 的 overloadFunction(p: Parent) 函数,也就是根据 p 的声明类型来决定匹配哪个重载函数,而不是运行时真实类型。总的来说,访问者模式是一种强大的设计模式,它允许在不修改对象结构的情况下增加新的操作,但在使用时需要权衡其带来的复杂性和性能开销。,从而绕过了单分派机制语言的限制,这虽然不是完整的访问者模式,但已包含访问者模式的核心原理了。

2024-10-24 15:11:00 1132

原创 彻底掌握Android中的Lifecycle

Lifecycle 是状态机 + 观察者模式的结合,通过 ReportFragment 触发事件,驱动 LifecycleRegistry 中所有观察者状态同步,并根据同步结果触发观察者对应的回调方法,这就是它的整体原理。Lifecycle 虽然只是提供了抽象层的组件生命周期监听,但这一改变可以让软件编码灵活性大大加强,LiveData 就是基于 Lifecycle 来实现的。通过使用 Lifecycle,可以编写出更加健壮、可维护的代码,提升应用的性能和用户体验。

2024-10-14 22:32:28 2054

原创 重修设计模式-行为型-策略模式

策略模式(Strategy Pattern)的定义比较简单,主要是一个策略接口和一组实现这个接口的策略类。基于“面向对象的多态特性”和“面向接口编程”的原则,在运行时根据场景灵活选择具体策略。

2024-10-14 16:39:42 951

原创 重修设计模式-行为型-观察者模式

在移动开发中,有很多知名的三方库也应用了观察者模式,比如 EventBus、RxJava、ARouter、Lifecycle 等,它们都符合观察者模式的思想,只是实现方式会有不同,下面以 EventBus 为例,看它是如何实现的。EventBus 核心维护了一个映射表,在 register 时遍历注册对象中 Subscribe 注解的方法,并将方法消息类型和对应方法存入映射表,在 post 时查询映射表,找到对应消息类型匹配的方法,并通过反射调用的方式进行通知,这就是 EventBus 的设计思想。

2024-10-10 19:28:01 1129

原创 重修设计模式-行为型-模板模式

模板模式的原理和实现非常简单,在平时的编码中,可能不经意间就已经用到了模板模式。模板方法的目的就是加强代码复用和方便扩展,原理和实现简单,应用也非常广泛,比如 Java 的 AbstractList、AbstractMap;在移动端开发中也经常定义出。模板模式是经常使用的设计模式,它使得算法的结构在高层得到定义,而具体的实现细节则可以在低层通过子类来实现,符合开闭原则,让代码可复用,扩展方便。不过在 Kotlin 语言中,,回到模板方法模式,要注意封装类设计的合理性,避免职责混杂,具体设计要根据场景而定。

2024-10-10 19:26:03 1298

原创 重修设计模式-行为型-责任链模式

责任链模式(Chain of Responsibility Pattern)也叫职责链模式,通过将请求的处理分配给一系列的处理对象,这些处理对象通过链式结构组织起来,以实现对请求的灵活处理。比如,一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,以此类推,形成一个链条,链条上的每个处理器承担各自的处理职责。

2024-09-26 18:55:15 857

原创 放弃 startActivityForResult,Activity Result API 优雅使用

Activity Result API 是 androidx 中的一个新 api,旨在替代原有的 `startActivityForResult` 方法,用于在两个 Activity 或 Fragment 交换数据、获取返回结果。

2024-09-26 18:51:15 979

原创 彻底掌握Android中的ViewModel

ViewModel 属于`Android Jetpack`库的一部分,是一种业务逻辑或屏幕状态容器。它提供了在配置更改(如屏幕旋转)后依旧保留相应状态的特性,帮助开发者以更加清晰和可维护的方式处理UI相关的数据,从而避免了在 Activity 或 Fragment 中直接处理数据持久化的问题。

2024-09-23 16:38:04 6648 1

原创 重修设计模式-结构型-享元模式

享元模式(Flyweight Pattern)核心思想是通过共享对象方式,达到节省内存和提高性能的目的。享元对象需是不可变对象,因为它会被多处代码共享使用,要避免一处代码对享元进行了修改,影响到其他使用它的代码。

2024-09-23 16:29:37 955

原创 重修设计模式-结构型-组合模式

组合模式(Composite Pattern)也叫部分-整体模式(Part-Whole), 用来描述部分与整体的关系,主要是用于处理树形结构数据。

2024-09-20 11:19:00 547

原创 重修设计模式-概览

借助设计模式,可以利用更好的代码结构,将大块复杂代码拆分成职责更单一的小类,让其满足开闭原则、高内聚松耦合等特性,以此来控制和应对代码的复杂性,提高代码的可扩展性。

2024-09-19 20:21:31 889

原创 重修设计模式-设计原则

设计原则是软件编码时所遵循的规则,旨在帮助开发者创建出既满足功能需求又易于维护、可扩展且美观的设计,理解设计原则可以提升代码质量、减少错误以及促进团队协作,但对设计原则的理解要灵活,不要拿原则当真理,生搬硬套会适得其反。

2024-09-19 20:16:02 1305

原创 重修设计模式-结构型-门面模式

门面模式(Facade Pattern),也称作外观模式,主要用于为复杂的子系统提供一个统一的、更简洁的接口,使得子系统更加容易使用,并减少系统的相互依赖,提高系统的灵活性和可维护性。

2024-09-18 18:26:12 1165

原创 重修设计模式-结构型-适配器模式

适配器模式(Adapter Pattern)允许将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。简单来说,适配器解决的就是接口不兼容问题,引入适配器充当中间桥梁,从而让不兼容接口协同工作。

2024-09-18 10:38:57 1337

原创 重修设计模式-结构型-装饰器模式

装饰器模式(Decorator Pattern)允许在不修改原有类代码的情况下,通过创建一系列包装类来给对象动态地添加一些额外的功能,且增强的功能支持相互叠加。装饰器模式将“组合优于继承”的思想体现的淋漓尽致,当原始类需要增加额外功能时,相比直接生成子类的实现方式,这种模式更为灵活。

2024-09-13 19:08:35 962

原创 重修设计模式-结构型-桥接模式

举个例子,应用性能监控的告警系统:根据告警规则,触发不同级别的消息通知,如SEVERE(严重)、URGENCY(紧急)、NORMAL(普通)。可见 notify 方法中每个分支中的代码逻辑都比较复杂,发送通知的所有逻辑都扎堆在 NotificationOld 类中,如果新增消息级别和通知渠道,则又要改动分支代码,可能影响原有逻辑,也不符合开闭原则。桥接模式(Bridge Pattern)的主要目的是解耦,创建一个抽象层来隔离接口与实现,让它们之间的依赖关系可以通过对象的组合来替代继承,从而达到解耦的目的。

2024-09-12 18:24:52 1115

原创 重修设计模式-结构型-代理模式

代理的实现有两种方式,一是实现同一接口,二是直接继承。代理又分为静态代理和动态代理,动态代理的动态指的是不需要提前创建代理类,只需要用面向切面的思想,单独考虑增强的逻辑即可,代理类会在运行时由系统动态创建。代理模式是一种非常有用的设计模式,通过引入代理对象来控制对目标对象的访问,可以在不修改目标对象的前提下增加额外的功能,提高系统的灵活性和可扩展性。

2024-09-11 13:03:15 1033

原创 重修设计模式-创建型-建造者模式

具体实现中,通常会定义一个 Builder 类,它拥有产品类的所有属性,并定义一系列链式调用的 set 方法,用于修改产品类属性,最后通过 build() 方法集中校验并创建产品类对象。如果不在意对象是否可变和短暂无效状态,set 方式也是可以使用的,毕竟 Builder 中的重复代码和建造者对象也会造成一些损耗,具体还是要视需求复杂程度而定,在软件编码原则和需求契合度之间做折中。允许用户通过链式调用方法来逐步构建复杂对象,让复杂对象的构建与它的表示分离,即对象的表示和对象的构造过程解耦。

2024-09-09 17:59:12 1153

原创 重修设计模式-创建型-工厂模式

抽象工厂模式使用抽象的接口来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。这种方式主要用于创建一组相互依赖或关联的对象,而不需要指定它们具体的类。//抽象工厂//大文件解析器//再这里创建不同维度的产品类//小文件解析器//..省略//..省略//..省略//可根据具体业务,通过抽象工厂创建不同的产品类,无须关心实现类抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

2024-09-06 18:52:07 1290

原创 详解线程安全机制—CAS

从思想上来说,synchorized 属于悲观锁,悲观的认为程序中的并发多,所以严防死守,CAS机制属于乐观锁,乐观的认为程序中并发少,所以线程不断的去尝试更新。

2024-09-05 12:13:32 824

原创 重修设计模式-创建型-单例模式

比如线程A通过了第一次检测,此时切换到线程B,由于 sInstance 还没被赋值,线程B也通过了第一次检测,此时无论哪个线程进入加锁代码,另一个线程都会等待锁释放后再进入加锁代码,这时就会导致重复初始化。单例的主要使用场景有两个,一是使用单例控制全局的资源访问,也就是用单例封装一些工具类,比如日志写入工具;这里用 Java 举例,会将实例初始化过程使用 synchronized 锁住,但加锁是非常损耗性能的操作,所以非常不推荐这样去写,更常见的写法应该是下面的双重检测。

2024-08-21 19:09:01 1095

原创 重修设计模式-创建型-原型模式

利用已有对象来创建新对象的方式,就叫做原型模式。原型模式的核心是对象的拷贝,对象拷贝又分为浅拷贝和深拷贝,其中浅拷贝会共用引用类型对象,而深拷贝会创建新的引用对象。

2024-08-13 14:08:35 775

原创 重修设计模式-行为型-状态模式

状态机三要素:状态(State)、事件(Event)、动作(Action),事件驱动状态的流转,并触发动作的执行。实现状态及三种方式:分支判断法:优点:实现简单,适合状态较少的简单场景。缺点:大量 if-else 或 switch-case 代码,可读性和可扩展性差,不适合复杂逻辑。查表法:优点:代码中只需维护好状态流转表即可,代码比较直观,适合状态较多,且增加频繁的场景。

2024-08-12 13:47:10 933

原创 Android Studio新版UI常用设置

新版UI固然好看,但启用后一些常用的功能也被初始化了,下面会说明如何设置一些常用的功能。

2024-08-07 17:36:43 1365

原创 Mac快速配置ADB环境变量

ADB是进行 Androd 开发时很常用的调试工具,Android SDK 中就包含了该工具,所以如果安装了SDK那只需要在环境变量中配置 Android SDK 的路径即可,本文的环境配置也基于这种场景。

2024-08-07 16:28:34 1915 4

原创 解决:xxx.xxx/res/modules/.ds_store: error: the file name must end with .xml 问题

该问题是由于Android Studio校验到布局文件中存在不以.xml后缀名结尾的文件,这个文件就是.DS_store,它是Mac上系统自动创造的隐藏文件,把该文件删除就可以了。

2024-07-30 19:56:16 443

原创 分享一种 ConstraintLayout 让TextView 自适应的同时,还不超出限制范围的方式

不知道大家有没有遇到这种布局需求:上图布局很简单,ImageView + 中间的TextView + View + ImageView,需求是中间的 TextView 宽度需要根据内容来展示,但长度超出屏幕时,需要将 TextView 进行…的折叠展示,同时它后面的 View 和 ImageView 不能被推出屏幕。当TextView 超长时:这种需求看起来简单,但暗藏玄机。这种需求下,常规方案是达不到效果的。

2022-12-14 17:52:05 3949 2

原创 Android项目网络请求支持Brotli压缩记录

Brotli Google 官方库Brotli 是 Google 推出的一种无损压缩算法,通过变种的LZ77算法、Huffman编码以及二阶文本建模等方式进行数据压缩,与其他压缩算法相比(如zip,gzip等),无论是压缩时间,还是压缩体积上看,它都有着更高的效率。Brotli 如此高的压缩比率,得益于其使用一个预定义的字典,该字典包含超过 13000 个来自文本和 HTML 文档的大型语料库的常用字符串,预定义的算法可以提升较小文件的压缩密度,而压缩与解压缩速度则大致不变。...

2022-08-03 11:01:24 2405 4

原创 Mac版JDK环境配置及Java多版本切换

Mac版JDK环境配置及Java多版本切换一、下载JDK包JDK 各版本可通过 ORACLE 官网下载 ,下载较慢,可以百度搜索 Java Development Kit Mac 找下国内资源 传送门。选择.dmg 文件,安装,一路 next 即可。安装之后窗口就消失了,好像什么都没发生过…那么 Jdk 安装到哪了?我们来找一下:首先打开终端:command + 空格,输入**terminal**,选中 终端 并回车)终端输入命令:移动到根目录:cd /访达中打开(访达类似

2022-02-18 18:22:11 8610 4

原创 记一次WebView加载带定位网址导致的闪烁bug

描述项目中封装好的 WebView 页面,在传入一个饿了么链接后(其他链接正常展示,如:https://www.baidu.com),无法正常展示并且开始疯狂闪烁,在 shouldOverrideUrlLoading 打印了下重定向的 url ,发现有两个 url 地址在循环跳转,也就是:问题链接 -> 链接1 -> 链接2 -> 链接1 -> …,使用微信和QQ都正常展示,问题排查范围可以锁定在WebView的使用上了。问题链接:https://s.click.ele.me/

2022-02-15 20:10:03 1858

原创 使用android.os.Build来查看设备的信息

使用 android.os.Build 来查看设备信息 //看一下设备信息 private fun printDeviceInfo() { val deviceInfo = arrayOf( "产品:${android.os.Build.PRODUCT}", "制造商:${android.os.Build.MANUFACTURER}", "型号:${android.os.Build.MODEL}",

2021-04-10 13:54:35 2536

原创 Charles抓包指南(Mac电脑 + Android手机)

背景Charles功能强大,不仅可以用来抓包,还可以进行断点、map、rewrite等操作, 适用多种场景。我之前虽然也也用过Charles进行过抓包,不过一年半载后就忘记怎么操作了,这几天去网上翻文章,重新捋流程,踩了一些坑,浪费一堆事件才重新掌握最基础的抓包操作(时间已溜走,只剩两行泪)。为了防止以后再忘,记录一下Charles抓http/https包的设置方式。工具Charles正版下载地址:https://www.charlesproxy.com/貌似收费,不过网上资源无限…抓Http包

2021-02-05 17:30:42 5058 4

原创 驾考——科一,三笔记

这里写自定义目录标题科一考试考点1. 高速公路2. 车辆故障停车3. 驾驶机动车不能有下列行为4. 交通肇事致一人以上重伤,并有如下行为者,构成***交通肇事罪***:5. 酒驾标准:6. 假一,吊二,撤三,醉五,逃终生7. 注销机动车驾驶证情况8. 驾驶证审验内容:9. 没有交通灯的交叉路口10. 危险驾驶罪11. 左右转向灯12. 不能停车情况13. 扣留处罚14. C1驾照还可驾驶车辆15. 高速车道16. 不超过30公里时速的14. 扣分标准15. 罚款标准其他科一考试考点1. 高速公路高

2020-07-06 12:13:12 1028

原创 Android 7.0拍照FileProvider与xml文件对应关系(Failed to find configured root that contains)

从Android 7.0禁止了在应用外部公开file://URL,如果一项包含文件的URI的intent离开应用,则会抛出FileUriExposeException异常。要在应用间共享数据,在7.0及以上系统上要使用FileProviert类授予content:// URI临时访问权限。这一改动,主要影响了应用的拍照后照片存储路径的功能。要使用FileProviert,要在AndroidManifest.xml清单文件中注册内容提供者,并指向xml下的一个路径,这个路径与拍照时照片存储位置要保持一致,

2020-05-30 12:44:54 466

Brotli网络压缩Android支持

用于支持Android平台Brotli压缩实现,达到优化网络请求的目的。 同时将Brotli压缩逻辑封装成Okhttp的拦截器,使用时只需将该拦截器添加到项目中即可。

2022-08-03

apk反编译必备工具包(macOS平台)

apk文件反编译必备工具包,包括反编译apk的apktool,将dex转jar文件的dex2jar,以及查看jar源码的gui工具

2020-12-29

apk反编译工具.zip

windows版apk反编译工具下载,截止到2021.01.11时最新版本,包括apktool.jar,apktool.bat,dex2jar,jd-GUI

2021-01-11

最新maxOS平台反编译工具apktool v2.5.0

https://ibotpeaches.github.io/Apktool/install/ 最新的maxOS平台反编译工具apktool v2.5.0

2020-12-29

AndroidOpenGLDemo.zip

OpenGL ES 2.0开发Demo源码,包括图形绘制、图片处理(黑白、模糊、色调调整等)、图形变换、相机美颜、压缩纹理动画、FBO使用、EGL后台处理、3DOBJ模型、OBJ+MTL模型加载、VR效果、颜色混合和光照等都有代码实现

2020-01-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除