Android
文章平均质量分 87
fundroid
Android GDE(谷歌开发者专家)| 互联网大厂移动端架构师
展开
-
从 Compnent Tree 视角看 Dagger 到 Hilt 的演变
Dagger 的本质是一棵组件树,而 dagger.android 和 Hilt 的诞生目的,都是通过不同的手段降低组件树的构建成本,减少模板代码。原创 2023-07-11 09:00:00 · 533 阅读 · 0 评论 -
Android 官方架构中的 UseCase 该怎么写?
如上所述,官方文档虽然对 UseCase 给出了一些基本定义,但是毕竟是一个新新生概念,很多人在真正去写代码的时候仍然会感觉不清晰,缺少有效指引。在究竟如何定义 UseCase 这个问题上,还有待大家更广泛的讨论,形成可参考的共识。本文也是带着这个目的而生,算是抛砖引玉吧。考虑到架构的扩展性,推荐在 ViewModel 与 Repository 之间强制引入 UseCase,即使当前的业务逻辑不复杂。原创 2023-05-24 09:00:00 · 1468 阅读 · 0 评论 -
Studio Bot - 让 AI 帮我写 Android 代码
Google 旗下的各类产品都成了其展示 AI 实力的舞台。连面向开发者的产品 Android Studio 也新增了Studio bot功能,希望通过 AI 帮助开发者更轻松地写代码:Studio Bot 使用谷歌编码基础模型Codey(后者基于最新 PaLM2 大语言模型)帮助开发者生成程序代码,提升生产力。我们还可以向 Studio Bot 询问有关 Android 开发的知识,或者帮助修复当前代码中的错误。原创 2023-05-12 09:00:00 · 4483 阅读 · 0 评论 -
CameraX + MLKit 打造超简单 OCR 方案
Android 自 5.0 开始引入了全新的相机框架 Camera2 ,相较于之前的 Camera1 对多摄像头的支持更加友好,功能更加强大,但使用成本也更高。此背景下谷歌发布了 CameraX,它基于 Camera2 封装,大大提高了 API 的易用性。我们可以用很少的代码搭建出面向特定场景的相机应用,OCR 就是一种典型的相机应用场景。CameraX 引入 UseCase 的概念完成各种相机能力,UseCase 有利于功能模块的解耦,聚焦特定领域进行功能开发。原创 2023-02-01 08:30:00 · 2466 阅读 · 0 评论 -
Android Studio 支持安卓手机投屏
当我们需要手机投屏时会使用到 ApowerMirror,LetsView,Vysor,Scrcpy 等工具。如果你是安卓手机,现在可以使用 Android Studio 进行投屏原创 2023-01-19 01:16:55 · 10964 阅读 · 0 评论 -
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 · 2754 阅读 · 0 评论 -
Fragment 这些 API 已废弃,你还在使用吗?
盘点 Fragment 被废弃的 API:onActivityCreated,startActivityForResult,setTargetFragment,setRetainInsInstance原创 2022-07-18 09:00:00 · 1622 阅读 · 0 评论 -
盘点 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 · 4207 阅读 · 0 评论 -
有关 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 · 1576 阅读 · 4 评论 -
Android 小知识:startActivity 与 finish 的调用顺序
我们经常遇到这样的场景:关闭当前 Activity 然后启动一个新 Activity,比如但我们从 Spash 开屏页跳转到 Main 的时候。此时,代码一般会这样写:startActivity(intent)finish()但你有没有想过如果掉换了两者顺序会是怎样?finish()startActivity(intent)从行为上看似如没有什么变化,但实际系统处理上有细微区别,Splash 作为 Activity 栈里唯一的对象被 finish 之后,启动的新 Activity 被添加原创 2022-04-28 16:52:45 · 3350 阅读 · 3 评论 -
创建 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 · 3619 阅读 · 0 评论 -
Jetpack Compose 动画 API: AnimatedVisibility & AnimatedContent
Jetpack Compose 的动画相关的 API 数量众多,分为低级别 API 和高级别 API,其中高级别 API 便于使用者针对具体场景开箱即用 ,其中最常用的当属 AnimatedVisibility 和 AnimatedContent 这两个了。1. AnimatedVisibilityAnimatedVisibility 顾名思义是用动画的方式改变 UI 元素的 Visibility,具体来说就是针对让其内部的 Composable 以动画的形式进入或退出屏幕AnimatedVisi原创 2022-01-24 09:00:00 · 1502 阅读 · 2 评论 -
使用整洁架构优化你的 Gradle Module
前言现代的 Android 项目都是 Gradle 工程,所以大家都习惯于用 Gradle Module 来划分和组织代码,Module 的大量使用也带来一个问题,一个大项目往往几十上百的 Module,但是当数量众多的 Module 之间的依赖关系不合理时,仍然会严重拖慢工程的编译速度,如何更科学地组织 Gradle Module 是 Android 开发领域的普遍需求。很多从事 Android 开发的同学都听说过 Clean Architecture,也就是所谓整洁架构。Google 推荐我们原创 2022-01-12 17:01:22 · 570 阅读 · 0 评论 -
Jetpack MVVM 七宗罪之五: 在 Repository 中使用 LiveData
由于 LiveData 简单好用再加上官网早期的推荐,很多人会将 LiveData 用在 Domain 甚至 Data 层等非 UI 场景,这样的用法并不合理,也已经不再被官方推荐。原创 2022-01-04 11:52:51 · 3298 阅读 · 4 评论 -
Jetpack MVVM 七宗罪之四: 使用 LiveData/StateFlow 发送 Events
久违的 “ Jetpack MVVM 七宗罪 ” 系列,今日再开。本系列主要盘点 MVVM 架构中各种常见错误写法,并针对性的给出最佳实践,帮助大家掌握 Jetpack 组件最正确的使用姿势。Jetpack MVVM 七宗罪之一: 拿 Fragment 当 LifecycleOwnerJetpack MVVM 七宗罪之二: 在 launchWhenX 中启动协程Jetpack MVVM 七宗罪之三: 在 onViewCreated 中加载数据前言在 MVVM 架构中,我们通常使用 Liv.原创 2021-12-27 00:32:39 · 2334 阅读 · 0 评论 -
【Android】实战图像识别:Compose + MLKit + CameraX
MLKit 是 Google 提供的移动端机器学习库,可以在 Andorid 或 iOS 上低成本地实现各种 AI 能力,例如图像、文字、人脸识别等等,而且很多能力可以在手机端离线完成。https://developers.google.com/ml-kit下面通过代码示例展示 MLKit 的以下功能:图像识别(Image Labeling)目标检测(Object Detection)目标追踪(Object Tracking)1. 图像识别(Image Labeling)图像识别是原创 2021-11-25 13:57:35 · 10118 阅读 · 3 评论 -
@OnLifecycleEvent 遭废弃,推荐使用 DefaultLifecycleObserver 替代
近期 androidx.lifecycle 发布了 2.4.0 版本,此次更新中 @OnLifecycleEvent 注解被废弃,官方建议使用 LifecycleEventObserver 或者 DefaultLifecycleObserver 替代现代的 Android 应用中都少不了 Lifecycle 的身影,正是各种 lifecycle-aware 组件的存在保证了程序的健壮性。Lifecycle 本质是一个观察者模式的最佳实践,通过实现 LifecycleObserver 接口,开发者可原创 2021-11-09 11:46:56 · 11651 阅读 · 1 评论 -
展望2022:Android开发技术动向
每年9/10月份 Google 都会举行为期约2天的 Android Dev Summit,在活动上 Google 的技术专家们会分享一些 Android 领域的技术动向以及开发心得。今年 Summit 的 Slogan 是 “Excellent apps,across devices” , 即使用 Jetpack 等 MAD Skill (Moden Android Development) 开发出更优秀的应用,并通过 Android 系统落地到更多种类的智能设备。本次活动围绕这一主旨做了 30 多场原创 2021-11-04 18:37:13 · 1968 阅读 · 0 评论 -
【Android】我用 ARCore 做了一个 1:1 的高达
借助 ARCore 和 Sceneform 在 Android 手机上轻松实现一个 1:1 的高达,效果惊艳!原创 2021-09-10 17:25:52 · 2153 阅读 · 6 评论 -
Jetpack MVVM 七宗罪之三:在onViewCreated中请求数据
Jetpack 的 MVVM 本身没有错,错在开发者的某些使用不当。本系列将分享那些 AAC 中常见的错误用法,以帮助大家打造更健康的应用架构原创 2021-08-14 18:28:17 · 1653 阅读 · 4 评论 -
Jetpack MVVM 七宗罪之一:使用 Fragment 作 LifecycleOwner
首先承认这个系列有点标题党,Jetpack 的 MVVM 本身没有错,错在开发者的某些使用不当。本系列将分享那些 AAC 中常见的错误用法,以帮助大家打造更健康的应用架构Fragment 作为 LifecycleOwner 的问题MVVM 的核心是数据驱动UI,在 Jetpack 中,这一思想体现在以下场景:Fragment 通过订阅 ViewModel 中的 LiveData 以驱动自身 UI 的更新关于订阅的时机,一般会选择放到 onViewCreated 中进行,如下:override f.原创 2021-08-02 09:32:45 · 3269 阅读 · 4 评论 -
FragmentFactory + Koin 实现Fragment依赖注入
FragmentFactory 允许开发者使用带参数的构造函数创建 Fragment, 能够在 dagger、koin 等DI 框架的使用场景中发挥作用。原创 2021-07-26 12:19:08 · 928 阅读 · 0 评论 -
【Android】使用 Result API 实现 Fragment 间的通信
今年 Google I/O 上介绍了 Jetpack 近期的更新内容,其中包括 Fragment 新增的 Result API 。本文借机盘点一下 Fragment 各种常见的通信方式。Fragment 间的通信可以借助以下几种方式实现:EventBusActivity(or Parent Fragment)ViewModelResult API1. 基于 EventBus 通信EventBus 的优缺点都很突出。 优点是限制少可随意使用,缺点是限制太少使用太随意。因为 Event..原创 2021-06-21 00:24:24 · 2086 阅读 · 11 评论 -
巧用 ContentProvider 帮助你的 Library 实现无侵初始化
在使用某些第三方库时,经常需要为其传入 Context 以保证其正常工作。一般我们在 Application 的 onCreate 中进行初始化操作。此时推荐一个小技巧:借助 ContentProvider 实现完全"无侵"的初始化, 让 SDK 更加易用。ContentProvider 初始化原理ContentProvider 的 onCreate 的调用在 Application 的 attachBaseContext 和 onCreate 之间, 此时 Application 已经创建成功,.原创 2021-05-28 02:09:21 · 1234 阅读 · 10 评论 -
面试题:ViewPager中的Framgent如何实现懒加载?
setUserVisiblity已被废弃,推荐使用 setMaxLifecycle 处理 Fragment 在 ViewPager 中的懒加载原创 2021-05-13 22:26:42 · 943 阅读 · 7 评论 -
Android Gradle plugin requires Java 11 问题解决
AGP 7.0.0-alpha02起需要使用Java 11当Java版本不正确时,Gradle的sync阶段回报错如下:An exception occurred applying plugin request [id: 'com.android.application']> Failed to apply plugin 'com.android.internal.application'. > Android Gradle plugin requires Java 11 to run. You原创 2021-04-26 09:47:04 · 117656 阅读 · 28 评论 -
基于OpenAPI Specification自动生成Android客户端代码
OpenAPI Specification(OAS)Swagger Specification 是一种 API Specification(API 规范),2015 年,SmartBear Software 将 Swagger Specification 捐赠给 Linux Foundation,并改称为 OpenAPI Specification,简称(OAS)。SmartBearSoftware 也作为 OpenAPI Initiative(OAI)的创始成员,该机构以开放和透明的方式管理 OAS原创 2021-04-25 00:58:25 · 1425 阅读 · 1 评论 -
用Jetpack Compose做一个俄罗斯方块游戏机
本文介绍如何使用Jetpack Compose打造一个经典版的俄罗斯方块游戏。玩过上面这种游戏机的朋友应该会对本文内容感到亲切,废话不多说,先看东西:1. 为什么Compose适合做游戏?通常一个游戏程序的执行流程如下所示:简单说就是一个不断等待输入、渲染界面的过程。这种模型非常符合当下前端的开发思想:数据驱动UI。 因此基于各种前端框架的小游戏层出不穷。相比之下,用客户端开发同类应用成本则会高出不少。如今有了Compose,客户端终于在开发范式上追上了前端的步伐,像前端那样开发小游戏成原创 2021-04-20 10:00:22 · 2447 阅读 · 19 评论 -
Jetpack Compose:理解composable的重组范围(Recomposition Scope)
不少初学Compose的同学都会对Composable的Recomposition(重组or重绘)机制心生顾虑,担心大范围的Recomposition是否会影响性能。其实Compose的Compiler在编译期做了大量工作,保证了Recomposition的范围尽可能的小,从而避免无效开销。那么Recomposition的范围究竟是怎样的呢?我们通过一个例子来了解一下@Composablefun Foo() { var text by remember { mutableStateOf("")原创 2021-04-12 21:08:20 · 2282 阅读 · 2 评论 -
告别GIF,使用Jetpack Compose打造可爱的天气动画
1. 项目背景最近,为了参加Jetpack Compose挑战赛的终极挑战,使用Compose完成了一个天气app。之前几轮挑战也都有参与,每次都能学到不少新东西。如今迎来最终挑战,希望能将这段时间的积累活学活用,做出更加成熟和出色的作品。项目中的挑战因为没有美工协助,所以我考虑基于代码实现app中的所有UI元素例如各种icon等,这样的UI在任何分辨率下都不会失真,更灵活地实现各种动画效果。为了降低实现成本,我将app的UI元素定义成偏卡通的风格,这样可以更容易通过代码绘制,如文章顶部展示的那些.原创 2021-03-28 21:08:42 · 2701 阅读 · 17 评论 -
告别XML,使用Compose Theme为你的app轻松换皮
1. Compose挑战赛第三周关注过我前面文章的朋友应该对最近举行的Compose挑战赛有所了解,本周挑战赛进入到第三轮。#AndroidDevChallenge Week 3与前两轮规则不同,本轮主要是比拼速度。只有第一个按要求完成并提交的人能胜出,奖品是Pixel 5手机一台。题目要求基于Compose完成以下三个页面,Google会提供完成页面必须的一些资源以及视觉设计稿。题目本身难度不高,主要是拼手速。自从结婚后老夫的手速退化严重,top1出线就不指望了,但本着重在参与的精神仍然坚持完原创 2021-03-14 01:54:58 · 3683 阅读 · 21 评论 -
LaunchedEffect:在Jetpack Compose中使用协程
LaunchedEffectLaunchEffect允许我们在Composable中使用协程@Composable fun DisposableEffect( vararg keys: Any?, effect: DisposableEffectScope.() -> DisposableEffectResult): Unit像DisposableEffect一样,当Composable进入composition时执行block当Composable从树上detac.原创 2021-03-08 00:06:00 · 8572 阅读 · 1 评论 -
使用Jetpack Compose竟能做出如此漂亮的倒计时APP
Jetpack Compose开发者挑战赛迎合Jetpack Compose beta版的发布,Google官方发起了Compose开发者挑战赛活动,目前已经入第二周。第二周的题目是一个完成一个倒计时APP ,可能涉及到state以及animation的使用: android-dev-challenge-2我的作品废话少说,先看一下我提交的项目...原创 2021-03-07 02:32:56 · 3376 阅读 · 8 评论 -
对Jetpack Compose设计的初步解读与思考
原文链接:https://www.jianshu.com/p/7bff0964c767Jetpack Compose前段时间进入了Alpha阶段。经过去年年底至今剧烈的api变化后,现在Compose整体上大致稳定,所以我们也能对于Compose的设计进行初步的解读和评价了。Compose从整体技术风格上来说是这样一个产物:在语法上激进模仿SwiftUI,编译/运行过程充满Svelte风格,同时也综合了各方包括Android开发组自身对UI框架的思考结果。使用Compose时,最值得关注的就是C..转载 2021-03-02 15:15:23 · 926 阅读 · 2 评论 -
Jetpack Compose Animations 超简单教程
Node:本文基于Jetpack Compose 1.0.0-beta01Animation是由state驱动的Compose的核心思想状态驱动UI刷新,这一思想同样体现在动画上。Compose动画主要是通过不断计算最新的state值来刷新UI,这类似于传统的ValueAnimator,根据动画的插值器和估值器计算当前value,在映射到View的对应属性。Compose天然是基于state驱动的,相关API变得更加简单、合理。AnimateAsState:属性动画AnimateAs..原创 2021-03-02 02:55:46 · 3599 阅读 · 0 评论 -
Jetpack Compose迎来Beta版!!快来参加Android开发挑战赛!!
Jetpack Compose迎来Beta版本近日,Jetpack Compose发布了第一个beta版本1.0.0-beta01,官方Samples也第一时间进行了同步升级。通过Release Note可以看到,本次新版本跟之前历次alpha版本的迭代一样依然以大量API的调整为主,很多API名字或接口签名发生变化,此外就没什么里程碑式的更新了,所以beta01说是alpha13也不为过。这宣布着Compose进入了一个新的阶段,按照目前进度,有可能在年底之前迎来正式版的发布AndroidDevC原创 2021-02-28 00:58:04 · 580 阅读 · 4 评论 -
Jetpack Compose Modifier 使用入门
Modifier是Compose中的重要概念,能够让UI呈现更加专业、好看的视觉效果。为什么使用Modifier?常规的View体系中,控件以实例对象的形式存在,控件可以在实例化之后再动态配置属性,但是Composable本质上是函数,只能在调用的同时通过参数传递进行配置,如果没有Modifier,参数签名会变得很长(虽然Kotlin支持默认参数)。使用Modiifer可以很好地解决这个问题,它就像Composable的配置文件,可以在此对Composable的样式和行为进行统一配置。Mod.原创 2021-02-22 00:12:07 · 2034 阅读 · 0 评论 -
Kotlin Symbol Processing(KSP)使用初体验
近日,android官方发布了Kotlin Symbol Processing(KSP)的alpha版本。Announcing Kotlin Symbol Processing (KSP) Alpha为什么使用KSP?很多人在使用Kotlin时的痛点之一就是编译速度过慢。很多常见的三方库都通过注解简化模板代码,例如Room、Dagger、Retrofit等,Kotlin使用KAPT处理注解,KAPT没有专门的注解处理器,需要借助APT实现的,因为APT只能处理Java,所以KAPT需要生成A.原创 2021-02-18 16:02:27 · 6826 阅读 · 1 评论 -
Jetpack Compose SideEffect:副作用及相关API
Jetpack Compose提供了一些列用于处理副作用SideEffect相关的API,包括DisposableEffect、SideEffect、LaunchedEffect、rememberCoroutineScope、produceState等,通过Effect的API还可以适配第三方框架例如LiveData、Rxjava、Coroutine Flow等原创 2021-02-17 19:48:55 · 2668 阅读 · 11 评论 -
关于Jetpack Compose重绘(Recomposition)的一个坑
最近尝鲜Jetpack Compose时,踩了一个坑,可能是很多人都容易忽略的问题,特此记录一下。当前最新版本: 1.0.0-alpha11Compose重绘关于Compose的重绘(Recomposition),官方是这样介绍的:Recomposition skips as much as possibleWhen portions of your UI are invalid, Compose does its best to recompose just the portions th.原创 2021-02-14 12:35:50 · 1946 阅读 · 4 评论