
Android学习
文章平均质量分 73
学习
我也念过晚霞
何时想念——何时再见
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
274.Android镜像翻转效果实现详解
如上图,UI稿上标注了两张图,分别表示横向列表的首尾。左侧是“已经到第一张了”,右侧是“没有更多了”。这类视觉效果常见于横滑列表、Banner、相册、电子书等产品。正常做法是引入两张梯形图片作为背景实现。仔细观察,这两张梯形图片其实是基于y轴镜面对称的。那么,Android中怎么做镜面对称呢?Android镜像翻转效果实现详解。原创 2025-07-21 14:25:26 · 340 阅读 · 0 评论 -
273.JNI
JNI = Java Native Interface (Java本地接口)JNI = Java/Kotlin 与 C/C++ 之间的桥梁JNI就像一个"翻译官",让Java/Kotlin代码能够调用C/C++代码,也让C/C++代码能够调用Java/Kotlin代码!原创 2025-07-21 14:03:46 · 197 阅读 · 0 评论 -
272.ART虚拟机
ART虚拟机 = Android系统专门为移动设备优化的Java虚拟机ART就是Android手机上运行Java/Kotlin代码的"翻译官",它把你写的代码翻译成手机能理解的机器码!ART虚拟机核心优势:🚀 启动更快 - AOT预编译⚡ 运行更快 - 直接执行机器码🔋 更省电 - 减少CPU编译开销🧠 更智能 - JIT+AOT混合模式🛡️ 更稳定 - 严格的代码验证。原创 2025-07-21 11:54:31 · 396 阅读 · 0 评论 -
271.JVM内存模型
专门为JNI本地方法服务,在Android开发中经常遇到。原创 2025-07-21 11:24:04 · 810 阅读 · 0 评论 -
270.Dialog
Dialog(对话框)是 Android 用户界面设计中的一个重要组件,它是一个小窗口,提示用户做出决定或输入附加信息。从技术角度来说,Dialog 是一个浮动在当前 Activity 之上的窗口,它不会填满屏幕,通常用于模态事件,要求用户在继续进行之前采取行动。Dialog 的本质特征:模态性:Dialog 显示时会阻塞用户与底层界面的交互,直到 Dialog 被关闭临时性:Dialog 是临时显示的,用于处理特定的用户交互场景焦点获取:Dialog 会获取焦点,使其成为当前的交互界面层级关系。原创 2025-07-17 21:03:09 · 642 阅读 · 0 评论 -
269.有栈线程与无栈线程
有栈线程:重型武器,适合复杂计算无栈线程:轻型武器,适合高并发I/O。原创 2025-07-17 16:45:15 · 278 阅读 · 0 评论 -
268.ActivityManagerService
想象Android系统是一个大剧院,ActivityManagerService (AMS) 就是这个剧院的总导演。它负责安排演员(Activity)什么时候上台、什么时候下台,管理整个演出(应用)的生命周期,还要协调各个演出之间的关系。ActivityManagerService 是 Android 系统的核心服务之一,负责管理应用进程、Activity 生命周期、任务栈、内存管理等系统级功能。原创 2025-07-17 16:23:33 · 339 阅读 · 0 评论 -
267.ViewStub
想象你的房子里有个储物间,平时门是关着的,里面什么都没有(不占用空间),只有当你真正需要使用时,才会把家具搬进去。ViewStub 就像这个储物间,它是一个"占位符",平时不显示任何内容,只有在需要时才会加载真正的布局。ViewStub 是一个轻量级的不可见视图,用于在运行时延迟加载布局,可以提高应用的启动性能和内存使用效率。-- 正常显示的内容 --><TextViewandroid:text="这是主要内容" />-- ViewStub 占位符 --><ViewStub。原创 2025-07-17 11:40:52 · 606 阅读 · 0 评论 -
266.inflate
想象你有一张建筑图纸(XML布局文件),而inflate就是按照这张图纸盖房子的过程。它把 XML 文件"充气"成真正可以看到和操作的 View 对象。Inflate 是 Android 中将 XML 布局文件转换为 View 对象的过程,让静态的 XML 描述变成动态的界面组件。// 创建对话框视图:使用 LayoutInflater 将 custom_dialog 布局文件解析成 View 对象// 使用 AlertDialog.Builder 创建对话框。原创 2025-07-17 10:39:12 · 1007 阅读 · 0 评论 -
265.启动优化
启动优化就像是让你的应用更快地"醒来"。没优化:用户点击图标 → 等待3秒 → 看到白屏 → 再等2秒 → 看到界面 ❌已优化:用户点击图标 → 立即看到启动页 → 1秒后看到界面 ✅。原创 2025-07-15 11:59:34 · 274 阅读 · 0 评论 -
265.RecyclerViewPool 共享机制
RecyclerViewPool内部维护了一个SparseArray,每个ViewType对应一个ViewHolder列表。当RecyclerView需要ViewHolder时,先从池子里找,找不到再创建新的。用完后放回池子供其他RecyclerView使用。当一个RecyclerView不需要某个ViewHolder时,放回池子;其他RecyclerView需要时,直接从池子拿。,专门存放不用的ViewHolder,供多个RecyclerView共同使用。RecyclerViewPool就像是一个。原创 2025-07-14 21:25:12 · 333 阅读 · 0 评论 -
264.Coil内存缓存-详细教学
Coil的内存缓存就像是一个图片保险箱,把已经加载过的图片暂时放在手机内存里。当下次需要同一张图片时,直接从内存拿,不用重新下载或解码。简单类比没有缓存:每次看照片都要重新冲洗 📸 → 💾 → 🖼️有了缓存:照片洗好放在桌上,直接拿 🖼️ ✅。原创 2025-07-14 20:24:12 · 423 阅读 · 0 评论 -
263.HTTP预热
HTTP预热就像是提前热车一样的概念。建立TCP连接进行SSL握手(如果是HTTPS)DNS解析初始化各种网络组件这些步骤会让第一次请求变得很慢。HTTP预热就是提前做好这些准备工作,让真正的业务请求更快。想象一个审批流程员工请假申请 → 组长审批 → 部门经理审批 → 总监审批每个人都有自己的职责范围,超出范围就传给下一个人。原创 2025-07-14 19:32:11 · 302 阅读 · 0 评论 -
262.RecyclerView 缓存复用机制详解
RecyclerView 是 Android 中用于显示大量数据的高性能列表组件,其核心优势在于强大的缓存复用机制。这套机制通过四级缓存策略,最大化地复用 ViewHolder 对象,避免频繁的视图创建和销毁,从而实现流畅的滚动体验。向上滑动第1条消息"早上好"移出屏幕这个ViewHolder被收到"回收站"继续滑动需要显示第20条消息"晚安"从"回收站"拿出一个ViewHolder清空状态擦掉ViewHolder上的"第1条消息"标签但屏幕上可能还显示着"早上好"重新绑定。原创 2025-07-14 17:45:14 · 1066 阅读 · 0 评论 -
UI问题处理汇总 (Android)
是 Android 框架提供的一个类,代表你的应用所有“资源文件”的集合。比如:字符串、图片、布局文件、颜色、尺寸等都属于资源(res目录下的文件)。(Resources)的一个方法。是 Android 中用于。是 Android 中。原创 2025-07-14 14:59:48 · 404 阅读 · 0 评论 -
261.PopupWindow
是Android提供的一个轻量级浮动窗口组件,它可以在当前Activity的界面上显示一个临时的视图内容。与Dialog相比,PopupWindow更加灵活且占用资源更少。是Android开发中一个功能强大且灵活的UI组件,特别适用于需要精确位置控制和轻量级显示的场景。- 能够创建和配置各种类型的PopupWindow。- 理解PopupWindow的特点和适用场景。- 根据具体需求选择最适合的UI组件。PopupWindow本质上是通过。- 了解内存泄漏防范和兼容性处理。原创 2025-07-08 20:48:03 · 452 阅读 · 0 评论 -
260.SparseArray
SparseArray 是 Android 平台专门为 int->Object 映射设计的高效数据结构,能有效节省内存,常用于 Android 开发中替代 HashMap<Integer, Object>,尤其在内存敏感和数据量不大的场景下表现更优。原创 2025-06-27 15:16:01 · 305 阅读 · 0 评论 -
259. ArrayList详解
每次我们往 ArrayList 里加元素,其实就是往这个数组里加。如果数组满了,ArrayList 会自动扩容,扩容的策略是原来容量的1.5倍,比如原来容量是10,加到第11个的时候,容量就会变成15。扩容的时候,底层是用 Arrays.copyOf 这个方法,先新建一个更大的数组,再把原有的数据复制过去,然后把 elementData 指向新的数组。所以总结一下,ArrayList底层就是数组,扩容是按1.5倍来扩,扩容的时候会拷贝数组,扩容比较消耗性能,建议有大数据量的时候提前指定容量大小。原创 2025-06-27 14:52:08 · 597 阅读 · 0 评论 -
258.线程池复用的底层原理和实现 (基本)
线程复用初始执行 firstTask。然后不断通过 getTask() 从队列中获取任务,完成后继续等待新任务。这样可以避免线程频繁创建和销毁,达到复用线程的目的。阻塞机制:调用实现了任务队列的阻塞获取,确保当没有任务时,线程会进入阻塞状态,节省资源;一旦任务到达,线程立即唤醒执行任务。这种设计使得 ThreadPoolExecutor 中的 Worker 线程能够高效地执行任务,同时保持较少的线程创建或销毁操作,是提高线程池性能的一大关键。线程池本质。原创 2025-06-27 14:24:15 · 623 阅读 · 0 评论 -
257.多线程 基本介绍
线程安全是指多个线程同时访问同一个资源时,程序不会出现数据不一致或执行异常。使用同步机制(synchronized、Lock)使用原子类(AtomicInteger 等)用 Handler 把共享数据的操作切换到同一线程采用线程安全的数据结构(如 ConcurrentHashMap)避免多线程同时读写同一变量。原创 2025-06-26 19:35:58 · 653 阅读 · 0 评论 -
256.reified
reified。原创 2025-06-26 17:20:21 · 945 阅读 · 0 评论 -
255.Kotlin的懒加载机制 (by lazy)
value。原创 2025-06-26 14:55:10 · 860 阅读 · 0 评论 -
259.Movie APP (compose)
【代码】259.Movie APP (compose)原创 2025-05-11 11:11:11 · 183 阅读 · 0 评论 -
258.Travel App (Java)
【代码】258.Travel App (Java)原创 2025-05-07 15:59:28 · 161 阅读 · 0 评论 -
257.动态代理
与静态代理不同,静态代理需要手动为每个目标写出代理类,而动态代理通过反射机制在运行时生成代理类,这样可以更加灵活、通用,并且极大地降低了代码的重复量。简单来说,代理对象是客户端和目标对象之间的中介,通过代理对象,客户端调用目标对象的方法。在 invoke() 方法中,可以通过 Method.getAnnotation() 方法判断被调用的方法是否标记了 @Log 注解,如果标记了则进行日志记录,否则直接调用真实方法。这个类中,我们会在调用真实对象方法之前输出“调用前”日志,调用后输出“调用后”日志。原创 2025-04-28 09:28:22 · 639 阅读 · 0 评论 -
256.Doze 模式
WorkManager 会自动调整任务时间,但如果任务延迟过久可能会影响用户体验。────────────────────────────── 4. 在 Kotlin 中如何处理 Doze 模式。────────────────────────────── 3. 开发者在 Doze 模式下需要注意的点。────────────────────────────── 6. Doze 模式常见问题与调试建议。────────────────────────────── 2. Doze 模式的工作原理。原创 2025-04-27 20:23:44 · 623 阅读 · 0 评论 -
255.SDK (SDK开发)
SDK(Software Development Kit)是一套供其他开发者调用的库或工具集合,在 Android 平台上开发 SDK 意味着将某种功能或通用模块(如日志、统计、支付、网络请求、图片加载等)封装成一个库,然后发布给其他项目使用。使用者在项目中引用 SDK 后,只需要调用 MyLog.init() 来初始化,然后在需要的位置直接调用 MyLog.d()/MyLog.e() 等函数。这样,当你运行示例应用后,可以在 Logcat 中看到你的 SDK 输出的信息,并验证日志格式是否符合预期。原创 2025-04-27 20:08:59 · 933 阅读 · 0 评论 -
254.Window
────────────────────────────── 【一、Window 的基本概念】在 Android 中,Window 代表了屏幕上一个可视区域,它是 View 层次结构与系统交互的桥梁。Window 包含了应用程序展示 UI 的一切内容,并由 WindowManager 管理。Window 本质上是一个抽象的概念,在 Activity、Dialog、Toast 等多个组件中都有涉及。常见的 Window 类型有:理解 Window 机制有助于我们在自定义界面、添加全局浮动窗口以及定制动画效果时原创 2025-04-20 15:06:13 · 663 阅读 · 0 评论 -
253.TLS
总结一下,TLS 就是一套在不可靠网络(Internet)之上建立“可信通道”的协议,核心在握手阶段协商加密参数并交换密钥,随后所有数据都通过对称加密和消息认证保护。在 TCP 的三次握手过程中,所有的包(包括初始握手的 SYN 和 ACK 包)都是以明文形式传输的,攻击者可以轻松拦截并读取这些数据。1)记录层(Record Layer):负责把上层的应用数据(比如 HTTP 报文)分片、压缩、加密,然后打包到 TCP。TLS 握手过程(以 TLS 1.2 为例,TLS 1.3 略有简化)原创 2025-04-17 11:22:20 · 518 阅读 · 0 评论 -
252.动态代理
动态代理的核心在于运行期生成一个新的类,该类实现了目标接口,并拦截目标对象的方法调用,将方法调用信息传递给InvocationHandler。本文旨在详细讲解Kotlin中的动态代理机制,帮助Android开发者理解其基本概念、动态代理的实现原理以及在实际项目中的使用方式,同时通过完整示例,从头到尾展示如何在Kotlin项目中使用动态代理。实现方式类似于本文中的示例,我们只需提供一个统一的InvocationHandler,并通过代理工厂创建代理对象,将原有业务逻辑传入,便可实现功能复用。原创 2025-04-13 16:03:02 · 860 阅读 · 0 评论 -
251.AIDL
当你的应用需要和运行在不同进程中的组件进行通信时,就需要使用 AIDL。客户端通过 bindService() 方法绑定 Service,通过 IMyAidlInterface.Stub.asInterface() 方法获取接口对象,然后调用方法执行操作。创建一个 .aidl 文件,定义接口及方法。实现 AIDL 接口并在 Service 的 onBind() 方法中返回生成的 Binder 对象,供客户端绑定后调用。────────────────────────────── ■ AIDL 概念和用法。原创 2025-04-08 15:13:26 · 402 阅读 · 0 评论 -
250.TouchDelegate
TouchDelegate 本质上是一个委托机制,它允许将父 View 的指定区域内的触摸事件转发给一个指定的子 View ,从而实现“扩展”该子 View 的触摸响应区域。这样,在父容器分发触摸事件时,会优先检测扩展区域内的触摸点,并将事件转发给目标 View 处理。首先,我们要确定需要扩展触摸区域的目标 View 及其父容器。在一些自定义控件中,可能需要根据不同区域响应不同的触摸事件,或者在组件周边预留容错范围,这时可以利用 TouchDelegate 将某个区域的事件集中交给特定的 View 处理。原创 2025-04-05 10:28:00 · 941 阅读 · 0 评论 -
249.侧边索引
当用户在侧边索引上点击或拖动时,对应的字母会作为回调参数传递至 MainActivity,在 MainActivity 中我们通过提前计算好的 Map(letterPosMap)来决定 RecyclerView 应该滚动的位置,并调用 scrollToPositionWithOffset() 方法实现精准定位。举例来说,如果列表项为联系人姓名,则首先提取每个联系人的首字母,然后根据字母排序。此外,还可以在界面中显示一个浮动提示(Toast 或自定义的悬浮 View),显示当前选中的字母,以增强用户体验。原创 2025-04-01 16:40:25 · 891 阅读 · 0 评论 -
248.性能优化-卡顿优化-性能优化方案-CPU时间片被抢占-避免执行长时间的计算密集型任务
────────────────────────────── 【三、如何避免长时间计算密集型任务占用CPU时间片】────────────────────────────── 【四、在Android中的具体实践和建议】────────────────────────────── 【二、CPU时间片被抢占的机制解析】────────────────────────────── 【五、典型场景和如何应对】────────────────────────────── 【六、总结与展望】将长任务拆分成多个小任务。原创 2025-03-31 13:24:36 · 993 阅读 · 0 评论 -
247.性能优化-卡顿优化-性能优化方案-耗时操作过多-预加载数据
A1:预加载数据指的是在用户真正需要看到或操作数据之前,就提前在后台异步加载并缓存这些数据。预加载数据指的是在用户真正需要访问或展示数据之前,就提前启动后台任务加载这些数据,将数据缓存到内存或者存储介质中。预加载可以应用于各种场景,例如启动界面的加载、列表数据的提前加载、图片和视频的预缓存等。在实际项目中,数据预加载往往和MVVM架构、Repository模式结合使用,将数据加载和缓存操作封装在Repository中,而ViewModel仅负责供UI观察。如果预加载任务较多,要设计任务优先级。原创 2025-03-31 12:57:43 · 1049 阅读 · 0 评论 -
246.性能优化-卡顿优化--性能优化方案-耗时操作过多-耗时操作放入异步
在上述协程示例中,我们使用了lifecycleScope,这是Android组件(如Activity或Fragment)配合协程的一种安全方式,能够在组件销毁时自动取消协程任务。例如,处理大图像时,先在IO线程中加载和处理图片数据,再将处理好的图片加载到UI界面中。在这个例子中,我们用withContext将网络请求任务放入IO线程,等到任务完成后,再将结果返回到主线程。早期使用比较多的异步任务方案,虽然简化了操作,但是在复杂场景下不够灵活,而且API有一些限制,随着新方案的出现逐步被淘汰。原创 2025-03-31 09:05:27 · 922 阅读 · 0 评论 -
245.性能优化-卡顿优化-性能优化方案-布局层次过深-原因:inflate使用反射初始化布局-AsyncInflate异步加载布局资源
────────────────────────────── 【四、AsyncInflate 异步加载布局资源】────────────────────────────── 【三、inflate方法与反射调用分析】────────────────────────────── 【二、布局层次过深对性能的影响】────────────────────────────── 【五、实际项目中的优化策略】────────────────────────────── 【六、实战示例与代码解析】原创 2025-03-28 16:17:34 · 598 阅读 · 0 评论 -
244.性能优化-卡顿优化-性能优化方案-布局层次过深-原因:inflate使用反射初始化布局-应用高级布局,Merge标签
如果该布局文件原来使用 LinearLayout 包裹所有子视图,但你在 RecyclerView 的 Adapter 中已经使用了一个根布局容器,那么可以将子布局的根节点改为 <merge> 标签,这样,inflate 后直接将子视图插入到 RecyclerView 的容器中,减少了一层嵌套。如果布局十分复杂、元素数量众多,就会有更多的反射调用。• 当你需要复用一段布局,但在使用时外层已经有一个容器,可以将布局文件根节点替换为 <merge>,在调用 inflate() 时直接扁平化合并到父布局中。原创 2025-03-28 13:49:16 · 556 阅读 · 0 评论 -
243.性能优化-卡顿优化-性能指标监控-对FPS,Jank帧进行监控
【回答】: Jank帧或掉帧指的是某一帧的绘制时间超出预定限制(通常每帧的理想时间为16.67毫秒),导致下一帧无法及时绘制,从而产生卡顿现象。在整个过程中,监控系统必须尽量轻量以免对性能产生二次影响,而优化措施要经过严格测试,确保在提升流畅度的同时,整体应用的稳定性不会下降。当应用在渲染时,某一帧的渲染时间超过了预期时间(比如16.67毫秒,即60FPS的时间间隔),就有可能出现卡顿现象。例如,如果时间间隔为50ms,那么理论上应绘制3帧,但实际上只绘制了1帧,此时就有两帧掉失。原创 2025-03-28 13:09:25 · 596 阅读 · 0 评论 -
242.性能优化-HTML5-流量优化-HTML5-在本地使用缓存策略
作为Android学习者,我们可以利用Android系统本身的缓存机制、WebView缓存以及网络请求框架(如OkHttp)等手段,构建高性能的本地缓存方案。在Android平台上,WebView提供了缓存机制,主要通过两者的设置实现:一个是WebView本身的缓存开关及缓存路径配置,另一个是HTTP请求中借助Cache-Control头部管理缓存策略。在实际项目中,我们可以将网络请求返回的JSON数据解析成实体对象,然后存入Room数据库中,下次加载页面时直接从数据库中读取数据,从而达到离线访问的效果。原创 2025-03-28 11:08:42 · 513 阅读 · 0 评论