- 博客(130)
- 资源 (17)
- 收藏
- 关注

原创 Android知识复习归纳
一两个月前,在准备面试的时候发现很多知识多多少少有了解过,但是知识都是都是很零散的。以后将逐步得把自己了解过的Android方面的知识做下记录。此篇文章是对我写过的关于Android知识相关的blog做一个索引。现在还很少,慢慢的会把Android知识网络补全。Android 布局知识:Android 约束布局(ConstraintLayout)Android 适配: And...
2019-06-16 20:45:20
855
2
原创 Harmony开发笔记
作为一名拥有11年经验的Android开发者,我亲历了Android从高速发展到如今面临“僧多粥少”的过程。技术的世界瞬息万变,没有一种技术能够让人依赖一辈子。去年初,我自学了鸿蒙系统,并顺利通过了鸿蒙官方的初级和高级认。然而,由于一年来几乎没有实际应用,很多知识已经生疏。如今,我决定重新拾起鸿蒙开发,并通过笔记记录学习过程。
2025-02-26 21:57:51
427
原创 Material Design 的 BottomNavigationView 使用
1.前言最近公司的项目开始出原型图了,虽然还没正式的 UI 出图,但是UI图不会和原型图有太大的差距。而项目中的主页就有类似微信底部的导航栏。在以前可能用线性布局以及对应的权重来实现此功能,而 Android 的现有库中已经有了实现此功能的控件。本着如果有原生的用,就用原生,没有原生就自己实现,自己实现复杂再用第三方库。因此此篇文章用于记录对BottomNavigationView 的学习,官方的相关文档查看:https://material.io/components/bottom-naviga.
2020-11-15 17:01:16
451
原创 Android Jetpack 之 DataStore
Google 推出了 JetPack 的新成员 DataStore,DataStore 是一种新的数据存储方案。DataStore以异步、一致的事务方式存储数据,克服了 SharedPreferences 的一些缺点。Jetpack DataStore 是经过改进的新版数据存储解决方案,旨在取代 SharedPreferences。DataStore 基于 Kotlin 协程和流程构建而成,提供两种不同的实现:Proto DataStore,它允许您存储类型化的对象(由协议缓冲区提供支持)Pre
2020-10-25 16:54:12
9885
原创 JNI介绍(五):
NDK 构建代码有两种方法:ndk-build 和 CMake。在之前介绍 JNI 的文章都是采用 ndk-build 的方式,对于CMake 的方式一直没有尝试过。此篇文章将采用 CMake 的方式来进行 JNI 的调用。
2020-07-28 21:33:11
509
原创 OkHttp 4.7.2 源码解析(一):请求流程
1.前言Android 访问网络的框架从一开始的 HttpClient 和 HttpUrlConnection,再到 Volley 等,直到现在已经是 OkHttp + Retrofit 的结合。OkHttp 会成为一种流行的网络请求框架,肯定有它的特点,此篇文章将梳理OkHttp 的源码,对于Retrofit 将在其他后续进行分析。OkHttp 请求网络的方式如下所示,以下将根据这个流程进行分析。//1.创建一个 Request val request = Request..
2020-07-20 21:15:09
925
原创 Glide 4.11 源码解析(二):缓存机制
1.前言在上一篇文章Glide 4.11 源码解析(一):图片加载流程中梳理出来图片的加载流程如下:在 with 方法中通过 GlideBuilder 创建 RequestManagerRetriever 对象,并当做参数传入 Glide 的构造方法中。GlideBuilder 默认创建了网络加载线程池、磁盘缓存加载线程池、动画线程池、Bitmap池(用于复用)、数组池(用于复用)、内存缓存、磁盘缓存、图片加载引擎等。采用单例模式的方式获取到 Glide 对象,并通过 RequestManage..
2020-07-18 23:10:22
851
原创 Android Jetpack 之 WorkManager
1. 前言最近在 API 30 中准备使用 IntentService,结果发现在 API 30 中,IntentService 已经是deprecated 状态了。关于IntentService 的使用和原理可以参考我之前写的:IntentService 的使用和源码分析。Google 建议使用 WorkManager 或者 JobIntentService 来替代IntentService。使用 WorkManager API 可以轻松地调度即使在应用退出或设备重启时仍应运行的可延迟异步任...
2020-07-15 23:29:00
731
原创 Android MVVM:基于 DataBinding + Kotlin
在MVVM中,数据和业务逻辑处于独立的 View Model 中,ViewModel 只要关注数据和业务逻辑,不需要和UI或者控件打交道。由数据自动去驱动 UI 去自动更新 UI,UI 的改变又同时自动反馈到数据,数据成为主导因素,这样使得在业务逻辑处理只要关心数据,方便而且简单很多。
2020-07-10 01:40:04
5087
10
原创 Glide 4.11 源码解析(一):图片加载流程
Glide 是一个图片加载框架,可以在 Android 平台上以简单的方式来加载和展示图片。通过Glide.with(this).load(url).into(imageView)一句代码就可以搞定。虽然调用方式很简单,但是内部的实现却不简单。下面将根据这句代码展开梳理 Glide 如何实现加载网络图片。
2020-07-08 00:25:03
4308
5
原创 View 绘制流程和刷新机制
当 Activity 启动时候,会调用到 ActivityThread 的handleResumeActivity 方法,接着调用ViewRootImpl 的 setView 方法。setView 方法中会调用 requestLayout,requestLayout 方法中调用scheduleTraversals,接着doTraversal ,最终调用到了performTraversals。接着分别执行 performMeasure、performLayout、performDraw 方法。
2020-07-05 20:42:48
863
原创 Android Jetpack 之 App Startup
App Startup 库提供了在应用程序启动时用于初始化组件的简单、高效的方式。开发人员可以使用 App Startup来简化启动序列,并显式地设置初始化顺序。App Startup 允许您定义共享单个内容提供程序的组件初始化器,而不是为每个需要初始化的组件定义单独的 contentProvider。这可以显著提高应用程序的启动时间。
2020-07-02 20:33:02
5167
原创 Leetcode: 最长公共前缀
题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。示例1:输入: ["flower","flow","flight"]输出: "fl"示例2:输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。说明:所有输入只包含小写字母a-z。解法: String result = ""; if (strs.length == 0) { //空数...
2020-06-21 21:53:28
283
原创 Leetcode: 罗马数字转整数
题目:罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做II,即为两个并列的 1。12 写做XII,即为X+II。 27 写做XXVII, 即为XX+V+II...
2020-06-21 20:42:46
343
原创 Leetcode: 实现 strStr()
题目:实现strStr()函数。给定一个haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回-1。示例 1:输入: haystack = "hello", needle = "ll"输出: 2示例 2:输入: haystack = "aaaaa", needle = "bba"输出: -1说明:当needle是空字符串时,我们应当返回什么值呢?这是一个在面...
2020-06-21 16:07:44
226
原创 Android App 启动流程梳理(基于 Android 10)
1. 概述当我们点击桌面的应用图标,直到应用的启动页出来,这期间的在源代码的流程中到底是什么样子的?之前追过 Android App 启动的相关源码,由于没有做相关记录,时间一久,已经忘得差不多了。现在有时间,也下载了 Android 10 的源码,就重新追一遍并且画一画相关的流程图。2. 从点击桌面图标开始Android 的桌面本身也是一个 APP,为 Launcher。由于 Android 是开源的,很多手机厂商都做了相关的修改,甚至重新做一个新的启动页。之前做公司做电视系统的定制化,就没.
2020-06-16 00:28:10
4278
原创 Android 组件化
1.概述早期用 Eclipse 进行 Android 开发,创建一个工程,对于引入开源框架时候,采用的是用库的形式进行引入;到后来有 Android Studio 的出现,在 Project 下可以存在多个 module,除了要运行的 module 是 application 外,其他 module 都是 library。在每个 module 的 build.gradle 文件中区分:应用...
2020-05-21 06:12:42
791
原创 Leetcode: 两数相加
题目:给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 ->...
2020-01-12 15:38:08
162
原创 Leetcode: 回文数
题目:判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。...
2020-01-11 15:33:57
196
原创 Leetcode:两数之和
题目:给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]解...
2019-12-22 16:16:01
226
原创 Android Bitmap 的优化
Android 中的图片是以 Bitmap 方式存在的,绘制的时候也是 Bitmap,直接影响到app运行时的内存。通过 ImageView 来显示图片,很多时候 ImageView 并没有原始图片的尺寸那么大,这个时候把整个图片加载进来后再设置给 ImageView,显然是没有必要的,因为 ImageView 根本没办法显示原始图片。可以将图片缩小后再加载进来,这样图片既能在 ImageView 显示出来,又能降低内存占用从而在一定程度上避免OOM,提高了 Bitmap 加载时的性能。
2019-11-02 20:59:59
1095
原创 Android Jetpack 之 Navigation
1. Navigation 的定义Navigation 是指支持用户导航、进入和退出应用中不同内容片段的交互。Android Jetpack 的导航组件可帮助实现导航,无论是简单的按钮点击,还是应用栏和抽屉式导航栏等更为复杂的模式,该组件均可应对。导航组件还通过遵循一套既定原则来确保一致且可预测的用户体验。导航组件由以下三个关键部分组成:导航图:在一个集中位置包含所有导航相关信息的 X...
2019-10-25 04:49:28
557
原创 Android Jetpack 之 DataBinding
1.DataBinding通过声明的方式,将 xml 布局中的组件与程序中的源数据进行绑定的框架库。当数据变化的同时组件能够及时同步并更新,减少Activity 中 View 的定义以及初始化,代码更加简洁。2.DataBinding 的使用2.1 在项目中对应 module 的 build.gradle 文件中添加 dataBinding 可用的配置:android { ...
2019-10-24 13:16:14
609
原创 Android Jetpack 之 LiveData
1. LiveData是什么LiveData is an observable data holder class. Unlike a regular observable, LiveData is lifecycle-aware, meaning it respects the lifecycle of other app components, such as activities, f...
2019-10-24 00:11:04
297
原创 Android Jetpack 之 LifeCycle
1. JetpackJetpack 是一套库、工具和指南的集合,并不是一个框架或者组件。Jetpack 包含与平台 API 解除捆绑的 androidx.*软件包库。Android Jetpack 组件是库的集合,这些库是为协同工作而构建的,不过也可以单独采用,可全部使用,也可混合搭配!Lifecycle 就是 Android Jetpack 组件之一。2.LifecycleL...
2019-10-24 00:09:46
492
原创 FFmpeg 的编译
之前在投简历很多公司都做短视频相关的,都要求懂FFmpeg,抖音真的带动了一大波短视频相关岗位哈。下面就记录下使用的相关步骤:1.编译环境用的是我买的一个阿里云。也可以在Windows下安装VMWare搭建虚拟机。可以参考我之前写的文章:VMware虚拟机搭建。2.准备 NDK下载:wget https://dl.google.com/android/repositor...
2019-10-20 18:30:32
1250
原创 Android 自定义控件:继承View
在自定义控件中,一种类型就是继承自 View,通过画笔,从无到有画出一个符合需求的控件。在工作中,相机模块中,需要做一个点击后的聚焦框,就是通过继承 View,从无到有画出来的。实现代码如下:package cn.zzw.customview.custom.view;import android.content.Context;import android.graphics.Can...
2019-10-19 22:43:22
430
原创 Android 系统启动流程(二)
1. 前言在Android 系统启动流程(一)中,描述了 Android 系统启动流程中从按下 Power 到 Zygote 进程的启动。最终 Zygote 启动了 SystemServer,并调用了 SystemServer 中的 main 方法,这里继续分析启动 SystemServer 后的流程。2.SystemServer 源码SystemServer 的入口为 main ...
2019-10-19 00:44:37
347
原创 Android 系统启动流程(一)
1. 前言看过很多关于 Android 系统启动流程的博客,对此都是半知半解。坚信只有自己将流程走一遍,才能有更进一步的认知,以及更深的理解。此篇文章算是自己在梳理 Android 系统启动流程所做的记录。由于自己对 C 以及 C++ 了解的不足,这里只从 Java 层开始追。此流程是基于 Android 9.0 的源码做出的记录,具体源码链接:http://androidxref.com/9...
2019-10-16 22:13:54
508
原创 Serializable 和 Parcelable 的用法和区别
1. Serializable 和 Parcelable 的用法Android 开发过程中,需要对对象进行存储和传递,而对于对象的存储传递就需要用到Serializable 和 Parcelable 对对象进行序列化和反序列化。1.1Serializable 的使用对象类实现Serializable 接口,并定义serialVersionUID:package cn.zz...
2019-10-15 20:38:38
304
原创 LruCache 源码解析
1. 概述对于Android 开发者,LruCache 肯定不陌生,几乎所有的图片缓存框架都会用到它来实现内存缓存等,可见LruCache 在 Android 开发中的重要性。LRU 是Least Recently Used 的缩写,近期最少使用的意思。当我们进行缓存的时候,如果缓存满了,会先淘汰使用最少的缓存对象。因为在 Android 中为每个APP分配的内存大小有限,而 LruCa...
2019-10-08 01:26:58
462
原创 LinkedHashMap 源码解析
1. 概述大部分的 Android 开发人员对LinkedHashMap 的认识,应该都是从 Lrucache 里面的来的吧。Lrucache 只所以实现开始访问排序,底层原理就是靠的LinkedHashMap。LinkedHashMap 的例子如下:package zzw.cn.testlinkedhashmap;import java.util.Iterator;impor...
2019-10-07 21:30:17
261
原创 Android 自定义控件:Path
在 Canvas 的学习中,只能画一些比较规则的图形,如方形,圆,弧线等。如果要画一些比较复杂的图形,只要计算好坐标,就需用到 Path 类就能做到,以及著名的贝塞尔曲线也是用 Path 来实现。这里列举下 Path 常用的方法。画笔等相关设置为: private void init() { mPaint = new Paint(); mPaint....
2019-10-05 21:01:09
273
原创 Android 自定义控件:Canvas
在 Android 自定义控件中,如果继承 View,需要进行绘图,就需要用到Canvas 。Canvas 称为画布,能够在上面绘制各种东西,是 Android 平台 2D 图形绘制的基础。当创建自定义View类时候,继承 View,就可以重写方法 onDraw(),在方法中的参数就是 Canvas 对象: @Override protected void onDraw(Ca...
2019-10-05 14:57:48
572
原创 Android 自定义控件:组合控件
自定义组合控件就是多个控件组合起来成为一个新的控件,用来解决多次重复的使用同一类型的布局,比如对话框、APP的标题栏等。这里列举一个最近项目开发中自定义的组合控件。先看做好的效果:自定义的选择按钮按钮选中的样式:<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schema...
2019-10-02 23:50:48
399
原创 Android 全局异常处理
在 Android 开发中,谁都不想自己的 APP 出现异常,哪怕代码写得再好,也免不了出现异常的情况。而当出现异常后,要做的就是全局捕获异常以及将异常收集起来并且回传给服务端,方便对异常的解决。处理的方法:CrashHandler 类:package cn.zzw.crashdemo;import android.content.Context;import androi...
2019-10-02 22:01:34
313
原创 Android 热修复:阿里Sophix的集成
1. 前言当我们刚发布一个版本后,突然发现了一个严重的bug。由于刚发布版本,这时候如果再紧接着发布一个版本,这时候给用户的体验肯定很差。而热修复技术可以在用户不知道的情况下修复已知的bug。目前各大厂都推出了自己的热修复方案,各个方案的差别如下(这是阿里巴巴给的对比):热修复方案比较平台 阿里云移动热修复 Amigo(饿了吗) Tinker(微信) Qzone...
2019-10-01 18:45:41
726
原创 Kotlin 学习:类
1. 类的声明Kotlin 中使用关键字 class 声明类,这点与 Java 一样:package cn.zzw.messenger.hellokotlin/** *@author 鹭岛猥琐男 *@create 2019/9/24 21:30 */class UserInfo {}类声明由类名、类头(指定其类型参数、主构造函数等)以及由花括号包围的类体构成。如果...
2019-09-23 23:09:43
187
ComponentDemo.zip
2020-05-22
Messenger示例代码
2019-06-26
AndroidAIDLDemo.zip
2019-06-19
JniDemo2.zip
2019-05-28
JniDemo1.zip
2019-05-25
Android Studio使用指南
2014-06-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人