自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(110)
  • 收藏
  • 关注

原创 鸿蒙开发笔记-14-应用上下文Context

Context是应用中对象的上下文,其提供了应用的一些基础信息,例如resourceManager(资源管理)、applicationInfo(当前应用信息)、dir(应用文件路径)、area(文件分区)等,以及应用的一些基本方法,例如createBundleContext()、getApplicationContext()等。

2025-03-25 19:26:02 631

原创 鸿蒙开发笔记-13-AbilityStage组件容器

HarmonyOS Stage模型采用分层设计思想,形成的四层架构体系。AbilityStage是一个Module级别的组件容器,应用的HAP在首次加载时会创建一个AbilityStage实例,可以对该Module进行初始化等操作。AbilityStage与Module一一对应,即一个Module拥有一个AbilityStage。

2025-03-24 20:30:50 636

原创 鸿蒙开发笔记-12-浅析UIAbility组件

UIAbility是HarmonyOS应用框架的核心组件,负责管理用户界面与系统资源的交互。跨端迁移:支持应用组件在不同设备间无缝迁移多端协同:实现多窗口、多任务并行处理窗口管理:每个UIAbility实例对应一个独立任务窗口, 支持单实例/多实例运行模式生命周期感知:提供完整的生命周期回调体系多模块交互:支持与Service/ExtensionAbility深度协作状态可移植:通过统一的上下文管理机制(UIAbilityContext)实现运行状态的持久化存储与恢复。

2025-03-14 19:17:57 785

原创 鸿蒙开发笔记-11-LazyForEach 数据懒加载

LazyForEach作为鸿蒙长列表渲染的核心方案,其高效性来源于精妙的动态加载+组件复用双重机制。键值生成规则必须保证全局唯一性数据更新必须通过规范操作结合@Reusable实现组件级复用优化合理配置平衡性能与内存。

2025-03-11 20:30:00 1279

原创 鸿蒙开发笔记-10-其他状态管理:@Watch装饰器,$$语法,@Track装饰器

Watch 适用于需要即时响应的状态变化场景,如按钮点击、输入框输入等交互操作,使用原则:回调函数保持纯粹(无副作用)避免深度嵌套监听(超过 3 层需重构)使用debounce处理高频事件(如输入框)@Track 推荐用于管理包含多个属性的复杂对象,特别是在频繁更新且需要优化渲染性能的场景,使用原则:所有 UI 可见属性必须标记@Track非 UI 属性禁止使用@Track复杂对象采用扁平化设计(如@Track单独字段)“$$”语法优化:预计算复杂表达式使用。

2025-03-11 12:00:00 1548

原创 鸿蒙开发笔记-9-应用状态管理:LocalStorage、AppStorage与PersistentStorage

优先使用LocalStorage处理页面级状态需要跨页面共享时升级到AppStorage对关键配置数据使用PersistentStorage持久化对于高频更新数据,建议使用AppStorage+内存缓存组合;对于敏感数据,必须启用加密与完整性校验。

2025-03-10 20:00:00 574

原创 鸿蒙开发笔记-7-组件状态管理装饰器:@State、@Prop、@Link

​优先选择@State:组件状态管理的基石,适用于私有状态维护。​谨慎使用@Prop:实现父组件到子组件的单向数据分发,适合配置传递,避免过度嵌套和复杂类型。​双向绑定用@Link:提供双向同步能力,适用于实时交互场景(如表单、搜索框联动),需严格匹配数据类型,避免冲突。​性能优化对复杂对象使用 @Observed, 减少不必要的代理开销。避免在build()方法中修改状态。避免大规模数据的深拷贝使用不可变数据结构调试技巧使用 @Watch 监听变化。

2025-03-08 10:49:13 1227

原创 鸿蒙开发笔记-8-组件状态管理装饰器:@Provide/@Consume与@Observed/@ObjectLink

Provide/@Consume 是跨层级通信的"高速公路",适合全局状态共享(如主题切换、用户登录)@Observed/@ObjectLink 是深度数据观察的"显微镜",专治嵌套结构更新难题(如订单详情、树形菜单)

2025-03-08 10:02:12 1265

原创 鸿蒙开发笔记-6-装饰器之@Require装饰器,@Reusable装饰器

Require和@Reusable分别从代码健壮性和运行效率两个维度提升了ArkTS应用的开发质量。在公共组件库中优先采用@Require,对核心页面实施@Reusable优化。通过合理运用这两种装饰器,开发者可以构建出既稳定又高效的HarmonyOS应用,在复杂的业务场景中实现质量与性能的双重保障。

2025-03-06 11:38:54 887

原创 鸿蒙开发笔记-5-装饰器之@Styles装饰器,@Extend装饰器,stateStyles多态样式,@AnimatableExtend装饰器

基础样式(@Styles) :定义全局基础样式(如按钮尺寸、字体规范)组件扩展(@Extend) :创建组件变体(如带图标的按钮)状态样式(stateStyles) :处理交互状态(按压/禁用样式)动画扩展(@AnimatableExtend):实现复杂动效。

2025-03-06 11:38:10 2503

原创 鸿蒙开发笔记-4-装饰器之@Builder、@LocalBuilder、@BuilderParam、wrapBuilder

Builder:适用于模块化UI复用,通过参数传递策略平衡灵活性与性能。:解决父子组件层级关系问题,适合动态内容插入。:实现组件插槽机制,提升UI组合能力。:动态构建器调用的终极方案,特别适合可视化搭建场景。

2025-03-06 11:37:17 1343

原创 鸿蒙开发笔记-3-自定义组件基础

HarmonyOS自定义组件基于ArkUI框架构建,采用声明式UI编程模型,通过`@Component`装饰器实现组件封装

2025-03-04 16:11:33 467

原创 鸿蒙开发笔记-2-ArkTS语言介绍

ArkTS通过声明引入变量、常量、函数和类型。

2025-03-04 16:10:27 976

原创 鸿蒙开发笔记-1-环境搭建

环境搭建1. 安装DevEco Studio2. 诊断开发环境3. 创建和运行Hello World

2025-03-04 16:08:54 135

原创 Android进阶笔记-7. Context详解

【代码】Android进阶笔记-7. Context详解。

2022-09-28 17:42:31 947

原创 Android高手笔记-屏幕适配 & UI优化

Android高手笔记-屏幕适配 & UI优化屏幕与适配由于Android碎片化严重,屏幕分辨率千奇百怪,而想要在各种分辨率的设备上显示基本一致的效果,适配成本越来越高;屏幕适配究其根本只有两个问题:在不同尺寸及分辨率上UI的一致(影响着用户体验);从效果图到UI界面代码的转化效率(影响着开发效率);适配方式:px在标识尺寸时,Android官方并不推荐使用px(像素),因为不同分辨率的屏幕上,同样像素大小的控件,在分辨率越高的手机上UI显示效果越小;(因为分辨率越高单位

2022-02-23 10:23:17 2265

原创 设计了一个红包封面,快来领取吧

分享一个红包封面哈喽,大家好,我是 今阳,最近微信团队送给了我一批微信红包封面的额度,以「小老虎」为主题设计了一款微信红包封面,在这里分享给大家,提前祝各位新春快乐,万事如意!预览效果如下:领取方式关注公众号"今阳说", 查看最新推送或回复关键字"红包封面"即可领取我是今阳,如果想要进阶和了解更多的干货,欢迎关注微信公众号 “今阳说” 接收我的最新文章...

2022-01-26 10:11:22 613

原创 Android进阶笔记-6. 从源码看View体系(坐标,滑动,分发,绘制)

坐标系Android中有两种坐标系,Android坐标系和视图坐标系Android坐标系定义:屏幕左上角顶点为Android坐标系原点,向右为X轴正方向,向下为Y轴正方向;MotionEvent提供的getRawX()和getRawY()获取的坐标都是Android坐标系的坐标;视图坐标系View获取自身宽高:getWidth(),getHeight();View自身坐标(View到其父控件原点的距离):getTop(),getLeft(),getRight(),getBottom(

2022-01-20 16:16:08 2056

原创 探索Android开源框架 - 11. 热修复原理

热修复技术介绍重新发布版本代价大,成本高,不及时,用户体验差,对此有几种解决方案:Hybird:原生+H5混合开发,缺点是人工成本搞,用户体验不如纯原生方案好;插件化:移植成本高,对老代码的改造费时费力,而且无法动态修改;热修复技术,将补丁上传到云端,app可以直接从云端下来补丁直接应用;热修复技术对于国内开发者来说是一个比较实用的功能,可以解决如下问题:发布新版本代价较大,用户下载安装成本高;版本更新的效率问题,需要较长时间来完成版本覆盖;版本更新的升级率问题,不升级版本的用

2022-01-14 18:45:38 1705

原创 Android高手笔记-D8, R8编译优化

在之前的文章Android高手笔记-包体积优化中提到过通过编译优化包体积,涉及到了ProGuard,D8,R8,其中关于ProGuard及包体积优化方案已经进行了详细介绍,那么今天我们来说说D8和R8;D8D8是一款用于取代 DX、更快的 Dex 编译器,可以生成更小的 APK;开启D8的好处编译更快、时间更短编译时占用内存更小.dex文件更小.dex 文件拥有更好的运行时性能支持在代码中使用 Java 8 语言开启与关闭Android Studio 3.0 需要主动在gr.

2022-01-13 18:35:52 7168

原创 Android进阶笔记-5. IPC机制 & Binder 原理

IPC机制一次进程间通信至少包含两个进程,由于进程隔离机制的存在,通信双方必然需要借助 IPC(进程间通信,inter-Process Communication)来实现;Linux中的IPC机制种类管道(pipe)继承自Unix,半双工通信方式(数据只能在一个方向上流动);原理:通信双方利用内存的共享文件来传递信息;信号(sinal)异步通信方式,软件层对中断机制的一种模拟,例如内核通知用户空间进程发生了哪些系统事件不适用于信息交换,适用于进程中断控制;信号量(semophore

2022-01-12 18:42:12 946

原创 Android进阶笔记-4. BroadcastReceiver的注册、发送和接收

关于BroadcastReceiverBroadcastReceiver(广播接收者)是一个系统全局的监听器,用于监听系统全局的Broadcast广播消息,使用观察者模式,基于消息的发布/订阅事件模型;广播的分类普通广播:开发者自身定义intent的广播;系统广播:Android中内置的多个系统广播,每个广播都有特定的Intent - Filter;有序广播:发送的广播被广播接收者按照priority属性值大小排序,priority相同的,动态注册的广播优先//发送有序广播val in

2022-01-11 18:58:56 1412

原创 Android进阶笔记-3. Service 启动过程 & 绑定过程

startService和bindServiceService的启动方式主要有两种,分别是startService和bindService使用startService启动时是单独开一个服务,与Activity没有任何关系,而bindService方式启动时,Service会和Activity进行绑定,当对应的activity销毁时,对应的Service也会销毁startService多次,onStart()会执行多次,onCreate()只执行一次,onStartCommand()也会执行多次。bi

2022-01-07 18:44:42 2096

原创 重学Java系列-2. JVM内存模型 & 类加载机制

Java内存模型 & JVM内存分区线程之间的通信在命令式编程中,线程之间的通信机制有两种共享内存和消息传递。共享内存:线程之间通过写-读内存中的公共状态来隐式进行通信,典型的共享内存通信方式就是通过共享对象进行通信。消息传递:线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信,在java中典型的消息传递方式就是wait()和notify(),notifyAll()。Java内存模型Java的并发采用的是共享内存模型,JMM决定一个线程对共享变量的写入何时对另一

2022-01-06 15:57:04 995

原创 重学Java系列-1. GC原理 & 垃圾回收算法

GC原理GC即垃圾收集,追踪仍然使用的所有对象,并将其余对象标记为垃圾然后进行回收;GC判断策略(例如引用计数法,可达性分析法)GC收集算法(标记清除法,标记清除整理法,标记复制清除法,分带法)GC收集器(例如Serial,Parallel,CMS,G1);判断策略(哪些内存需要回收)引用计数法:每个对象都有一个引用计数器,当对象被引用一次的时候,计数器+1,当对象引用失效的时候,计数值-1,实时性, 但不能解决循环引用的问题;可达性分析法:从GC Root作为起点开始搜索,,那么整

2022-01-04 18:24:18 409

原创 干掉RxJava系列--2. 手写FlowBus替代RxBus/EventBus/LiveDataBus

LiveData的不足LiveData 是一个专用于 Android 的具备自主生命周期感知能力的可观察的数据存储器类,被有意简化设计,这使得开发者很容易上手,但其不足有如下两点:LiveData只能在主线程更新数据(postValue底层也是切换到主线程的,而且可能会有丢数据的问题);LiveData操作符不够强大, 对于较为复杂的交互数据流场景,建议使用 RxJava 或 Flow;LiveData与Android平台紧密相连,虽然LiveData在表现层中运行良好,但它并不适合领域层,因

2021-12-31 10:10:32 1838

原创 干掉RxJava系列--1. 手写权限请求替代RxPermission

起因最近在对公司项目做APK包体积优化, 其中少不了对一些不必要的三方库的移除,在此过程中发现项目中居然有一系列的Rx相关库,RxJava,RxBus,RxPermission,于是心中起了一丝杀意。当然RxJava还是相当强大的,基于事件流的链式调用,进行耗时任务,线程切换,是一个很好的异步操作库,毕竟我上一个系列文章才写过探索Android开源框架 - 3. RxJava使用及源码解析,如果想更深入的了解RxJava的话可以看一下,不过随着现在kotlin的普及,其协程和Flow基本也可以替代Rx

2021-12-29 19:06:53 785

原创 探索Android开源框架 - 10. 插件化原理

什么是插件化插件化技术最初源于免安装运行apk的想法,这个免安装的apk可以理解为插件将app中一些不常用的功能模块做成插件,一方面减小了安装包的大小,另一方面可以实现app功能的动态扩展;插件框架有两个作用:一是“自解耦”,二是“免安装”自解耦指的是一个应用原本由一份代码编译而成,希望改成将其中的一些功能单独编译,像插件一样动态插在主应用上。这样一来可是使主应用体积变小,下载安装更方便。二来可以是比较独立的功能可以单独开发调试,甚至单独更新版本。免安装指的一个应用原本需要安装过程才能启动运行

2021-12-27 14:40:49 554

原创 探索Android开源框架 - 9. ARouter使用及源码解析

最近对项目进行组件化重构,要进行组件化就少不了组件间通信的路由,于是就再次研究了一下阿里的ARouter,关于组件化可以查看我之前写的组件化架构系列文章,这里就不过多提及了Android组件化架构 - 1. 组件化基础Android组件化架构 - 2. 组件间通信机制(1)Android组件化架构 - 2. 组件间通信机制(2)Android组件化架构 - 3. 组件间跳转 & ARouter路由Android组件化架构 - 4. 动态创建 & 反射机制Android组件化架.

2021-12-10 19:12:05 2112

原创 探索Android开源框架 - 8. Gson使用及源码解析

Gson 是 我们经常用来在 Java 对象和 JSON 数据之间进行映射的 库,今天我们就来分别讲一讲其使用和源码分析使用详解1. 基本的解析与生成Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化解析基本数据类型val gson = Gson()val i = gson.fromJson("100", Int::class.java) //100val d = gson.fromJson("99.99", D.

2021-12-03 18:17:36 3359

原创 探索Android开源框架 - 7. LeakCanary使用及源码解析

简介LeakCanary是Square公司研发的一个可视化的内存泄漏分析工具LeakCanary2.x从2.x版本开始有了比较大的升级完全使用Kotlin重写;使用新的Heap分析工具Shark,替换了之前的haha,按官方的说法,内存占用减少了10倍泄露类型分组使用添加依赖最新的LeakCanary只需引入依赖,不需要初始化代码,就能执行内存泄漏检测;debugImplementation 'com.squareup.leakcanary:leakcanary-andr

2021-11-15 16:43:49 2630

原创 探索Android开源框架 - 6. ButterKnife使用及源码解析

相关知识ButterKnife中最重要的就是先自定义注解,再通过APT在编译期解析注解,解析器中又会用到反射,然后通过javapoet库来生成模板代码,要想学习其源码,首先要基本的了解注解和反射的知识;注解Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制;Java中的类、方法、变量、参数和包等都可以被标注,Java 标注可以通过反射获取标注内容;在编译器生成类文件时,标注可以被嵌入到字节码中,Java 虚拟机可以保留标注内容,在运行时可以获取

2021-11-11 11:25:05 1737

原创 探索Android开源框架 - 5. EventBus使用及源码解析

相关概念定义Android事件发布/订阅框架,简化应用程序内组件间,组件与后台线程间的通信;优点代码简洁,使用简单,将事件发布和订阅充分解耦;五种ThreadModePOSTING(默认)接收事件方法应执行在发射事件方法所在的线程MAIN接收事件方法应执行在主线程MAIN_ORDERED接收事件方法会被扔进 MessageQueue 中等待执行BACKGROUND发射事件方法在主线程中执行,则接收事件方法应执行在 EventBus 维护的单一子线程 执行发射

2021-10-19 15:13:05 872

原创 探索Android开源框架 - 4. Glide使用及源码解析

使用1. 添加依赖implementation 'com.github.bumptech.glide:glide:4.12.0'annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'2. 基础使用加载图片Glide.with(this) .load(imgUrl) .into(imageView1)取消加载Glide.with(this).clear(imageView1)实际上,当 G

2021-10-15 16:50:50 832

原创 探索Android开源框架 - 3. RxJava使用及源码解析

相关概念Android多线程编程的原则:不要阻塞UI线程;不要在UI线程之外访问UI组件;ReactiveXReactive Extensions的缩写,一般简写为Rx;是一个使用可观察数据流进行异步编程的编程接口,ReactiveX结合了观察者模式、迭代器模式和函数式编程的精华;RxJavaReactive Extensions for the JVM:,RxJava就是ReactiveX在JVM平台的实现;基于事件流的链式调用,进行耗时任务,线程切换,其本质是一个异步操作库;

2021-09-30 13:54:51 314

原创 探索Android开源框架 - 2. Retrofit使用及源码解析

Retrofit是目前Android最优秀的网络封装框架,是对OkHttp网络请求库的封装App应用程序通过Retrofit请求网络,实际上是使用Retrofit接口层封装请求参数,之后由OkHttp完成后续的请求操作;服务器数据返回后,OkHttp将原始的结果交给Retrofit,根据用户需求对结果进行解析;使用简单使用添加依赖retrofit2内置了OkHttp,所以无需再单独添加OkHttp依赖了implementation 'com.squareup.retrofit2:retr.

2021-09-17 14:42:09 250

原创 探索Android开源框架 - 1. OkHttp源码解析

使用1. 添加依赖implementation 'com.squareup.okhttp3:okhttp:3.14.9'2. 常用请求方法1. 同步GET请求执行请求的操作是阻塞式的,直到http响应返回1. 创建OkHttpClient对象直接创建val client = OkHttpClient()通过Builder模式创建val client = OkHttpClient.Builder() .build()2. 创建Request对象val requ

2021-09-14 17:09:59 309

原创 Android Jetpack系列--9. Hilt使用详解

相关知识依赖注入Dependency Injection,简称DI;依赖项注入可以使代码解耦,便于复用,重构和测试什么是依赖项注入类通常需要引用其他类,可通过以下三种方式获取所需的对象:在类中创建所需依赖项的实例class CPU () { var name: String = "" fun run() { LjyLogUtil.d("$name run...") }}class Phone1 { val cpu = CPU()

2021-09-14 17:05:21 298

原创 Android Jetpack系列--8. DataStore使用详解

SharedPreferences 和 DataStore 对比SharedPreferences:可能阻塞UI线程,导致ANR异常(需要等等sp文件加载完成,而且存储数据越多,文件越大,加载越慢,所有我们之前使用时都会分类存储在不同的sp文件中,如用户信息,业务信息,统计信息等)且不能用于跨进程通信// ContextImpl.getSharedPreferences()public SharedPreferences getSharedPreferences(File file, int m

2021-09-03 09:33:08 3381

原创 Android Jetpack系列--7. WorkManager使用详解

相关知识交换空间:当系统内存资源已被耗尽,但是又有额外的内存资源请求的时候,内存中不活动的页面会被移动到交换空间。交换空间是磁盘上的一块区域,因此其访问速度比物理内存慢。Android基于Linux内核,两者主要差别在于Android系统没有交换空间(Swap space)于是Android系统引入了OOM( Out Of Memory ) Killer 来解决内存资源被耗尽的问题。其作用是根据进程所消耗的内存大小以及进程的“visibility state”来决定是否杀死这个进程,从而达到释放内

2021-09-02 09:07:09 224

空空如也

空空如也

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

TA关注的人

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