- 博客(21)
- 收藏
- 关注
原创 Android14配置自定义输入法
Android14配置自定义输入法方法摘要 本文介绍了在Android14系统中配置自定义输入法的两个关键步骤:首先需要预制输入法应用APK,然后在系统框架中进行相应修改。具体操作包括在defaults.xml中设置默认输入法路径,以及在DatabaseHelper.java中添加相关配置代码。配置成功后可通过命令验证,确保default_input_method和enabled_input_methods属性正确显示目标输入法路径。该方法适用于各类输入法配置,如系统拼音输入法或第三方输入法(如讯飞输入法)
2025-12-10 11:58:45
154
原创 【HashMap原理分析】
HashMap是基于哈希表实现的Map接口类,具有快速访问特性但不保证顺序。其核心属性包括默认初始容量16、负载因子0.75、树化阈值8等。采用数组+链表+红黑树的存储结构,当链表长度超过8且容量大于64时转为红黑树。通过hash(key)计算索引位置,使用高位异或运算减少哈希冲突。HashMap非线程安全,允许多线程写入时可能导致数据不一致。其工作原理是通过哈希函数定位桶位置,采用链表或红黑树处理冲突,动态扩容机制确保性能。
2025-09-17 14:24:35
777
原创 Android View显示原理分析,跟踪源码
文章摘要:本文分析了Android View的显示原理,重点剖析了setContentView的流程。Activity启动时通过PhoneWindow创建DecorView,并调用installDecor方法初始化布局。该方法会生成DecorView和ContentParent,然后将XML布局文件inflate到ContentParent中。整个过程涉及Window、DecorView和ContentParent的创建与关联,最终实现UI内容的显示。
2025-09-09 17:41:38
356
原创 安卓在Service中使用ComposeView
本文介绍了在Android Service中使用ComposeView的实现方案。针对传统Activity方案受系统按键影响的问题,提出了通过WindowManager添加ComposeView到Service窗口的替代方案。核心挑战在于ComposeView需要Lifecycle支持,文中通过自定义ServiceLifecycleOwner类解决了ViewTreeLifecycleOwner缺失问题,并详细说明了如何手动管理生命周期事件(onCreate/onStart/onDestroy)来确保Comp
2025-08-25 15:37:39
385
原创 安卓的Handler机制
Android Handler机制解析 Handler机制是Android实现线程间通信的核心框架,主要由四个关键组件构成: Handler:消息发送和处理的桥梁,负责发送消息(sendMessage)和处理消息(handleMessage) Message:消息数据结构,包含what、obj、arg1/arg2等字段 MessageQueue:消息队列,负责消息的存储和管理 Looper:消息循环,从队列中取出消息并分发 每个线程只能拥有一个Looper,通过ThreadLocal保证线程隔离。使用Han
2025-08-16 16:24:09
1052
原创 Android Binder机制
是现代操作系统的核心安全机制,它确保了不同进程不能直接访问彼此的内存空间。Android系统中的Binder机制是进程间通信(IPC)的核心架构,它高效地连接了应用程序与系统服务,以及不同应用之间的交互。Binder作为Android系统架构的核心枢纽,通过创新的内存映射和C/S架构设计,在保证安全性的同时提供了高效的进程间通信能力。随着Android系统的演进,Binder机制仍在不断优化,如Android 8.0引入的Binder线程池优化、Android 10中的Binder调度改进等。
2025-08-16 14:26:07
699
原创 Android网络框架Retrofit全面解析
Retrofit作为Android平台主流的网络请求框架,通过注解系统和模块化设计简化了HTTP请求处理。摘要:Retrofit基于OkHttp实现,支持类型安全的API定义、自动数据转换和线程管理。核心包括注解系统(@GET/@POST等)、转换器(Gson/Jackson)和适配器(RxJava)。使用步骤涵盖依赖配置、接口定义、实例创建和请求处理。高级功能支持文件传输、协程/RxJava集成,以及自定义转换器。Retrofit以简洁的API和强大的扩展性,成为Android开发中高效处理网络请求的首选
2025-08-07 10:38:45
569
原创 Android13实现导出日志到U盘中
Android 13日志导出到U盘实现方案 本文介绍了在Android 13系统上实现将设备日志(ANR、tombstones等)导出到U盘的技术方案。重点分析了Android 13的分区存储限制和特殊权限处理,特别是MANAGE_EXTERNAL_STORAGE权限的申请。技术实现部分详细展示了通过StorageManager获取U盘挂载点的方法,包括路径转换和状态检查的核心代码。方案解决了可移除存储设备的特殊处理问题,为设备调试和故障诊断提供了有效的日志导出方案。
2025-07-03 10:28:27
228
原创 安卓Seekbar,长按时进度条更新不平滑实战
在安卓应用中使用SeekBar时,进度条更新不平滑,出现卡顿或跳跃现象,影响用户体验。问题主要源于在UI线程中执行耗时操作,导致界面响应延迟。解决方案是将耗时的方法调用移至后台线程,通过Handler处理消息,避免阻塞UI线程。具体实现包括:使用Handler处理进度更新消息,自定义接口OnSeekBarValueChangeListener监听进度变化,并在按键事件中处理进度条的左右移动。通过将耗时操作移至后台线程,有效解决了SeekBar更新不平滑的问题,提升了用户体验。
2025-05-19 16:41:24
306
原创 安卓SeekBar的UI变化不平滑
然而,在某些情况下,SeekBar的UI变化可能不够平滑,导致用户体验不佳。在优化SeekBar的UI变化平滑度后,需要进行性能测试以确保优化效果。可以使用Android Profiler或Systrace工具来监控UI渲染性能,并根据测试结果进一步优化。通过分析SeekBar UI变化不平滑的原因,并采取相应的优化措施,可以有效提升用户体验。通过设置一个阈值或使用定时器来减少SeekBar的更新频率,避免过于频繁的UI更新。通过减少SeekBar的绘制复杂度或使用硬件加速来优化UI渲染。
2025-05-19 16:28:55
434
原创 【AOSP开发在打开某些app时屏幕画面会闪烁】
在AOSP开发过程中,打开某些应用(如Chrome)时出现屏幕闪烁问题。通过排查发现,屏幕密度(density)设置为320时会导致此问题,而将其修改为240后问题消失。为解决此问题,修改了AOSP源代码中的ActivityRecord.java文件,具体在onWindowsDrawn()方法中添加了逻辑,根据应用包名和屏幕分辨率动态调整屏幕密度。对于Chrome应用,当屏幕分辨率大于900时,将密度设置为320,否则设置为213。此解决方案通过系统属性persist.sys.dpi来记录密度是否已调整
2025-05-15 15:29:03
269
原创 安卓AOSP开发,取消U盘插入时自动创建目录的默认行为
在安卓AOSP开发中,插入U盘时系统默认会自动创建一些目录,如Music、Pictures等。然而,某些客户希望取消这一行为。通过修改系统源码,可以实现这一需求。具体步骤包括定位相关源码文件packages/providers/MediaProvider,调整U盘挂载时的目录创建逻辑,并在MediaProvider.java中修改ensureDefaultFolders和ensureThumbnailsValid方法,加入自定义逻辑以控制目录的创建。修改完成后,编译并测试系统镜像,插入U盘验证是否不再生成默
2025-05-15 14:22:21
1009
原创 GORM使用
即Object-Relational Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样我们在具体操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作就可以。
2025-03-10 15:46:06
409
原创 Jetpack Compose状态
在重新创建Activity或进程后,可以使用rememberSaveable恢复界面状态。此外,rememberSaveable也可以在重新创建activity或进程后保持吃状态。LiveData是一种可观察状态容器,这意味着它可让任何人观察状态的变化。然后我们在界面中使用observe方法,以便在状态变化时更新界面。将状态从Activity移到了Viewodel中,在ViewModel中,状态由LiveData表示。在安卓中状态会根据事件进行更新,事件是从应用程序的外部输入。
2025-03-10 15:44:32
1020
原创 安卓14在asop的framework中集成原厂的资源调用依赖
当你编译好后,在刷入设备中调用却发现,无法获取到你想要的数据,要么是返回了 null 要么都是false。这个时候其实是权限不够了,可以使用logcat | grep avc 查看对应的senlinux报错,根据相关信息修改添加对应的权限策略,最后再编译固件刷入设备。在添加权限策略中可能不止需要加一个,可能需要加好几个,还是需要根据日志来查看需要加哪些权限。我是在framework/base/sevices/core中的bp文件中添加了需要使用的依赖。需要编译固件出来,对应的资源才会被打包到系统中。
2025-02-17 15:32:04
307
原创 Gin学习之路
使用gin.Default()还有gin.New();两者的关系,Dafault内部实际上也是调用了New,但是加上了Logger和Recovery中间件。gin支持GET、POST、POST、PUT、DELETE、PATCH、HEAD、OPTIONS方式。gin.default实例化引擎,默认有两个中间件Logger和Recovery分别处理日志和错误。文档地址:https://gin-gonic.com/zh-cn/docs。关键方法:engine.Use()这个案例使用了GET方式。
2024-01-11 14:03:59
459
原创 在使用Mybatis的分页插件PageHelper时导致的分页失效
总的来说,在你调用PageHelper的开始分页方法时,只会在接下来执行的第一条查询有效,在它返回的list其实不是Collection类型,而是Page。不知道大家有没有更好的解决方法,欢迎评论!希望能帮到碰到这种问题的人。
2023-11-17 09:57:10
500
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅