- 博客(125)
- 资源 (2)
- 问答 (27)
- 收藏
- 关注
原创 从「一刀切」到「精装修」:图解Android权限演进史,你的应用跟上了吗?
从安装时的全盘托出,到运行时的小心翼翼,再到今天的精细化管控,Android权限的演变是一部用户隐私的「觉醒史」,也是开发者适配的「奋斗史」https://via.placeholder.com/1200x600/0D47A1/FFFFFF?text=Android+Permission+Evolution+从安装时到运行时的革命作为一名Android开发者,你是否曾经历过这样的困境:应用在新系统发布后突然出现权限被拒的崩溃?用户投诉「为什么这个应用要这么多权限?」?面对、等新概念感到困惑?这一切都源于An
2025-12-01 15:35:45
425
原创 当遍历遇见树形结构:深入理解迭代器模式与组合模式
特性迭代器模式组合模式意图解耦遍历逻辑,提供统一的遍历接口。统一处理层次结构,让客户一致对待个体和组合。关注点行为(如何访问元素)结构(如何组织元素)关键比喻万能遥控器文件系统(文件/文件夹)关系最佳搭档。组合模式构建的复杂结构,正需要迭代器模式来提供优雅的遍历能力。总而言之,迭代器模式和组合模式并非同一种模式,它们各有专攻。迭代器模式专注于“如何遍历”,而组合模式专注于“如何构建树形结构”。
2025-11-09 20:25:51
893
原创 模板方法模式:优雅地封装算法骨架
模板方法模式通过"好莱坞原则"(不要调用我们,我们会调用你)实现了:代码复用 - 将通用算法逻辑提升到父类流程控制 - 确保算法执行顺序一致性扩展灵活 - 通过钩子方法支持未来扩展维护简单 - 修改算法只需修改父类适用场景:Android Activity/Fragment 基类设计业务流程处理器(支付、订单、审批等)框架和库的设计任何有固定流程但不同实现的场景模板方法模式是构建可维护、可扩展系统的利器。
2025-10-30 11:14:12
292
原创 外观模式:复杂系统的统一入口
外观模式(Facade Pattern)是一种结构型设计模式,它为复杂的子系统提供一个统一的简化接口。这个模式遵循"最少知识原则",让客户端只需要与一个高层接口交互,而不需要了解底层系统的复杂性。就像现实世界中的酒店前台:客人不需要直接与客房服务、餐厅、保洁等多个部门打交道,只需要通过前台就能获得所有服务。// 灯光子系统println("💡 $light 灯光已打开")println("💡 $light 灯光已关闭")println("💡 $light 灯光调至 $level%")
2025-10-29 13:48:22
304
原创 适配器模式:让不兼容的接口协同工作
适配器模式(Adapter Pattern)是一种结构型设计模式,它充当两个不兼容接口之间的桥梁,将一个类的接口转换成客户端期望的另一个接口。就像现实世界中的电源适配器一样,它让美规插头能在中国的插座上使用。// 目标接口:我们期望的统一支付接口= null,适配器模式是解决接口不兼容问题的利器,它就像软件世界中的"万能转接头"。通过本文的支付系统案例,我们可以看到适配器模式在实际项目中的强大作用:🎯 统一接口:将不同的支付SDK统一成一致的接口🔄 灵活扩展:新增支付方式只需添加新的适配器。
2025-10-29 13:31:55
461
原创 Kotlin 协程中常见的异步返回与控制方式(速览)
简介:协程里“返回/发送/控制异步结果”的手段很多,按用途可分为:启动与获取结果、超时与取消、流/多值、通道/生产者-消费者、选择(select)、回调桥接、同步/并发原语、异常与结构化并发、组合操作等。下面按类别列出关键点与示例。
2025-10-23 22:48:36
962
原创 解耦的艺术:深入理解设计模式之命令模式
命令模式通过将请求封装成对象,实现了请求发送者与接收者的解耦,让软件设计更加灵活和可扩展。它就像是在请求的发送者和接收者之间架起了一座桥梁,让信息可以更加优雅地传递。核心价值:✅ 解耦:发送者与接收者分离✅ 灵活:容易扩展新命令✅ 强大:支持撤销、队列、日志等高级功能✅ 复用:命令对象可以在不同场景下复用下次当你需要设计一个灵活的操作系统时,记得考虑命令模式——它能让你的代码像智能遥控器一样强大而优雅!
2025-10-20 18:30:38
853
原创 工厂模式与抽象工厂:依赖倒置原则的优雅实践
在深入具体模式之前,我们先快速回顾一下依赖倒置原则的核心思想:依赖倒置原则指出:高层模块不应该依赖于低层模块,两者都应该依赖于抽象抽象不应该依赖于细节,细节应该依赖于抽象这个原则的"倒置"体现在:传统的自顶向下的依赖关系被"倒置"了,现在双方都依赖于一个稳定的抽象层。
2025-10-18 13:28:06
366
原创 装饰者模式:解决继承爆炸问题的优雅方案
kotlin复制装饰者模式完美解决了通过继承扩展功能时出现的类爆炸问题。它通过:组合替代继承:用"层层包装"代替复杂的继承体系动态功能添加:运行时灵活组合功能,而非编译时固化卓越的可扩展性:添加新功能不影响现有代码遵守设计原则:符合开闭原则、单一职责原则就像用有限的乐高积木块搭建无限组合的模型一样,装饰者模式让我们用有限的装饰器类,通过不同的组合方式,创造出丰富的功能变化,彻底解决了继承带来的僵化和臃肿问题。
2025-10-16 21:34:47
834
原创 策略模式:让算法选择像点菜一样简单
策略模式(Strategy Pattern) 是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端。简单来说:定义策略家族,让客户端自由选择。kotlin复制策略模式是应对算法变化的利器,它通过"封装变化"让系统更灵活。记住策略模式的核心思想:找出代码中可能变化的部分,把它抽离出来,封装成可互换的策略。在实际项目中,当您发现复杂的条件判断或经常需要添加新的算法变体时,就是使用策略模式的最佳时机。
2025-10-16 20:41:10
1045
原创 Android 版本特性完全解析:从6.0到16.0的实用指南
:在法语中,如果用户是女性,需要说"Elle est satisfaite"(她满意),而男性则是"Il est satisfait"(他满意)。:新安装的银行App第一次启动时,会弹窗解释为什么需要通知权限(交易提醒、安全通知等),然后请求授权。:微信扫码支付时,只有当你点击"扫码"时才请求相机权限,而不是安装时就要求相机权限。:淘宝App中,订单物流通知会响铃提醒,而商品推荐通知只静默显示在通知栏。:微信保存图片到相册时,使用系统提供的保存接口,而不是直接往SD卡写文件。
2025-10-14 10:36:07
593
原创 Android开发中的Kotlin优雅实践:提升代码质量的常用技巧
在Android开发中,Kotlin语言为我们带来了更简洁、安全且表达力强的编程体验。本文将分享一些在实际开发中高频使用的Kotlin技巧和模式,帮助您编写更高质量的Android代码。
2025-10-13 14:50:59
215
原创 Kotlin 异步数据流三剑客:Flow、Channel、StateFlow 深度解析
Flow、Channel 和 StateFlow 是 Kotlin 协程生态中处理异步数据流的三个核心工具,各有其独特的定位和优势:Flow 是声明式的冷流,适合数据转换和一次性操作Channel 是协程间的通信管道,适合精确的事件传递StateFlow 是响应式的状态容器,专为 UI 状态管理设计理解它们的区别和适用场景,能够帮助我们在实际开发中做出更合理的技术选型,构建出更健壮、高效的异步应用。记住,没有绝对的"最好",只有最适合当前场景的选择。
2025-10-12 21:39:05
1271
原创 为什么我们需要将Flow转换为StateFlow?
在Kotlin协程架构中,将数据层的Flow转换为UI层的StateFlow是经过验证的最佳实践,它解决了:冷流在UI场景的固有缺陷 → 通过热流共享状态生命周期管理的复杂性 → ViewModel作为可靠宿主状态一致性挑战 → 单一数据源原则资源优化需求 → 避免重复执行决策树:复制需要UI状态管理吗?↓是 → 使用StateFlow↓数据源是Flow吗?↓是 → 在ViewModel中转换↓否 → 直接使用MutableStateFlow。
2025-10-12 21:37:24
768
原创 kotlin 常用函数
Kotlin 提供了多个作用域函数(Scope Functions),它们都是在对象的上下文中执行代码块的扩展函数。最常用的五个是:、、、和 。它们的主要区别在于:引用对象的方式(或 )返回值类型(返回上下文对象本身或返回 lambda 结果)下面是详细对比和使用场景:函数上下文对象引用返回值是否扩展函数典型使用场景letlambda 结果是非空检查、转换对象runlambda 结果是对象配置并计算结果withlambda 结果否对已有对象进行分组操作apply对象本身是对象初始化配置
2025-09-22 18:30:08
358
原创 Compose副作用域
Compose 中的副作用确实需要仔细管理,好在它提供了一系列副作用 API 来帮你安全、高效地处理这些场景。下面我将为你梳理这些副作用 API 的使用方法、适用场景以及一些最佳实践。onDispose。
2025-08-27 17:25:03
1000
原创 Kotlin 协程作用域
addLog("启动 supervisorScope 示例")log("supervisorScope 第一个协程完成")log("supervisorScope 第二个协程完成")log("coroutineScope 内部协程完成")log("supervisorScope 第一个协程")log("supervisorScope 第二个协程")log("coroutineScope 内部的协程")log("runBlocking 内部协程完成")log("runBlocking 内部的协程")
2025-08-27 15:06:59
755
转载 安卓各版本大变化(Android 6.0到10.0),兼容适配
Android 5.0Material DesignART虚拟机Android 6.0应用权限管理官方指纹支持Doze电量管理运行时权限机制->需要动态申请权限Android 7.0多窗口模式支持Java 8语言平台需要使用FileProvider访问照片安装apk需要兼容Android 8.0通知画中画自动填充后台限制自适应桌面图标->...
2020-04-12 11:08:41
3298
转载 Handler.postDelayed()工作原理
转载:https://blog.youkuaiyun.com/qingtiantianqing/article/details/72783952原文:使用handler发送消息时有两种方式,post(Runnable r)和post(Runnable r, long delayMillis)都是将指定Runnable(包装成PostMessage)加入到MessageQueue中,然后Looper不断...
2020-04-01 20:26:44
989
原创 Rxjava源码-------线程切换
目的:1.理清楚线程切换的流程2. subscribeOn()为什么调用多次只有第一次是有效的3. observeOn()可以多次使用在有了Rxjava订阅和map操作符的基础上,我们来分析subscribeOn()这个方法。subscribeOn这个方法也创建了一个被观察者,即ObservableSubscribeOn这个类,基于之前的基础之上自然而然能够找到显眼的一行...
2019-08-02 18:09:36
287
原创 Rxjava源码——map操作符
思路:一、ObservableCreate二、ObservableMap三、调用思路和源码逻辑四、生产环境代码五、画图总结ps:subscribe()是Observable中的的方法,因为ObservableCreate和ObservableMap都继承了Observable所以把该方法放到了这两个类中一、ObservableCreatepublic f...
2019-07-31 21:59:39
569
2
原创 Rxjava源码——订阅
看完订阅的源码发现Rxjava包装了被观察者对象,然后其它比较容易理解。1.创建被观察者Observable observable = Observable.create( new ObservableOnSubscribe<String>() { @Override ...
2019-07-30 15:36:06
208
原创 设计模式——责任链模式
职责链模式:使多个对象都有机会处理请求,从避免请求的发送者和接收者之间的耦合关系。将这对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 图片来自大话设计模式...
2019-07-18 14:21:05
165
原创 Android仿qq侧滑——上
16年那会写项目用到了仿qq测滑删除,那时候只是一顾的搬代码,这段时间在学习自定义View,把之前的代码梳理了一下,写了一个仿qq测滑的效果代码如下,注释写的很清楚了。接下来会升级一下在ItemView下放三个子Viewpackage com.monitor.atmosphere.slide;import android.content.Context;import andro...
2019-07-17 17:20:37
503
原创 Android内存泄漏排查
工具:MAT+Android Studio ProfilerProfiler主要负责捕获内存快照,MAT主要负责引用分析。一些直观的内存泄漏用Profiler就好,当然这个需要自己去定位内存泄漏代码。Profiler适合用于比较复杂的引用,不易推测出泄漏的地方,MAT能很好地展示引用链,帮助排查泄漏。使用方法:结合自己的应用来说,我在MainActivity中借助Profil...
2019-07-15 19:24:22
919
原创 自定义view-——随手指移动
自定义view可拖动的小圆点/** * Created by donghe on 2019/7/7. */public class MyView extends View { //定义画笔和初始位置 Paint p = new Paint(); public float currentX = 50; public float current...
2019-07-07 22:25:27
259
原创 LruCache初次了解
之前有看到过关于LruCache的面试题,今天趁空闲时间看一下LruCache原理,里面巧用了LinkedHashMap。参考了两篇文章:https://juejin.im/post/5a4b433b6fb9a0451705916fhttps://www.jianshu.com/p/b49a111147ee第一个是基于LinkedHashMap讲的,第二个是基于LruCache...
2019-06-28 11:46:27
361
转载 setimageresource oom
bugly报出的一个oom,当时看到很惊讶,使用setimageresource已经是家常便饭。结合项目来说,当大量频繁的需要使用setImageresource时可能会出现oom,如果在小二不频繁下一般是不会报oom的。查资料得到的信息:这篇博客的地址,可能这个兄弟也遇到过这个情况。https://blog.youkuaiyun.com/mouse12138/article/detail...
2019-06-27 17:10:46
535
转载 把本地文件传到github仓库
https://blog.youkuaiyun.com/qq_34858648/article/details/52421363http://www.cnblogs.com/wei-dong/p/9352821.htmlhttp://www.cnblogs.com/panlangen/p/7501585.html
2019-05-11 21:29:59
414
原创 构建者模式
如果你需要将一个复杂的对象构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们需要应用一个设计模式,“建造者模式” ...
2019-05-11 21:29:00
519
原创 观察者模式——1
在观察者模式中,需要有被观察的对象,观察者。当被观察的对象发生改变时会通知观察者做对应的改变。观察者模式定义了一种一对多的依赖关系,让多个观察者同时监听某一个主题对象。这个主题对象在发生改变时会通知所有观察者对象,使它们能够自动更新自己。 观...
2019-05-11 21:28:04
334
转载 React Naitve原理
一.React Native 框架分析RN_整体框架图.png层次架构: Java层:该层主要提供了Android的UI渲染器UIManager(将JavaScript映射成Android Widget)以及一些其他的功能组件(例如:Fresco、Okhttp)等,在java层均封装为Module,java层核心jar包是react-native.jar,封装了众多上层的inte...
2019-05-11 20:57:57
346
原创 SharedPreference了解
今天调试代码发现大量的sp操作耗用了近3秒时间,当然里面交叉了gson操作。所以下面我查看了有关SharedPreference的文章https://www.jianshu.com/p/63ee8587de3f这是一篇非常有深度的文章。引用这篇博客上面的代码 SharedPreferencesImpl(File file, int mode) { mFil...
2019-03-30 22:16:07
274
原创 Android性能优化
一、布局优化布局层级相同的情况下用Linearlayout而不用relativelayoutwrape_content 不调用ondraw()两次,有精确的尽量不要使用view_stub 特点是隐藏布局,内存占用为0二、内存优化bitmap 即时回收,缩小比例,使用软引用,android 分配bitmap为8M 文件流即时关闭,数据库操作即时关闭。内存泄漏:生命周期不一...
2019-03-27 08:24:00
260
原创 android UI适配
本次项目中用了autosize头条适配方案。这次顺带把UI适配原理总结一下。1.首先要明白一个公式:公式:dp值×(当前dpi/160dpi)=>得出当前的像素数目px :平常所说的1920×1080只是像素数量,也就是1920px×1080px,代表手机高度上有1920个像素点,宽度上有1080个像素点。dpi:要想判别手机屏幕的显示好坏,还要考虑屏幕的宽高(英寸),也...
2019-03-26 08:29:36
928
转载 android 混淆
混淆介绍Proguard是一个Java类文件压缩器、优化器、混淆器、预校验器。压缩环节会检测以及移除没有用到的类、字段、方法以及属性。优化环节会分析以及优化方法的字节码。混淆环节会用无意义的短变量去重命名类、变量、方法。这些步骤让代码更精简,更高效,也更难被逆向(破解)。混淆后默认会在工程目录app/build/outputs/mapping/release(debug)下生成一个mapp...
2019-03-20 17:27:02
200
Android recyclerview问题
2016-07-07
android客户端上传图片到服务器
2016-06-03
android 通过热点传输文件怎么实现。
2016-04-21
android音乐播放器设置音效
2016-04-18
android 关闭线程问题
2016-04-16
Virtuous TenStudio反编译不会使用请求指导。谢谢
2016-04-12
android扫面二维码安装软件
2016-02-21
极光推送api测试总返回1002..。
2015-09-03
js怎么验证选择中文件文件的大小
2015-08-28
js怎么实现多个图片的验证
2015-08-28
设置有背景图片的<div>块中怎么开发出一个白色的块?
2015-08-13
如何让一个<div>的背景图片完全填充这个<div> 谢谢。
2015-08-13
一个html页面中能有几个<script> </script> 谢谢!
2015-08-10
<input type="submit">按钮中字体大小怎么改变?
2015-07-29
html 中怎么设置多选框是关于图片的? 求解决!
2015-07-28
数据结构问题 求帮助 谢谢
2015-04-22
数据结构问题,求帮助,谢谢。
2015-04-11
单链表问题 求指教!
2015-03-30
顺序表 结构体 求指教
2015-03-22
C语言字符串问题 请指教
2015-03-22
顺序表的 问题 求指教!
2015-03-21
数据结构顺序表 求指教!
2015-03-20
求解释,一运行就弹出错误!
2015-02-05
请求帮忙,非常感谢关于 C语言中函数的!
2015-02-03
帮忙解决一下问题,是关于指针的。
2014-12-27
请大神指教二维数组,太感谢了!
2014-12-26
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅