Android 项目开发笔记
文章平均质量分 51
在做 Android 开发过程中遇到的一些问题,记录下来
梁同学与Android
Android 领域优质创作者,专注于安卓原生开发,专注于 Scratch、Python、Scratch、C、C++ 青少年编程等级考试等。等级考试真题请见链接库:https://download.csdn.net/download/qq_43290288/88548582
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Android ---【Kotlin篇】Kotlin 协程中 StateFlow 与 SharedFlow 的网络状态对比与应用
Kotlin协程中StateFlow和SharedFlow的区别与应用 摘要:StateFlow和SharedFlow是Kotlin协程中两种常用的热流(Hot Flow)。SharedFlow作为通用的多播热流,适合事件通知类场景,可配置缓存策略;StateFlow是SharedFlow的特殊实现,专用于状态管理,具有初始值和自动去重特性。二者核心区别在于:StateFlow始终维护当前状态(replay=1),而SharedFlow可配置缓存大小;StateFlow必须指定初始值,SharedFlow则原创 2026-01-28 10:33:29 · 715 阅读 · 0 评论 -
Android ---【经验篇】ArrayList vs CopyOnWriteArrayList 核心区别,怎么选择?
ArrayList适用于单线程环境,追求高效读写;而CopyOnWriteArrayList则针对多线程场景,保证线程安全但写操作性能较低。两者的核心区别在于线程安全性:ArrayList非线程安全,多线程下会出现数据错乱或并发修改异常;CopyOnWriteArrayList通过写时复制机制实现线程安全,适合读多写少的场景。若写操作频繁,可选择Collections.synchronizedList或ConcurrentLinkedDeque。选型需根据实际场景权衡性能与安全需求。原创 2025-12-21 18:33:07 · 976 阅读 · 0 评论 -
Android ---【经验篇】阿里云 CentOS 服务器环境搭建 + SpringBoot项目部署(二)
本文详细介绍了SpringBoot项目部署到Linux服务器的完整流程。主要内容包括:1)通过Maven打包SpringBoot项目为jar包并上传到服务器;2)使用WinSCP工具上传SQL文件并导入MySQL数据库;3)使用nohup命令后台运行SpringBoot项目;4)查看项目日志的方法。此外还提供了Redis安装的扩展教程,包括下载安装、环境配置及启动方法。文章为开发者提供了从项目打包到服务器部署的一站式指导,包含常用命令和实用技巧,适合需要将SpringBoot项目上线Linux服务器的开发者原创 2025-12-21 16:58:37 · 1157 阅读 · 0 评论 -
Android ---【经验篇】阿里云 CentOS 服务器环境搭建 + SpringBoot项目部署(一)
文章目录一、购买好服务器之后要重置密码二、利用 putty 程序登录访问你的服务器三、配置安全组开放端口四、部署项目前期准备工作4.1 安装 Java4.2 安装 mysql4.3 安装 Tomcat 8.0五、部署 SpringBoot 项目5.1 打包 SpringBoot jar 包5.2 导入数据库文件,以.sql结尾的文件5.3 执行 SpringBoot Jar 包5.4 修改 Android 端端口号一、购买好服务器之后要重置密码我的服务器版本CentOS 8.0 64位重置密码有关文原创 2021-03-29 16:10:18 · 1009 阅读 · 2 评论 -
Android ---【经验篇】Fragment 生命周期高频面试题(附标准答案)
结合日常开发和面试场景,我为整理了 Fragment 生命周期相关的核心面试题,涵盖基础概念、场景分析、问题排查,适配微信公众号的阅读节奏和答题逻辑:标准答案:Fragment 生命周期从依附 Activity 到解除关联,核心分为 4 大阶段 + 12 个关键回调,核心阶段如下:创建阶段:onAttach(关联 Activity)→ onCreate(初始化非视图数据)→ onCreateView(加载布局)→ onViewCreated(初始化控件)→ onActivityCreated(确认 Act原创 2025-12-19 10:19:09 · 710 阅读 · 0 评论 -
Android ---【FrameWork入门】ATMS启动流程
Android 10引入的ActivityTaskManagerService(ATMS)是从AMS分离出来的新服务,负责管理Activity及其容器。ATMS的启动流程从SystemServer.main()开始,经过run()、startBootstrapServices()等步骤,通过SystemServiceManager的startService()方法反射创建ATMS.Lifecycle实例。在初始化过程中,ATMS会创建关键对象并注册服务,包括通过ServiceManager.addServi原创 2025-07-29 11:37:51 · 1302 阅读 · 0 评论 -
Android ---【FrameWork入门】View 的绘制流程,从开机到画面显示到屏幕上Android到底是怎么操作的?
本文分析了Android系统从开机到View绘制的完整流程:首先通过ActivityThread.handleResumeActivity()触发绘制,经由WindowManagerImpl调用WindowManagerGlobal.addView()创建ViewRootImpl;接着ViewRootImpl通过requestLayout()发起测绘请求,Choreographer在屏幕刷新时回调performTraversals()完成测量、布局和绘制三阶段;最后在performDraw()中通过draw原创 2025-07-17 09:25:49 · 708 阅读 · 0 评论 -
Android ---【FrameWork入门】WMS启动流程
WMS核心功能与启动流程 摘要:WindowManagerService(WMS)是Android系统中负责窗口管理的关键服务,主要职责包括:窗口管理(启动/添加/删除窗口、管理窗口布局)、窗口动画控制、输入事件中转和Surface分配。WMS启动流程由SystemServer发起,在system_server进程的不同线程中运行,涉及WindowManagerPolicy、InputManagerService等关键组件。初始化过程创建根窗口容器RootWindowContainer、窗口动画管理器Win原创 2025-07-29 10:09:44 · 1007 阅读 · 0 评论 -
Android ---【FrameWork入门】Product是什么?
源码路径:build/target/product/AndroidProducts.mkCOMMON_LUNCH_CHOICES就是lunch的列表实际lunch有好几十个,但上面只有4个选项啊?其实是在其他路径下还有这个配置文件,比如device/generic/x86_64/AndroidProducts.mk 也有配置,所以最终lunch列表就有很多。原创 2025-04-16 17:48:22 · 389 阅读 · 0 评论 -
Android ---【FrameWork入门】极速上手AOSP
2.VMware Workstation 下载。存储空间不低于500G,建议 1TB SSD。CPU不低于6核心,建议8核及以上。内存不低于32G,建议64G。2.修改repo自动更新镜像。3.初始化仓库并同步远程代码。网址如果失效可以联系我。这里最好不要小于20G。1.下载 repo工具。点击红框内的进行下载。原创 2025-04-16 16:50:21 · 595 阅读 · 0 评论 -
Android ---【FrameWork入门】SystemUI启动流程
一.SystemServer中的启动代码路径:frameworks/base/services/java/com/android/server/SystemServer.java二.SystemUI中的启动1.应用的启动肯定是初始化Application类代码路径:/code/app/src/com/android/systemui/SystemUIApplication.java主要为了注册开机广播,来获取开机完成的事件,用来作为启动各个服务的条件.2.SystemUIService的原创 2025-04-16 13:58:37 · 539 阅读 · 0 评论 -
Android ---【FrameWork入门】Activity/Window/DecorView/ViewRootImpl的创建时机以及View的绘制流程
【代码】Android --- Activity/Window/DecorView/ViewRootImpl的创建时机。原创 2023-12-01 16:38:06 · 1143 阅读 · 0 评论 -
Android ---【CPU优化】需要优化的原因及优化的地方
摘要 系统性能优化是提升应用体验的关键。高CPU占用会导致系统卡顿、后台任务延迟、电池耗电加快和设备发热等问题。优化措施包括:加强内存管理避免泄漏;降低动画帧率并使用属性动画;启用硬件加速利用GPU分担任务;简化视图层次结构,减少渲染负担。后续将提供更多实战案例,帮助开发者持续提升应用性能,优化用户体验。原创 2025-07-14 10:02:35 · 635 阅读 · 0 评论 -
Android ---【内存优化】常见的内存泄露以及解决方案
Android内存泄漏常见场景及解决方案:1.资源未关闭导致泄漏(BroadcastReceiver等),需在Activity销毁时及时关闭/注销;2.Context使用不当,应优先用Application Context;3.static修饰问题,如View被静态持有,可通过及时置null或使用WeakReference解决;4.Handler泄漏,建议使用静态内部类+弱引用,并在生命周期销毁时移除消息。这些措施可以有效避免内存泄漏问题。原创 2025-07-14 09:26:57 · 840 阅读 · 0 评论 -
Android ---【内存优化】Memory Analyzer(MAT)打开android eclipse Dump内存文件出现 Unknown HPROF Version解决办法
原因是: android的虚拟机导出的内存文件hprof文件格式与标准的 java hprof文件格式标准不一样,根本原因两者的虚拟机不一致导致的。参考:https://www.cnblogs.com/shuzui1985/archive/2013/03/01/3020963.html。只需要使用SDK中自带的转换工具转换就可以了。注意要在以下位置用命令行的方式输入。原创 2023-06-05 15:21:41 · 1737 阅读 · 0 评论 -
Android ---【内存优化】Handler 内存泄漏原因及解决方案
Handler造成内存泄露的原因。非静态内部类,或者匿名内部类。使得Handler默认持有外部类的引用。在Activity销毁时,由于Handler可能有未执行完/正在执行的Message。导致Handler持有Activity的引用。进而导致GC无法回收Activity。匿名内部类:非静态内部类:三、解决方法静态内部类+弱引用Activity销毁时,清空Handler中,未执行或正在执行的Callback以及Message。四、内部类为什么会持有外部类的引用这是因为内部类虽然和外部类写在同一个原创 2022-07-03 21:03:31 · 8207 阅读 · 2 评论 -
Android ---【内存优化】内存泄漏如果查不到具体泄漏的原因怎么处理?
解决方案:通过反射把SearchActiity中的mActivityResultRegistry砍掉,因为查不到具体原因,只能这么做。原创 2023-06-08 09:31:58 · 599 阅读 · 0 评论 -
Android ---【启动优化】闲置线程addIdleHandler的用法
Android --- 闲置线程addIdleHandler的用法原创 2025-06-19 15:40:04 · 190 阅读 · 0 评论 -
Android ---【性能优化】都有哪些情况会发生anr,怎么解决?
如果应用声明的服务无法在规定时间内完成Service.onCreate()和Service.onStartCommand()/Service.onBind()执行,或者Context.startForegroundService()在前台启动新服务但该服务在5秒内未调用startForeground(),则会发生ANR。Android发生ANR的情况主要包括输入调度超时、广播超时、服务超时等,解决ANR问题的方法包括避免在主线程进行耗时操作、导出ANR日志信息、分析系统资源信息、查看主线程状态等。原创 2024-09-02 15:49:24 · 983 阅读 · 0 评论 -
Android ---【耗时操作】Handler的用法,子线程中怎么切线程进行更新UI
Android --- Handler的用法,子线程中怎么切线程进行更新UI原创 2025-06-10 16:14:54 · 645 阅读 · 0 评论 -
Android ---【内存优化】强引用、软引用、弱引用和虚引用
Java提供了四种级别的应用类型:强引用、软引用、弱引用及虚引用。那么这四种引用类型分别有什么作用,又有什么区别呢?强引用是我们最常用的一种引用类型。当我们使用new关键字去新建一个对象的时候,创建的就是强引用。比如:强引用有如下特点:强引用与Android开发中的OOM异常OOM异常是Android开发过程中很常见的一种异常,下面来看一个例子:简单的解释一下上面这段代码:MyAsyncTask会跟随Activity的onCreate去创建并开始执行一个长时间的耗时任务,并在耗时任务完成后去更新Mai原创 2022-07-03 21:12:51 · 2212 阅读 · 0 评论 -
Android ---【经验篇】Thread 与 HandlerThread 的区别
Thread 与 HandlerThread 的区别原创 2025-06-19 16:22:36 · 496 阅读 · 0 评论 -
Android ---【案例篇】带你学习Widget,从Launcher加载各个应用的Widget到各个应用是怎么创建的Widget整个流程
Android Widget开发与加载流程摘要 Widget开发包含四个关键步骤:1) 在res/xml/定义配置信息,包括尺寸、更新频率等;2) 创建布局文件设计UI;3) 继承AppWidgetProvider实现逻辑处理类,管理生命周期和交互;4) 在Manifest中声明Widget组件。Launcher通过AppWidgetManager和AppWidgetHost框架加载Widget,首先初始化宿主环境,绑定ID并监听变化,然后获取系统Widget列表,最后通过RemoteViews机制跨进程渲原创 2025-09-02 11:41:11 · 1530 阅读 · 0 评论 -
Android ---【经验篇】EventBus 使用讲解,一篇就够!
本文介绍了使用EventBus实现Android组件间通信的完整流程。首先在build.gradle中添加EventBus依赖,然后定义事件类作为数据载体。接收方(如Activity)需要注册EventBus并实现带@Subscribe注解的订阅方法,同时要在生命周期结束时解除注册。发送方(如Fragment)通过post()方法发送事件对象。文中重点说明了ThreadMode线程模式的选择,并演示了点击Fragment按钮触发Activity更新UI的完整过程。整个流程包含:定义事件类→接收方注册→发送方原创 2025-12-09 11:45:17 · 367 阅读 · 0 评论 -
Android ---【经验篇】Bug调查经验记录
摘要 本文分析了PAG文件不显示的问题,指出常见原因是文件路径错误或配置问题。文章通过代码示例说明正确使用context.getAssets()加载资源的方法,并强调避免使用相对路径。最终发现问题根源是多渠道包配置错误,导致资源文件未正确打包。解决方案是修改构建配置,明确指定各渠道的资源路径,确保资源文件能正确加载。该案例展示了Android多渠道打包时资源路径配置的重要性。原创 2025-08-05 10:17:35 · 364 阅读 · 0 评论 -
Android ---【经验篇】adb shell setprop 和 adb shell settings put 案例讲解
Android --- adb shell setprop 是设置系统属性的adb shell settings put 也是设置系统属性的,有什么区别,在项目中体现。原创 2025-06-03 11:02:21 · 1539 阅读 · 0 评论 -
Android ---【经验篇】ObjectAnimator 和 TranslateAnimation有什么区别
ObjectAnimator和TranslateAnimation是Android两大动画类型。ObjectAnimator属于属性动画,支持修改任意对象属性(如位置、透明度、旋转等),动画效果持久且功能强大,适合复杂动画场景。TranslateAnimation属于视图动画,仅处理简单平移动画,不改变视图实际属性,动画结束后默认恢复原状,性能更高效但功能有限。ObjectAnimator适合多属性复杂动画,而TranslateAnimation仅推荐用于简单平移动画需求。两者主要区别在于功能范围、动画持久原创 2025-05-28 15:02:06 · 623 阅读 · 0 评论 -
Android ---【经验篇】CopyOnWriteArrayList 的使用场景及讲解
读操作不加锁:由于每次写操作都会创建一个新的数组,读操作可以在不加锁的情况下进行,因此对于读多写少的应用场景,CopyOnWriteArrayList 比其他线程安全集合(如 Vector 或 synchronizedList)效率更高。这意味着,所有的写操作都是不可变的,不会影响到正在执行的读操作,从而避免了线程竞争的问题。适用于读多写少的场景:由于写操作会复制数组,这会带来一定的性能开销,因此它非常适合读多写少的场景。需要线程安全的列表:在多线程环境下,使用它可以确保线程安全而不需要显式的同步。原创 2025-05-22 16:10:28 · 777 阅读 · 0 评论 -
Android ---【经验篇】View如何实现跟随手指滑动,scrollTo和scrollBy的区别
该代码片段展示了在Android开发中如何处理触摸事件以实现视图的滚动功能。通过重写onTouchEvent方法,代码捕捉了手指按下、移动和抬起的事件。在手指移动时,计算手指的位移(dx),并通过scrollBy(-dx, 0)实现视图的水平滚动,负号确保视图滚动方向与手指滑动方向相反,符合用户直觉。此外,代码还使用了Scroller类来实现平滑滚动效果,通过computeScroll方法持续更新视图位置,直到滚动结束。scrollTo和scrollBy的区别在于前者是绝对滚动到指定位置,后者是相对当前视图原创 2025-05-22 09:23:06 · 830 阅读 · 0 评论 -
Android ---【经验篇】在AIDL进程间通信中,为什么使用RemoteCallbackList 代替 ArrayList?
因为 ArrayList 不能自动移除无效的回调对象,因此服务 E 可能会试图与已经失效的进程通信,导致阻塞。如果你使用 ArrayList 存储跨进程的回调对象,当某个进程发生 binder dead(即进程崩溃或连接断开)时,ArrayList 无法自动移除失效的回调,这可能导致内存泄漏或者后续的通信失败。在进程间通信时,如果使用 ArrayList 存储 AIDL 回调对象,可能会导致一个进程崩溃后,ArrayList 中的其他元素(即其他连接到服务的客户端)也会受到影响,从而阻塞正常的通信。原创 2024-12-27 10:26:48 · 1587 阅读 · 0 评论 -
Android ---【经验篇】complieonly 和implement的区别
implementation:与compileOnly不同,implementation依赖的库不仅参与编译,还参与打包。这意味着,当项目依赖了一个implementation的库时,这个库不仅在编译时可用,而且在运行时也是必须的。这意味着,如果一个项目依赖了某个compileOnly的库,那么在编译时这个库是必须的,以确保代码能够成功编译。然而,在打包时,这个库不会被包含在内,因此,如果其他模块或工程没有显式地添加这个库作为依赖,那么在运行时就会出现问题,因为运行时找不到这个库。原创 2024-09-10 13:47:59 · 2151 阅读 · 0 评论 -
Android ---【基础篇】observer和observerForever的区别
也就是说,当 LifecycleOwner 不再处于活跃状态时(例如,Activity 被销毁),观察者会自动停止接收更新。使用 observeForever 时,观察者没有生命周期管理,需要手动处理添加和移除,适用于需要在所有情况下都接收更新的场景。用途: 注册一个观察者,不依赖于 LifecycleOwner,无论组件的生命周期状态如何,观察者都会持续接收数据变化。使用 observe 时,观察者与 LifecycleOwner 绑定,适用于需要自动管理生命周期的场景。原创 2024-09-03 15:04:52 · 1742 阅读 · 0 评论 -
Android ---【经验篇】解决LiveData数据倒灌的新思路
每次 setValue 的时候,就打开所有 Observer 的开关,表示可以接受分发。这种方式的优点是:改动小,不需要反射,也不需要用HashMap存储等,缺点是:有一定的侵入性,假如后面这个方法的访问权限修改或者包名变动,就无效了,但是我认为这种可能性是比较小,毕竟androidx库迭代了这么多版本,算是比较稳定了。updateData方法发送了一次数据,当下面调用LiveData的observe方法时,会立即打印==============第一次发送数据,这就是上面说的“数据倒灌”现象。原创 2024-09-02 12:43:21 · 689 阅读 · 0 评论 -
Android ---【基础篇】Fragment 提交的方法主要有以下几种
【代码】Android --- Fragment 提交的方法主要有以下几种。原创 2024-08-28 17:10:33 · 445 阅读 · 0 评论 -
Android ---【经验篇】livedata是粘性事件,什么叫粘性事件
在LiveData中,粘性事件的具体表现是,如果一个Activity(例如FirstActivity)发送了数据,然后用户导航到另一个Activity(例如SecondActivity),在SecondActivity中监听LiveData的变化,即使是在FirstActivity发送数据之后才注册监听LiveData的事件,也能收到之前的发射数据。这与常规的观察者模式有所不同,常规模式下,我们一般是先注册监听事件,然后才会有事件回调,并且注册事件是不考虑之前发生的逻辑的。原创 2024-08-27 14:49:05 · 847 阅读 · 0 评论 -
Android ---【经验篇】transaction.commitAllowingStateLoss();和transcation.commit 有什么区别
transaction.commit() 和 transaction.commitAllowingStateLoss() 是 Android FragmentManager 中用于提交 Fragment 事务的方法,它们之间的主要区别在于状态丢失的处理。总结一般情况下,推荐使用 commit() 来确保 Fragment 状态的一致性。只有在确定丢失状态不会对用户体验产生严重影响时,才使用 commitAllowingStateLoss()。原创 2024-08-27 12:30:46 · 1174 阅读 · 0 评论 -
Android ---【基础篇】一文搞懂 Fragment 生命周期,附代码示例!
在实际应用中,你可以重写这些方法来执行特定的操作,比如数据加载、资源释放、用户交互处理等。记得在重写这些方法时调用父类相应的方法,以确保生命周期方法能够正常执行。Fragment的生命周期。原创 2024-08-26 11:40:57 · 665 阅读 · 0 评论 -
Android ---【经验篇】ubuntu 安装 git gui
文章内容来自博主:https://blog.csdn.net/wto882dim/article/details/86690711下载:https://packages.ubuntu.com/bionic/all/git-gui/download点击下面的地方文件的名字如下:git-gui_2.17.1-1ubuntu0.4_all.deb输入以下命令:sudo dpkg -i git-gui_2.17.1-1ubuntu0.4_all.deb在git 仓库下 git gui就可以原创 2022-04-27 10:54:27 · 3963 阅读 · 1 评论 -
Android ---【经验篇】AIDL 的理解
文章目录一、跨应用启动 Service二、与 Service 跨应用通信 1三、与 Service 跨应用通信 2AIDL 的全称是Android Interface Definition Language(安卓接口定义语言)一、跨应用启动 Service项目结构:1.第一个App - 看好包名:MainActivity.java - com.example.startservicefromanotherapppackage com.example.startservicefromanothe原创 2022-06-18 16:26:41 · 1685 阅读 · 0 评论 -
Andorid ---【经验篇】为什么要使用事务,什么叫做事务的提交和回滚?
我们在操作数据库的时候经常会遇到这个名词:事务,有些时候我们只是会用并不知道这样用,网上有很多讲解,解决了我部分疑问,但是还有一些疑点想记录下,下面一一介绍这几个问题。一、什么是事务事务是用户定义的一个数据库操作序列,这些操作要不全部操作成功,要不全部操作失败,是一个不可分割的工作单位。二、为什么要使用事务,什么时候使用事务啥意思呢,简单的举个例子,比如你去买菜,花了自己20,商家收20。这个过程就是在你的账户中扣除20块而在商家的账户多20块。整个过程不能有一步出错,否则就会造成一定的损失,也就是原创 2022-04-20 22:56:37 · 2077 阅读 · 0 评论
分享