- 博客(314)
- 收藏
- 关注
原创 《Jetpack Compose 从入门到实战》带你踏上 Compose 开发之旅~
Jetpack Compose 从入门到实战,新书上架,谷歌开发者社区 & Kotlin中文社区 & Compose中文社区 联合推荐
2022-08-02 09:00:00 3462 7
原创 一文看懂 Jetpack Compose 布局流程
本文用通俗易懂的语言介绍 Jetpack Compose 的布局流程,涉及到 MeasurePolicy,Modifier,Constraints, Intrinsic measurement 等概念。
2024-12-09 08:00:00 746
原创 深入浅出 Compose Compiler(2) 编译器前端检查
本文为稀土掘金技术社区首发签约文章,14天内禁止转载,14天后未获授权禁止转载,侵权必究!
2024-10-21 08:30:00 1508
原创 一文看懂 Compose 强制跳过模式(Strong Skipping Mode)
强制跳过模式(Strong Skipping Mode)是一个小更新,但是其实影响深远,它有点像从“性本恶”到“性本善”的转变,认为不稳定类型的危害是可忽略的,当然它的开启会引入正确性风险,这也是为什么它经过了长期的实验验证后,才正式引入。经过实验和开发者反馈,证明它的引入是收到欢迎的。只要大家遵循好的编码习惯,不随意滥用不稳定性类型,鼓励打开强跳模式,会让 App 性能得到一个整体提升。
2024-10-09 08:30:00 1052
原创 盘点 2024 Google I/O 中的 Android 方向关键更新
AI 是 2024 年 Google I/O 焦点,本次大会 Android 的许多 topic 也离不开与 AI 的碰撞,例如 Gemini 如何助力 Android 应用开发等。AI 之外也有很多 Android 独有话题,例如如何帮助开发者低成本构建跨设备应用、如何提升研发效率等。本文将带大家盘点本次 I/O 大会最值得 Android 开发者关注的 15 个关键进展。
2024-06-09 10:42:22 1019 1
原创 Android 架构 UseCase最佳实践
Android 官方的最新架构中引入了 Domain (网域层 or 领域层),Domain Layer 由一个个 UseCase 组成。但是由于团队套用官方新架构后没有正确地定义 UseCase,无法发挥 Domain Layer 应有的架构价值。本文就带大家一起梳理 UseCase 常见的使用误区和最佳实践。
2024-05-28 14:46:45 1728 1
原创 Jetpack Compose 1.5 发布:全新 Modifier 系统助力性能提升
Jetpack Compose 1.5 发布,性能终于得到大幅提升,这得益于全新的 Modifier 实现方式
2023-09-11 08:30:00 2155 6
原创 从 Compnent Tree 视角看 Dagger 到 Hilt 的演变
Dagger 的本质是一棵组件树,而 dagger.android 和 Hilt 的诞生目的,都是通过不同的手段降低组件树的构建成本,减少模板代码。
2023-07-11 09:00:00 553
原创 Kotlin 1.9 新特性预览:data object (数据单例)
data object 数据单例是 Kotlin 1.9 中预定引入的新特性 ,但其实从 1.7.20 开始就可以预览了。接下来让我们看看它有哪些特点。
2023-07-04 08:30:00 2379
原创 Android 官方架构中的 UseCase 该怎么写?
如上所述,官方文档虽然对 UseCase 给出了一些基本定义,但是毕竟是一个新新生概念,很多人在真正去写代码的时候仍然会感觉不清晰,缺少有效指引。在究竟如何定义 UseCase 这个问题上,还有待大家更广泛的讨论,形成可参考的共识。本文也是带着这个目的而生,算是抛砖引玉吧。考虑到架构的扩展性,推荐在 ViewModel 与 Repository 之间强制引入 UseCase,即使当前的业务逻辑不复杂。
2023-05-24 09:00:00 1628
原创 Studio Bot - 让 AI 帮我写 Android 代码
Google 旗下的各类产品都成了其展示 AI 实力的舞台。连面向开发者的产品 Android Studio 也新增了Studio bot功能,希望通过 AI 帮助开发者更轻松地写代码:Studio Bot 使用谷歌编码基础模型Codey(后者基于最新 PaLM2 大语言模型)帮助开发者生成程序代码,提升生产力。我们还可以向 Studio Bot 询问有关 Android 开发的知识,或者帮助修复当前代码中的错误。
2023-05-12 09:00:00 4692
原创 深入浅出 Compose Compiler(1) Kotlin Compiler & KCP
Compose 的语法简洁、代码效率非常高,这主要得益于 Compose Compiler 的一系列编译期魔法,帮开发者生成了很多样板代码。但编译期插桩也阻碍了我们对于 Compose 运行原理的认知,想要真正读懂 Compose 就必须先了解它的 Compiler。本系列文章将带大家揭开 Compose Compiler 的神秘面纱。Compose 是一个 Kotlin Only 框架,所以 Compose Compiler 的本质是一个 KCP(Kotlin Compiler Plugin)。
2023-04-29 12:00:54 1868 4
原创 Jetpack Compose 中添加 click 事件的几种方法
Compose 中添加 click 有多总方法,本文做一个简单总结,包括 Modifier.clickable, combinedClickable, pointerInput, ViewConfiguration 等
2023-04-10 08:30:00 6027 1
原创 CameraX + MLKit 打造超简单 OCR 方案
Android 自 5.0 开始引入了全新的相机框架 Camera2 ,相较于之前的 Camera1 对多摄像头的支持更加友好,功能更加强大,但使用成本也更高。此背景下谷歌发布了 CameraX,它基于 Camera2 封装,大大提高了 API 的易用性。我们可以用很少的代码搭建出面向特定场景的相机应用,OCR 就是一种典型的相机应用场景。CameraX 引入 UseCase 的概念完成各种相机能力,UseCase 有利于功能模块的解耦,聚焦特定领域进行功能开发。
2023-02-01 08:30:00 2558
原创 Android Studio 支持安卓手机投屏
当我们需要手机投屏时会使用到 ApowerMirror,LetsView,Vysor,Scrcpy 等工具。如果你是安卓手机,现在可以使用 Android Studio 进行投屏
2023-01-19 01:16:55 11507
原创 Compose 为什么可以跨平台?
Compose Multiplatform 本质上是一个 Kotlin 跨平台库。在各个平台共享 Compose Compiler 和 Compose Runtime
2022-12-26 11:52:37 2251
原创 Compose 横竖屏切换时状态如何保存?rememberSaveable 实现原理分析
rememberSaveable 可以帮助 Composable 在横竖屏切换甚至进程切换后恢复状态,这主要是通过 SaveableStateRegistry 实现的,在 Activity onSaveInstance 时通过 registry 收集我们需要保存的状态并写入 Bundle,待到下次 Activity 重新 onCreate 的时候恢复。
2022-10-24 09:00:00 2244
原创 终于懂了~ 图解 SharedFlow 缓存系统
图解 MutableSharedFlow 的 replay ,extraBufferCapacity,onBufferOverflow 等参数,深入理解 SharedFlow 的缓存系统
2022-10-07 10:00:00 2962
原创 Compose Compiler 与 Kotlin 的版本兼容性
有时 Android Studio 的 build.gradle 中会提示 Compose 有了新版本,但是如果升级不当可能会出现编译错误,比如下面这样的搭配就会出现 build error比如当我试图将 1.2.0-rc02 升级到 1.2.0 时,会发生以下编译错误原因是 Kotlin 与 Compose Compiler 版本不匹配。
2022-09-23 09:00:00 6246 5
原创 深入理解 Compose Navigation 实现原理
Compose 中的 NavHost 本质上是一个 Composable 函数,与中的同名接口没有派生关系,但职责是相似的,主要目的都是构建 NavGraph。NavGraph 创建后会被 NavController 持有并在导航中使用,因此 NavHost 接受一个 NavController 参数,并为其赋值 NavGraph//... //设置 NavGraph navController . graph = graph //... }...
2022-09-01 08:30:00 3701 4
原创 Gradle Sync Error : ANDROID_HOME 与 ANDROID_SDK_ROOT 指向不一致
Several environment variables and/or system properties contain different paths to the SDK.Please correct and use only one way to inject the SDK location.
2022-08-23 08:30:00 2871
原创 为什么说 Compose 的声明式代码最简洁 ?Compose/React/Flutter/SwiftUI 语法对比
前面基于代码片段进行了一些对比,最后以CounterDemo为例,看一个完整功能下Flutter、Compose和Swift的代码对比,React与其他三者代码风格差异较大,就不参加比较了。FlutterComposeSwiftUI可以感觉到Compose代码最简洁也最直观,SwiftUI通过ViewBuilder机制也可以实现与Compose类似的DSL,表现也非常不错,Flutter由于模板代码较多,在简洁程度上表现最差。httpshttpshttps。...
2022-08-01 09:00:00 2275 6
原创 Compose 类型稳定性注解:@Stable & @Immutable
Compose会针对稳定类型进行编译期优化,通过对输入参数的比较跳过不必要的重组稳定类型包括所有的基本型、String类型、函数类型,以及符合以下条件的非基本类型非interface所有public属性均为final所有public属性均为稳定类型或者MutableState通过添加@Stable或者@Immutable注解可以提升重组性能,注解的使用要慎重跨Module引用数据类型时,需要通过辅助手段提升其稳定性。...
2022-07-28 09:00:00 4197 6
原创 Fragment 这些 API 已废弃,你还在使用吗?
盘点 Fragment 被废弃的 API:onActivityCreated,startActivityForResult,setTargetFragment,setRetainInsInstance
2022-07-18 09:00:00 1710
原创 深入理解 Jetpack Compose 内核:SlotTable 系统
Compose 的绘制有三个阶段,组合 > 布局 > 绘制。从组合到上屏的一系列过程中主要是依靠 SlotTable 系统来完成,SlotTable 记录了 Composiiton 的状态,当 SlotTable 的状态发生变化时,会触发 LayoutNode 树的更新,实现 UI 重新渲染。......
2022-06-27 15:28:22 2473 5
原创 盘点 Material Design 3 最新设计规范
2014 年 Google 发布了 Material Design(简称MD),成为了 Google 系产品统一的 UI 设计语言。时至今日 MD 已经有了两次大升级,2018年发布的 Material Theming (Material Design2,简称 M2),以及 2021年新发布的 Material You (Material Design3,简称 M3)。本文就带大家细数一下 M3 相对于 M2 的升级和变化。M3 最大特色在于对个性化的注重,就如同 “You” 的命名一样。一个集中体现就是
2022-06-13 14:11:55 4547
原创 有关 Android12 中 Activity 生命周期的变化
Android12 有很多令人惊喜的变化,比如基于 Material You 的全新 UI,基于 SplashScreen 的应用启动画面以及更安全的隐私设置等等,此外也有一些需要开发者注意的行为变化,比如这里介绍的 Activity 的 Lifecycle 上的变化Android 12 以前,当我们处于 Root Activity 时,点击返回键时,应用返回桌面, Activity 执行 onDestroy,程序结束。 Android 12 起同样场景下 Activity 只会 onStop,不再执行 o
2022-06-01 09:00:00 1644 4
原创 Jetpack Compose 动画开发实践:微博长按点赞彩虹
Compose 在动画方面下足了功夫,提供了种类丰富的 API。但也正由于 API 种类繁多,如果想一气儿学下来,最终可能会消化不良,导致似懂非懂。结合例子学习是一个不错的方法,本文就带大家边学边做,通过实现一个微博长按点赞的动画效果,学习和了解 Compose 动画的常见思路和开发技巧。|原版效果高仿效果1. Compose 动画 API 概览Compose 动画 API 在使用场景的维度上大体分为两类:高级别 API 和低级别 API。就像编程语言分为高级语言和低级语言
2022-05-30 01:39:09 1276
原创 谷歌 I/O 深度解析:Android Jetpack 最新变化
2022年 谷歌 I/O开发者大会顺利闭幕,本次大会带来哪些 Android Jetpack 的最新变化呢?
2022-05-16 09:00:00 2029
原创 带你了解 Jetpack Compose 快照系统
Compose 通过名为“快照(Snapshot)”的系统支撑状态管理与重组机制的运行。快照具备对 State 的读写感知和隔离的作用,可以保证并发安全,提升性能
2022-05-09 00:43:15 1656
原创 面试题:聊聊 Kotlin 代理的“缺陷”以及如何应对
Kotlin 代理是面试中经常被问到的问题,比如介绍一下代理的实现原理以及在使用中的一些注意事项等,本文将带你梳理这些问题,让你从更高的维度上认识“代理”Kotlin 有很多让人津津乐道的语法,“代理”就是经常被提及的一个。Kotlin 在语言级别通过 by 关键字支持了代理模式的实现。代理模式是最常用的设计模式之一,它是使用“组合”替代“继承”的最佳实践。下面取自 Wiki 中关于代理模式的例子:class Rectangle(val width: Int, val height: Int) {.
2022-05-02 09:30:00 529 2
原创 Android 小知识:startActivity 与 finish 的调用顺序
我们经常遇到这样的场景:关闭当前 Activity 然后启动一个新 Activity,比如但我们从 Spash 开屏页跳转到 Main 的时候。此时,代码一般会这样写:startActivity(intent)finish()但你有没有想过如果掉换了两者顺序会是怎样?finish()startActivity(intent)从行为上看似如没有什么变化,但实际系统处理上有细微区别,Splash 作为 Activity 栈里唯一的对象被 finish 之后,启动的新 Activity 被添加
2022-04-28 16:52:45 3460 3
原创 一文看懂现代 Android 开发最佳实践
What is MAD?MAD 的全称是 Modern Android Development , 它是一系列技术栈和工具链的集合,涵盖了从编程语言到开发框架等各个环节。Android 自 08 年诞生之后的多年间 SDK 变化一直不大,开发方式较为固定。13 年起技术更新逐渐加速,特别是 17年之后, 随着 Kotlin 及 Jetpack 等新技术的出现 Android 开发方式发生了很大变化,去年推出的 Jetpack Compose 更是将这种变化推向了新阶段。Goolge 将这些新技术下的
2022-04-18 09:00:00 1249
原创 Chrome 小技巧 :搜索所有已打开的标签卡 Search your open tabs
不知道大家有没有跟我一样的烦恼,浏览器常年开着几十个 Tab 页,由于内容没有看完,都舍不得关,但是当你想会找某个 page 的时候,由于开了太多,找起来是十分困难无意间发现 Chrome 提供了 Search your open tabs 的功能,点击 tab 栏最右侧的下箭头它还可以在你打开的多个 Chrome 之间搜索,点击后直接跳转到对应 Chrome 的对应 Tab。不起眼的小功能对我来说如获至宝,分享给和我有同样痛点的朋友 ~...
2022-03-22 10:54:07 3894
原创 Jetpack MVVM 七宗罪之六: ViewModel 的接口暴露不合理
在 Jetpack 架构规范中, ViewModel 与 View 之间应该遵循单向数据流的通信方式,Events 永远从 View 流向 VM ,而 State 从 VM 流向 View。如果 ViewModel 对 View 暴露了不适当的接口类型,则会破坏单向数据流的形成。不适当的接口类型常见于以下两点:暴露 Mutable 状态暴露 Suspend 方法暴露 Mutable 状态ViewModel 对外暴露的数据状态,无论是 LiveData 或是 StateFlow 都应该使用 I
2022-03-16 02:37:20 4006 2
原创 巧用 @JvmName 解决 Kotlin 函数签名冲突
Kotlin(JVM) 中定义下面这样两个方函数时,编译器会报错fun foo(value: List<String>) {}fun foo(value: List<Int>) {}Platform declaration clash: The following declarations have the same JVM signature (method(Ljava/util/List;)V):因为 Java 的泛型编译期擦除,所以 JVM 无法识别签名中泛型的区
2022-03-11 19:27:45 6245
原创 创建 ViewModel 的新方式,CreationExtras 了解一下?
Androidx-Lifecycle 在近期迈入到了 2.5.0 版本,其中最重要的一个变化是引入了 CreatioinExtras 的概念。一句话概括 CreationExtras 的作用:帮助我们在创建 ViewModel 时更优雅地获取所初始化参数1. 现状的问题先回顾一下目前为止的 ViewModel 的创建方式val vm : MyViewModel by viewModels()我们知道其内部其实是通过 ViewModelProvider 获取 VM。当 VM 不存在时使用 View
2022-03-07 01:54:35 3709
原创 像 Compose 那样写代码 :Kotlin DSL 原理与实战
1. 前言Kotlin 是一门对 DSL 友好的语言,它的许多语法特性有助于 DSL 的打造,提升特定场景下代码的可读性和安全性。本文将带你了解 Kotlin DSL 的一般实现步骤,以及如何通过 @DslMarker , Context Receivers 等特性提升 DSL 的易用性。2. 什么是 DSL?DSL 全称是 Domain Specific Language,即领域特定语言。顾名思义 DSL 是用来专门解决某一特定问题的语言,比如我们常见的 SQL 或者正则表达式等,DSL 没有
2022-02-28 09:00:00 4435 12
原创 为什么 RxJava 有 Single / Maybe 等单发数据类型,而 Flow 没有?
Coroutine Flow 与 RxJava 都是流式数据处理框架, 所以经常被拿来做比较,本文比较一下他们的数据类型。Rx 与 Flow 在单发数据支持上的不同RxJava 支持多种数据类型Observable :流式数据类型Flowable:与 Observable 类似,支持背压Single:单发数据类型,只能且必须发射一个数据Maybe:单发数据类型,发射零个或一个数据Completable:不发射任何数据,只通知流的结束。以上,Single<T>,Maybe&l.
2022-02-13 22:12:29 2135 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人