MultiType 源码学习小结

MultiType 是一个为 RecycleView 创建多种 Item 的 Android 库,它的设计简洁优雅,源码阅读体验也很好,本文记录了笔者研读此项目源码的感悟。 MultiType 的简单使用 开始之前,先来看下 MultiType 的总体类图 图中左侧 MultiTypeAdapter 是供外部访问的主要类,它的使用方式如下。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 class SampleActivity : AppCompatActivity() { private lateinit var adapter: MultiTypeAdapter private lateinit var items: MutableList<Any> override fun onCreate(savedInstanceState: Bundle?...

June 24, 2019

使用 Android Studio 阅读 AOSP 源码

上一篇文章介绍了 AOSP 9 在 macOS 10.14 环境下的编译方式,本文就 Andorid Studio 环境下阅读 AOSP 源码的方式进行记录。 阅读前 AOSP 的准备 开始之前我们先为 AOSP 生成 IDEA 工程文件,便于稍后在 Android Studio 中载入。 1. 为 AOSP 生成 Android Studio 工程配置文件 1 2 3 4 5 6 7 8 cd /Volumes/AOSP # 设置 AOSP 编译所需的环境变量 source build/envsetup.sh # 使用 idegen.sh 脚本生成 IDEA 工程文件 development/tools/idegen/idegen.sh ------------------------------- Read excludes: 4ms Traversed tree: 68826ms 稍等片刻,即可在 AOSP 目录下看到生成的 android.iml 和 android.ipr,其中 iml 文件 表示 information of modules, 用来描述 AOSP 的模块信息。ipr 文件 表示 IDEA project configuration ,用来描述 IDEA 的工程配置信息,双击此文件时系统将直接使用 Andorid Studio 打开此项目。...

June 23, 2019

使用 macOS 10.14 编译 Android 9.0

随着移动端设备增量的放缓和市场上各行各业 App 的饱和,连笔者的手机都很久未安装过新 App,更不用提更换手机的频率。与此同时,移动开发也由上半场拼点子拼速度的快捷玩法,进入到下半场拼质量拼生态的高阶玩法。作为一名一线开发人员,大环境的走向与业务形态的发展虽由不得我们控制,但核心技术的掌握则是我们可以身体力行的( 笑~)。 AOSP 是 Android 系统的代码,囊括了 Andorid 系统的全部内容,从应用开发 Framework 层到 Android 虚拟机 ART/Dalvik 层再到 Linux 内核层,所有的疑惑都能在源码中找到答案,其源码的重要性不言而喻。本文作为系列的开篇,主要对 AOSP 的下载、编译过程进行阐述,同时记录下过程中遇到的问题及解决方案。 笔者的系统版本为 macOS 10.14.5,截止文章发布时仍是最新的操作系统,AOSP-android-9.0.0_r42 的源码加编译产物需要 200G 的磁盘空间,请提前预留好磁盘空间。若主机磁盘空间不足,可使用外置移动硬盘来解决。 1. Xcode 的安装 Xcode 包含了编译过程所需的各种工具,如 git、clang、make 等,在编译之前,我们先处理好 Xcode 相关的问题。 截止到2019年6月,AOSP 仍不支持使用 Xcode 10 编译。虽可在 AOSP 配置文件增加 10.14 字段绕过该限制,但后续编译时仍会出现莫名其妙的错误。因此,建议直接使用 Xcode9.4 来避免此类问题。Xcode9.4 的下载地址为Apple Developer Download,登录苹果账号后选中 Xcode 9.4 条目即可看到下载按钮。 若之前已安装 Xcode10 或更高版本,建议在 Xcode9.4 下载成功后进行以下操作: 将原有 Xcode.app 更名为 Xcode10.app 或其他 解压缩 Xcode 9.4 对应的 Xcode.xip 文件,随后将解压缩出的 Xcode....

June 10, 2019

Android中同时finish多个Activity - 一次内存泄露的小记

Android开发中,有时需要同时finish多个Activity,避免用户点击后退按钮时回退到不该呈现的Activity。对于这样的问题,常见的方式是维护一个单例ActivityList,将多个Activity置入此单例列表,需要关闭多个Activity时可遍历该List依次执行finish操作。 代码如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 public class ActivityUtil { private static List<Activity> activityList; private static ActivityUtil instance; private ActivityUtil() { } public static ActivityUtil getInstance() { return null == instance ?...

July 17, 2018

Android MVP架构解析

前言 Android Architecture Blueprints 是谷歌官方开源的一组 Android 架构方案,项目以多个分支分别采用 MVP,MVVM 的概念以及 dagger、rxjava、databinding、livedata 等工具库,演示了一个简单的 TodoApp 在不同架构模式下的代码组织方式。这个项目中的代码非常规范,架构模式也非常有借鉴意义,是一个很有价值的学习素材。 本文将通过 项目组织、架构组织与通信、设计原则 这三个层次对项目中的todo-mvp分支进行解析,从而达到学习的目的。 项目概览 在分析之前,我们先通过截图来了解一下TodoApp的功能。 TodoApp 用来跳转列表页与统计页的抽屉窗口 统计页 列表页 详情页 编辑页 知晓了项目功能后,再来看项目的组织。 项目组织 在开始之前推荐大家先了解一下IDEA符号表,熟悉符号表对理解项目组织有很大帮助。 总览 app/src 除了 androidTest、main、test 这三个常见的模板目录外,还有androidTestMock、mock与prod 目录。androidTestMock 虽不常见,但通过名称可推断它是一个测试相关的目录,另外还有 mock、prod 这两个目录,我们稍后会讲到。 ## UI模块划分 app/src/main/java 下的 addedittask、statistics、taskdetail、tasks 这四个目录分别对应 App 内编辑页、统计页、详情页、列表页这四个模块,每个目录都有自己的 Activity、Fragment与Presenter,分别表示 MVP 中的 **View** 层和 **Presenter** 层,Contract 由字面意义推断为契约接口,此处暂且不表,稍后会在源码中了解其实际内涵。 ## Model层 app/src/main/java 下的 data 目录表示 **Model** 层,Task 是经final修饰的实体类模型,data/source 下有表示数据源接口的 TasksDataSource 与表示数据仓库类的 TasksRepository,data/source/local 与 data/source/remote 分别表示本地数据源与远程数据源,由ToDoDatabase及TastsDao可推断其local部分以数据库的形式实现。 最下方的 BasePresenter、BaseView 分别表示Presenter与View的基类,剩下的utils包用到时再进行查阅即可。...

July 8, 2018