
android开发
文章平均质量分 77
张可_
热爱生活的有志青年。
展开
-
Clean 架构下的现代 Android 架构指南
用 Clean 架构开发 Android 应用,彻底解决代码混乱问题,应该是 Android 目前最好用的架构了!原创 2023-12-04 17:58:17 · 1483 阅读 · 0 评论 -
用 Compose 做了个开源的轻量级的 Notion 客户端 NotionLight,现已上架 Google Play。
迫于 Notion 的客户端比较慢,而且操作路径有点长,如果想当做快速笔记或者 TODO 来用还是不太够。正好前段时间因为疫情在家待了三个月没出门,打算学学 Compose,所以顺便 😃 用 Notion 的 API 卷了个简单快速的客户端出来。既然是当做快速笔记以及 TODO 来用,那内容的组织形式就是按照列表来的,会把 Notion 中的每个能被识别的内容块映射成列表中一个条目展开显示。每个 Notion 页面对应 NotionLight 中的一个 TAB。授权后自己选择将 Notion 中的对应的页.原创 2022-06-18 12:41:19 · 1031 阅读 · 1 评论 -
Android Studio 4.1 更新内容
概览Android Studio 4.1 目前已经发布,该版本共修复了2370 个 bug 以及 275 个 issue,主要包含如下新增功能:设计Material Design 组件库的更新开发Database Inspector 功能直接在 Android Studio 中运行模拟器Dagger 导航支持使用 Apply Changes 模型构建与测试Android 模拟器支持折叠屏Apply Changes 更新从 AAR 中导出 C/C++ 中的依赖native原创 2020-10-13 10:13:13 · 3281 阅读 · 6 评论 -
WMS-Window的添加流程
总览我在上一篇文章介绍了 Activity 的启动流程,一直讲到到 WMS 这里结束,这篇文章讲沿着上篇文章的脉络继续分析下去。这篇文章不仅仅是 Window 的添加过程,也会涉及到一些 WMS 相关的原理。我希望能通过了解 Window 添加流程来掌握整个 WMS 的架构,从而对其产生一个完整的印象,至于旁枝末节也不着急深入的理解,有空就看看,这样后面遇到相关的问题也能知道个大概。先看一下 Window 的添加过程:上一篇文章讲了 AMS 将会调用 WMS 中的几个方法,也就是上图中从 AMS原创 2020-07-10 15:24:59 · 743 阅读 · 2 评论 -
Activity 启动流程分析(Android10)
概览Activity 启动流程比较复杂,分析起来很容易陷入复杂的代码中去,所以我这篇分析文章不会深入的分析代码细节,尽量抛开不重要的东西把启动流程按照重点分成几个部分来分析。下图是 Activity 启动流程的总览。(上图红色方块是与 WMS 关联的部分,后面会从这里开始介绍 WMS)后面我们将以 Android 29 为例,按照上图步骤逐步分析。Intent 解析到 Activity调用 startActivity 之后,经过几步辗转最终会调用到 AMS 中,而 AMS 又会调用 Activ原创 2020-06-23 14:53:42 · 4519 阅读 · 3 评论 -
Android Service 基础与使用
Service 作为 Android 四大组件之一,有着非常重要的作用,Service 被设计为在后台长时间执行而不需要提供页面的任务。Service 基础知识Service 的生命周期如下图所示:启动/关闭 Service通过如下代码既可启动 Service。val intent = Intent(this, SampleService::class.java)startServi...原创 2020-04-15 22:21:03 · 508 阅读 · 0 评论 -
Gradle 依赖与 Plugin
关于 Gradle 中的基础、Task 等知识,可以看我的上一篇文章。Gradle 中的依赖Gradle 中的依赖可以分为脚本文件依赖、插件依赖以及包依赖。脚本文件依赖随着项目结构的复杂,一个 build.gradle 已经无法满足我们的需求了,尤其是对依赖库版本的配置,如果多个 project 都需要用到某个依赖库,稍有不慎版本就会错乱,从而引发一些问题。此时我们期望可以把所有用到的依...原创 2020-03-08 18:49:32 · 2763 阅读 · 0 评论 -
Gradle 扫盲与 Task 基础
Gradle 是用于构建项目的工具,除了管理依赖库之外,Gradle 还支持我们自己添加编译脚本、添加编译配置等控制项目的构建,通过提供 API 我们可以控制编译的每一步操作。Gradle 目前使用最广泛的是 Android 项目的构建,几年前 Google 推出 Android Studio 的同时也把它也推选为默认的构建工具,因此我们也经历了从 Maven 到 Gradle 这一痛苦的转变过...原创 2020-03-08 18:22:44 · 411 阅读 · 0 评论 -
OkHttp 源码分析
流程分析我们从一个简单的 HTTP 请求开始:client = new OkHttpClient();Request request = new Request.Builder().url("your url").build();//同步发起请求Response syncResponse = client.newCall(request).execute();//异步发起请求clie...原创 2020-02-03 10:55:39 · 576 阅读 · 0 评论 -
Flutter Widget 最全使用介绍
Flutter widget 的设计思想跟 Android 略有不同,Flutter 中的 widget 可以用两条规则来约束:一切都是 widget每个 widget 只负责自己关注的部分第一条意味着你所看到的东西都是由于 widget 构成,跟安卓不同的是,原本在安卓中一些参数相关的东西到了 Futter 中都被 widget 化,例如大小、背景、margin、padding 等等原...原创 2019-12-02 15:14:10 · 1405 阅读 · 1 评论 -
Hello Flutter
Flutter 是 Google 在 2015 年发布的一款跨平台 UI 开发工具包,支持 Android 及 iOS 平台,同样也是 Google Fuchsia 的主力开发工具。作为 Android 开发有学习 Flutter 的必要吗?个人觉得很有必要,首先这是 Google 在主推的一个项目,并且国内阿里腾讯等等大厂都已经有使用 Flutter 开发的项目了,有他们背书,不用怕有什么填不...原创 2019-11-11 20:00:53 · 464 阅读 · 0 评论 -
ConstraintLayout 使用介绍
ConstraintLayout 是个功能超级强大的布局,很多复杂的布局之前需要很多层嵌套现在都可以使用一个 ConstraintLayout 来解决,很大程度上解决了布局嵌套层级过多问题,不仅如此,还提供了很多其他高级功能,对习惯用拖拽布局的同学也很友好。其中主要包含了如下几个功能点:相对定位(Relative positioning)居中定位(Centering position)及偏...原创 2019-10-15 18:20:51 · 382 阅读 · 0 评论 -
Volley使用与扩展(POST,Cookie)
Volley 的简单使用使用 StringRequest 通过 GET 方式获取数据:RequestQueue mQueue = Volley.newRequestQueue(context);String Url = "http://www.baidu.com";StringRequest request = new StringRequest(Url, new Response.Listen原创 2017-05-10 14:22:46 · 625 阅读 · 0 评论 -
网络流 InputStream 的读取
InputStream 读取相信大家都不陌生,网上搜一下也有很多种方法,但是关于网络流 InputStream 的读取这两天我倒是发现了一个坑,在这里记录一下。最开始我使用的是 Apache 的 IOUtils#toString 方法直接将 InputStream 转为 String,大多数情况下这样做都没什么问题,毕竟是 Apache 家的东西。但是这两天写接口时遇到了一个问题,当我接收到 ...原创 2019-05-16 23:58:32 · 4475 阅读 · 1 评论 -
Android 多点触控及应用(画板控件 DrawView)
多指触控是指监听多个手指的触控事件,我们可以重写 View 中的 onTouchEvent 方法,或者使用 setOnTouchListener 方法来处理触摸事件。首先我们来看一下如何判断多指触摸时的事件类型。MotionEvent 中的事件类型一般而言,我们通过判断 MotionEvent 的 action 来判断输入事件类型,从而做出相应的处理。在不考虑多指的情况下,我们一般只关注如...原创 2019-06-12 23:03:06 · 2193 阅读 · 4 评论 -
Android事件分发机制
事件分发机制事件分发机制是 Android 开发者的必备技能,关于这方面的博客也有很多,最近准备夯实一下自己的基础知识,整理一下零散的知识点,为突破做准备,所以再来梳理一下事件分发机制。大多介绍事件分发机制的文章都只叙述了 View 与 ViewGroup 的事件分发机制,我这里将从 Activity 开始介绍。一般来说,事件传递的顺序是:Activity->ViewGroup-Vie...原创 2019-06-06 21:10:59 · 1446 阅读 · 1 评论 -
Android Matrix详解
我们在自定义 View 控件时随处可见 Matrix 的身影,主要用于坐标转换映射,我们可以通过 Matrix 矩阵来控制视图的变换。Matrix 本质上是一个如下图所示的矩阵:上面每个值都有其对应的操作。Matrix 提供了如下几个操作:缩放(Scale)对应 MSCALE_X 与 MSCALE_Y位移(Translate)对应 MTRANS_X 与 MTRANS_Y...原创 2019-06-13 23:04:41 · 1737 阅读 · 0 评论 -
Kotlin 从零到一
2017 年 Google 宣布 Android 为 Kotlin 提供最佳支持并且取代了 Java 的位置,Kotlin 逐渐步入大众的视野。Kotlin 项目最早可以追溯到 2010 年,JetBrains 团队准备开发一款现代化、更强大、更易用的语言,经过五年多的开发,JetBrains 终于在 2016 年年初发布了 Kotlin v1.0 版本。至今已经过了三年多,Android 最新...原创 2019-08-04 22:37:12 · 174 阅读 · 0 评论 -
Kotlin 中的泛型介绍
泛型类型参数泛型允许你定义带类型形参的类型。当这种类型的实例被创建出来的时候,类型形参被替换成称为类型实参的具体类型。使用方式和 Java 一样:List,Map<K, V>。同样,Kotlin 也可以自动推导类型:val authors = listOf("Dmitry", "Svetlana")和 Java 不同的是,Kotlin 始终要求类型实参要么被显示的说明,要么...原创 2019-08-18 21:25:14 · 893 阅读 · 0 评论 -
Kotlin 中的 lambda,这一篇就够了
lambda 本质上是可以传递给函数的一小段代码,Kotlin 与 Java 中的 Lambda 有一定的区别,除了对 lambda 的全面支持外,还有内联函数等简洁高效的特性。下面我们来仔细看一下。高阶函数我们知道,lambda 的应用场景就是高阶函数,我们可以把一个 lambda 当做参数传递到高阶函数中,获取返回一个 lambda。准确的来说,高阶函数就是以另一个函数作为参数或者返回值...原创 2019-08-16 23:15:27 · 1288 阅读 · 0 评论 -
DataBinding 使用介绍
DataBinding 是 Google 在 Jetpack 中推出的一款数据绑定的支持库,利用该库可以实现在页面组件中直接绑定应用程序的数据源。使其维护起来更加方便,架构更明确简介。简介那么 DataBinding 本质上到底是个什么呢?它在开发正扮演着什么样的角色?我们应该如何使用?DataBinding 名为数据绑定,他的功能很简单,就是将数据绑定在 UI 页面上(这不是废话吗),明白...原创 2019-09-18 11:49:04 · 689 阅读 · 0 评论 -
WebSocketDemo 安卓客户端实现及代码封装,3.0 版本发布
介绍WebSocket 3.0 版本经过这段时间的开发终于完成并且通过测试,相比较于 2.0 版本有了很大的改动,程序的健壮性与扩展性有了很大的提高。实际上,以前的版本很大程度上都是为了应付公司业务而做的,顺手开源出来,但我发现随着使用者越来越多,问题也逐渐凸显出来,再加上经过前段时间的学习技术上有了长足的进步,就想着把这个给重构一遍。其实做这个技术上并没有什么技术上的难点,但是要做开源,要...原创 2019-05-05 09:20:40 · 4285 阅读 · 13 评论 -
Glide 源码分析解读-缓存模块-基于最新版Glide 4.9.0
缓存模块缓存模块涉及到的东西比较多,比较重要,所以需要单独用一章节来讲。关于缓存的获取、数据加载相关的逻辑在 Engine#load 方法中。先来看看缓存流程,流程如下图:全部的缓存流程大致如上图所示。Glide 实例化时会实例化三个缓存相关的类以及一个计算缓存大小的类://根据当前机器参数计算需要设置的缓存大小MemorySizeCalculator calculator = n...原创 2019-03-20 17:21:26 · 1003 阅读 · 0 评论 -
RecyclerView 上拉加载 PullToRefreshRecyclerView
设计思路ListView 上拉加载很容易实现,监听 ListView 滑动到底部,显示 FootView 即可,但是 RecyclerView 没有 addFootView(View view) 这个方法,有一种方案是在 adapter 中加一个 itemView 用于显示 FootView,但是这样做就得每一个使用到 RecyclerView 的地方都写一遍重复代码,而且不能适配多种类型的 Lay原创 2017-09-24 15:15:04 · 1155 阅读 · 0 评论 -
Android View坐标系详解(getTop()、getX、getTranslationX...)
View 提供了如下 5 种方法获取 View 的坐标:1. View.getTop()、View.getLeft()、View.getBottom()、View.getRight();2. View.getX()、View.getY();3. View.getTranslationX()、View.getTranslationY();4. View.getLocationOnScreen(原创 2016-12-20 00:15:48 · 38912 阅读 · 12 评论 -
适用于小型项目的 Android MVP 架构
## MVP 架构介绍其实没什么好介绍的了,网上有很多相关的文章,我就不去 copy 了,反正就是 Google 公司推出的一个适合中大型 Android 项目开发的架构。之前做了一个项目使用的就是 MVP 架构,通过这么久的使用总结发现 MVP 并不适合小型项目。用过的人都知道,MVP 架构要求接口繁多,一个简单的 Activity 本来一两个类就能解决,用了 MVP 之后类数量瞬间激增,有点原创 2017-07-30 03:44:43 · 1849 阅读 · 0 评论 -
Handler 机制深入理解(Handler、Looper、MessageQueue)
HandlerHandler 主要用于在不同的线程中相互通信,使用场景最多的应该就是在子线程中更新 UI。 与 Handler 相关的类: Handler:处理与发送消息(Message)Message:消息的包装类Looper:整个 Handler 通信的核心,接受 Handler 发送的 Message,循环遍历 MessageQueue 中的 Message,并发送至 Handler原创 2017-06-25 15:42:18 · 585 阅读 · 0 评论 -
Android自定义数字验证码输入框
先上效果图设计思路刚开始想过使用EditText来实现,但是具体实施时发现并不是这么容易,而且还有一堆的坑,不如直接继承View自定义来的方便,先在onDraw方法中绘制边框及验证码,调整弹出输入法只能输入数字,监听输入法输入,每输入一个字符都需要重新绘制,另外考虑到扩展性需要重写onMeasure方法来计算View的大小。具体实现首先需要在onDraw中绘制外面带有圆角的矩形边框以及数字中间的分割原创 2017-04-07 15:21:36 · 4967 阅读 · 0 评论 -
Android View的measure过程详解
注意阅读本文至少需要先了解MeasureSpec的工作原理,可以参见网上其他相关博客,本文不做解释。measure介绍顾名思义,measure方法用于测量View的大小,由View所在的ViewGroup调用:child.measure(childWidthMeasureSpec, childHeightMeasureSpec);其中的 childWidthMeasureSpec 和 childHe原创 2017-03-05 23:38:04 · 591 阅读 · 0 评论 -
【QRCodeView】更专注的 Android 二维码扫描的控件
前言QRCodeView 基于 Google 的 zxing 进行二次开发,简化二维码的相关操作、优化识别速度。由于整个 zxing 框架中不仅包含了二维码识别相关的代码,还包括其他格式如条形码等等的代码,体量较大,实际开发中一般只需要使用二维码,故本项目中删除了不必要的代码。本项目不仅提供了使用摄像头预览实时识别二维码,还有如生成一张二维码图片,生成一张带有 logo 的二维码图片等等。 注意原创 2018-01-02 16:32:27 · 2047 阅读 · 2 评论 -
WebSocket 安卓客户端实现及代码封装
WebSocketDemoWebSocket 安卓客户端的实现方式。介绍如果不想了解其中的原理可以直接拉到最后面的使用方式章节,按照教程使用即可,或者直接打开 demo 查看代码,代码地址:。 https://github.com/0xZhangKe/WebSocketDemo本文使用一个后台 Service 来建立 WebSocket 连接,Activity 与 Fragm原创 2018-01-28 23:08:15 · 19967 阅读 · 10 评论 -
高效的 Android 日志记录框架 ZLog
ZLog用于记录 Android 运行时产生的日志、Crash 等信息并保存到本地文件中的框架。 代码地址: https://github.com/0xZhangKe/ZLog使用方式首先添加 ZLog 依赖:compile 'com.github.0xZhangKe:ZLog:3.0'在使用前需要通过日志的输出文件夹对其初始化,例如下面这样:ZLog.Init(Str...原创 2018-01-26 18:11:54 · 4189 阅读 · 0 评论 -
Glide 源码分析解读-基于最新版Glide 4.9.0
项目编译项目基于最新版 Glide 4.9.0 源码分析,通过如下方式获取并编译代码:git clone https://github.com/bumptech/glide.gitcd glide./gradlew jar代码量(使用 cloc 统计):这么多的代码,直接看肯定让人头疼,理不清头绪,但好在 Glide 分包结构明确,我们可以先根据不同的模块来逐个击破。总览有一点...原创 2019-03-20 16:16:12 · 3857 阅读 · 1 评论 -
Java 树的遍历-深度优先(DFS)与广度优先搜索(BFS)递归版与非递归版
介绍最近系统学习算法时发现网上关于这两种算法的文章参差不齐,不太统一,自己也花了点时间总结了一下,现在在这里分享出来。树的实现树是一种特殊的有向图,实现方式有很多,我这里用最常见也是最简单的方式来实现:public class TreeNode&lt;V&gt; { private V value; private List&lt;TreeNode&lt;V&gt;&gt...原创 2019-02-28 00:21:46 · 4788 阅读 · 0 评论 -
一个 NullPointerException 引发的血案
最近比较忙,好久没写博客了,这周正好遇到个小问题,就拿过来说说,一不注意就会犯错。Bug 背景产品部门突然提了个需求,APP 中所有的对话框选择框啊只要是弹出来的框风格全部要统一成一种样式,所以为了应对各种各样的 Dialog ,我就写了个 BaseDialog 基类,只封装了最基础的样式。对话框至少要包含:普通提示、警告提示、信息确认框、普通文本选择器、时间选择器、日期选择器、城市选择器等等...原创 2018-12-23 00:35:31 · 451 阅读 · 0 评论 -
【开源】Android开源项目:始终
介,,介绍内个什么,这是一个 Android 平台的 APP,项目基于 RxAndroid+Retrofit+Glide 开发,使用MVP架构(好像大家都喜欢这么写…)。最近经济什么的不太好大家都知道,毛衣战啊睡改啊什么的,好多公司开始裁员,跳槽跳不动(主要是我太菜了),尤其是我们小安卓,再加上异教徒前端一晚上一个的框架的冲击,感觉都要失业了。然后我就想着要攒钱娶媳妇,这种环境下最应该做的...原创 2018-10-02 21:07:26 · 341 阅读 · 0 评论 -
WebSocket 安卓客户端实现及代码封装
介绍关于 WebSocket Android 端的使用封装之前已经做过一次了,但在使用了一段时间之后逐渐发现了一些问题,一直想改也没时间,正好最近公司业务比较少,就趁着这段时间有空闲把代码优化了一下,其实差不多是重新做一套了。 这个版本的使用方式上比之前简化了很多,集成起来也更容易,并且代码逻辑更加清晰,模块与模块之间的耦合降到最低,运行效率更高,更健壮,好了废话不说了,先介绍一下使用方式。...原创 2018-07-07 00:32:44 · 10200 阅读 · 9 评论 -
使用 LayoutManger 打造 RecyclerView 多种 ItemType 布局——MultiItemLayoutManger
## 简介 ## 随着 RecyclerView 控件的发布,已经有越来越多的人开始放弃 ListView 而转向 RecyclerView。RecyclerView 已经被人玩出了各种花样,但是关于多种布局的 ItemView 的实现网上的资料还是很少,多种布局的 ItemView 其实使用场景非常多,只不过因为有很多代替方案所以可能会很少有人会使用 RecyclerView 来实现,比如...原创 2018-05-04 00:33:06 · 2206 阅读 · 0 评论 -
RxJava/RxAndroid 使用入门
RxJava 用途异步操作、数据变换RxJava 集成方式 implementation 'io.reactivex.rxjava2:rxjava:2.0.1' implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'RxJava 概念RxJava 有四个基本概念:Observable (可观察者,即被观察...原创 2018-05-17 00:18:32 · 2441 阅读 · 1 评论 -
进击的Android技能树,Android进阶学习路线
在自学这条路上,最重要的一点就是要坚持,除此之外,制定一个完美的学习计划也非常重要。Android 开发入门简单,但是想要进阶却很难,有一个正确的努力方向才能放心的坚持下去。 之前在往上看到过一个流传较广类似的 Android 技能树,但是版本有点老,而且个人觉得不太全面,于是我花了点时间在这个图片的基础上又修修改改加了一些东西,如新特性等等,几乎全面覆盖 Android 开发的技术以及一些进阶...原创 2018-03-22 18:04:41 · 4308 阅读 · 1 评论