自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(129)
  • 资源 (17)
  • 收藏
  • 关注

原创 Android知识复习归纳

一两个月前,在准备面试的时候发现很多知识多多少少有了解过,但是知识都是都是很零散的。以后将逐步得把自己了解过的Android方面的知识做下记录。此篇文章是对我写过的关于Android知识相关的blog做一个索引。现在还很少,慢慢的会把Android知识网络补全。Android 布局知识:Android 约束布局(ConstraintLayout)Android 适配: And...

2019-06-16 20:45:20 812 2

原创 Stable Diffusion 本地化部署

Stable Diffusion 本地化部署

2024-04-03 13:17:08 456 1

原创 Android 包体积优化

Android优化

2022-07-01 11:35:38 369 1

原创 Material Design 的 BottomNavigationView 使用

1.前言最近公司的项目开始出原型图了,虽然还没正式的 UI 出图,但是UI图不会和原型图有太大的差距。而项目中的主页就有类似微信底部的导航栏。在以前可能用线性布局以及对应的权重来实现此功能,而 Android 的现有库中已经有了实现此功能的控件。本着如果有原生的用,就用原生,没有原生就自己实现,自己实现复杂再用第三方库。因此此篇文章用于记录对BottomNavigationView 的学习,官方的相关文档查看:https://material.io/components/bottom-naviga.

2020-11-15 17:01:16 371

原创 Android Jetpack 之 DataStore

Google 推出了 JetPack 的新成员 DataStore,DataStore 是一种新的数据存储方案。DataStore以异步、一致的事务方式存储数据,克服了 SharedPreferences 的一些缺点。Jetpack DataStore 是经过改进的新版数据存储解决方案,旨在取代 SharedPreferences。DataStore 基于 Kotlin 协程和流程构建而成,提供两种不同的实现:Proto DataStore,它允许您存储类型化的对象(由协议缓冲区提供支持)Pre

2020-10-25 16:54:12 9688

原创 JNI介绍(五):

NDK 构建代码有两种方法:ndk-build 和 CMake。在之前介绍 JNI 的文章都是采用 ndk-build 的方式,对于CMake 的方式一直没有尝试过。此篇文章将采用 CMake 的方式来进行 JNI 的调用。

2020-07-28 21:33:11 459

原创 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 841

原创 Glide 4.11 源码解析(二):缓存机制

1.前言在上一篇文章Glide 4.11 源码解析(一):图片加载流程中梳理出来图片的加载流程如下:在 with 方法中通过 GlideBuilder 创建 RequestManagerRetriever 对象,并当做参数传入 Glide 的构造方法中。GlideBuilder 默认创建了网络加载线程池、磁盘缓存加载线程池、动画线程池、Bitmap池(用于复用)、数组池(用于复用)、内存缓存、磁盘缓存、图片加载引擎等。采用单例模式的方式获取到 Glide 对象,并通过 RequestManage..

2020-07-18 23:10:22 803

原创 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 627

原创 Android MVVM:基于 DataBinding + Kotlin

在MVVM中,数据和业务逻辑处于独立的 View Model 中,ViewModel 只要关注数据和业务逻辑,不需要和UI或者控件打交道。由数据自动去驱动 UI 去自动更新 UI,UI 的改变又同时自动反馈到数据,数据成为主导因素,这样使得在业务逻辑处理只要关心数据,方便而且简单很多。

2020-07-10 01:40:04 4917 10

原创 Glide 4.11 源码解析(一):图片加载流程

Glide 是一个图片加载框架,可以在 Android 平台上以简单的方式来加载和展示图片。通过Glide.with(this).load(url).into(imageView)一句代码就可以搞定。虽然调用方式很简单,但是内部的实现却不简单。下面将根据这句代码展开梳理 Glide 如何实现加载网络图片。

2020-07-08 00:25:03 4179 5

原创 View 绘制流程和刷新机制

当 Activity 启动时候,会调用到 ActivityThread 的handleResumeActivity 方法,接着调用ViewRootImpl 的 setView 方法。setView 方法中会调用 requestLayout,requestLayout 方法中调用scheduleTraversals,接着doTraversal ,最终调用到了performTraversals。接着分别执行 performMeasure、performLayout、performDraw 方法。

2020-07-05 20:42:48 777

原创 Android Jetpack 之 App Startup

App Startup 库提供了在应用程序启动时用于初始化组件的简单、高效的方式。开发人员可以使用 App Startup来简化启动序列,并显式地设置初始化顺序。App Startup 允许您定义共享单个内容提供程序的组件初始化器,而不是为每个需要初始化的组件定义单独的 contentProvider。这可以显著提高应用程序的启动时间。

2020-07-02 20:33:02 5049

原创 Leetcode: 最长公共前缀

题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。示例1:输入: ["flower","flow","flight"]输出: "fl"示例2:输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。说明:所有输入只包含小写字母a-z。解法: String result = ""; if (strs.length == 0) { //空数...

2020-06-21 21:53:28 251

原创 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 308

原创 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 199

原创 Android App 启动流程梳理(基于 Android 10)

1. 概述当我们点击桌面的应用图标,直到应用的启动页出来,这期间的在源代码的流程中到底是什么样子的?之前追过 Android App 启动的相关源码,由于没有做相关记录,时间一久,已经忘得差不多了。现在有时间,也下载了 Android 10 的源码,就重新追一遍并且画一画相关的流程图。2. 从点击桌面图标开始Android 的桌面本身也是一个 APP,为 Launcher。由于 Android 是开源的,很多手机厂商都做了相关的修改,甚至重新做一个新的启动页。之前做公司做电视系统的定制化,就没.

2020-06-16 00:28:10 3565

原创 Android 组件化

1.概述早期用 Eclipse 进行 Android 开发,创建一个工程,对于引入开源框架时候,采用的是用库的形式进行引入;到后来有 Android Studio 的出现,在 Project 下可以存在多个 module,除了要运行的 module 是 application 外,其他 module 都是 library。在每个 module 的 build.gradle 文件中区分:应用...

2020-05-21 06:12:42 559

原创 Leetcode: 两数相加

题目:给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 ->...

2020-01-12 15:38:08 123

原创 Leetcode: 回文数

题目:判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。...

2020-01-11 15:33:57 166

原创 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 202

原创 Android Bitmap 的优化

Android 中的图片是以 Bitmap 方式存在的,绘制的时候也是 Bitmap,直接影响到app运行时的内存。通过 ImageView 来显示图片,很多时候 ImageView 并没有原始图片的尺寸那么大,这个时候把整个图片加载进来后再设置给 ImageView,显然是没有必要的,因为 ImageView 根本没办法显示原始图片。可以将图片缩小后再加载进来,这样图片既能在 ImageView 显示出来,又能降低内存占用从而在一定程度上避免OOM,提高了 Bitmap 加载时的性能。

2019-11-02 20:59:59 1012

原创 Android Jetpack 之 Navigation

1. Navigation 的定义Navigation 是指支持用户导航、进入和退出应用中不同内容片段的交互。Android Jetpack 的导航组件可帮助实现导航,无论是简单的按钮点击,还是应用栏和抽屉式导航栏等更为复杂的模式,该组件均可应对。导航组件还通过遵循一套既定原则来确保一致且可预测的用户体验。导航组件由以下三个关键部分组成:导航图:在一个集中位置包含所有导航相关信息的 X...

2019-10-25 04:49:28 482

原创 Android Jetpack 之 DataBinding

1.DataBinding通过声明的方式,将 xml 布局中的组件与程序中的源数据进行绑定的框架库。当数据变化的同时组件能够及时同步并更新,减少Activity 中 View 的定义以及初始化,代码更加简洁。2.DataBinding 的使用2.1 在项目中对应 module 的 build.gradle 文件中添加 dataBinding 可用的配置:android { ...

2019-10-24 13:16:14 553

原创 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 255

原创 Android Jetpack 之 LifeCycle

1. JetpackJetpack 是一套库、工具和指南的集合,并不是一个框架或者组件。Jetpack 包含与平台 API 解除捆绑的 androidx.*软件包库。Android Jetpack 组件是库的集合,这些库是为协同工作而构建的,不过也可以单独采用,可全部使用,也可混合搭配!Lifecycle 就是 Android Jetpack 组件之一。2.LifecycleL...

2019-10-24 00:09:46 373

原创 FFmpeg 的编译

之前在投简历很多公司都做短视频相关的,都要求懂FFmpeg,抖音真的带动了一大波短视频相关岗位哈。下面就记录下使用的相关步骤:1.编译环境用的是我买的一个阿里云。也可以在Windows下安装VMWare搭建虚拟机。可以参考我之前写的文章:VMware虚拟机搭建。2.准备 NDK下载:wget https://dl.google.com/android/repositor...

2019-10-20 18:30:32 1174

原创 Android 自定义控件:继承View

在自定义控件中,一种类型就是继承自 View,通过画笔,从无到有画出一个符合需求的控件。在工作中,相机模块中,需要做一个点击后的聚焦框,就是通过继承 View,从无到有画出来的。实现代码如下:package cn.zzw.customview.custom.view;import android.content.Context;import android.graphics.Can...

2019-10-19 22:43:22 371

原创 Android 系统启动流程(二)

1. 前言在Android 系统启动流程(一)中,描述了 Android 系统启动流程中从按下 Power 到 Zygote 进程的启动。最终 Zygote 启动了 SystemServer,并调用了 SystemServer 中的 main 方法,这里继续分析启动 SystemServer 后的流程。2.SystemServer 源码SystemServer 的入口为 main ...

2019-10-19 00:44:37 300

原创 Android 系统启动流程(一)

1. 前言看过很多关于 Android 系统启动流程的博客,对此都是半知半解。坚信只有自己将流程走一遍,才能有更进一步的认知,以及更深的理解。此篇文章算是自己在梳理 Android 系统启动流程所做的记录。由于自己对 C 以及 C++ 了解的不足,这里只从 Java 层开始追。此流程是基于 Android 9.0 的源码做出的记录,具体源码链接:http://androidxref.com/9...

2019-10-16 22:13:54 409

原创 Serializable 和 Parcelable 的用法和区别

1. Serializable 和 Parcelable 的用法Android 开发过程中,需要对对象进行存储和传递,而对于对象的存储传递就需要用到Serializable 和 Parcelable 对对象进行序列化和反序列化。1.1Serializable 的使用对象类实现Serializable 接口,并定义serialVersionUID:package cn.zz...

2019-10-15 20:38:38 270

原创 LruCache 源码解析

1. 概述对于Android 开发者,LruCache 肯定不陌生,几乎所有的图片缓存框架都会用到它来实现内存缓存等,可见LruCache 在 Android 开发中的重要性。LRU 是Least Recently Used 的缩写,近期最少使用的意思。当我们进行缓存的时候,如果缓存满了,会先淘汰使用最少的缓存对象。因为在 Android 中为每个APP分配的内存大小有限,而 LruCa...

2019-10-08 01:26:58 403

原创 LinkedHashMap 源码解析

1. 概述大部分的 Android 开发人员对LinkedHashMap 的认识,应该都是从 Lrucache 里面的来的吧。Lrucache 只所以实现开始访问排序,底层原理就是靠的LinkedHashMap。LinkedHashMap 的例子如下:package zzw.cn.testlinkedhashmap;import java.util.Iterator;impor...

2019-10-07 21:30:17 214

原创 Android 自定义控件:Path

在 Canvas 的学习中,只能画一些比较规则的图形,如方形,圆,弧线等。如果要画一些比较复杂的图形,只要计算好坐标,就需用到 Path 类就能做到,以及著名的贝塞尔曲线也是用 Path 来实现。这里列举下 Path 常用的方法。画笔等相关设置为: private void init() { mPaint = new Paint(); mPaint....

2019-10-05 21:01:09 235

原创 Android 自定义控件:Canvas

在 Android 自定义控件中,如果继承 View,需要进行绘图,就需要用到Canvas 。Canvas 称为画布,能够在上面绘制各种东西,是 Android 平台 2D 图形绘制的基础。当创建自定义View类时候,继承 View,就可以重写方法 onDraw(),在方法中的参数就是 Canvas 对象: @Override protected void onDraw(Ca...

2019-10-05 14:57:48 510

原创 Android 自定义控件:组合控件

自定义组合控件就是多个控件组合起来成为一个新的控件,用来解决多次重复的使用同一类型的布局,比如对话框、APP的标题栏等。这里列举一个最近项目开发中自定义的组合控件。先看做好的效果:自定义的选择按钮按钮选中的样式:<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schema...

2019-10-02 23:50:48 330

原创 Android 全局异常处理

在 Android 开发中,谁都不想自己的 APP 出现异常,哪怕代码写得再好,也免不了出现异常的情况。而当出现异常后,要做的就是全局捕获异常以及将异常收集起来并且回传给服务端,方便对异常的解决。处理的方法:CrashHandler 类:package cn.zzw.crashdemo;import android.content.Context;import androi...

2019-10-02 22:01:34 272

原创 Android 热修复:阿里Sophix的集成

1. 前言当我们刚发布一个版本后,突然发现了一个严重的bug。由于刚发布版本,这时候如果再紧接着发布一个版本,这时候给用户的体验肯定很差。而热修复技术可以在用户不知道的情况下修复已知的bug。目前各大厂都推出了自己的热修复方案,各个方案的差别如下(这是阿里巴巴给的对比):热修复方案比较平台 阿里云移动热修复 Amigo(饿了吗) Tinker(微信) Qzone...

2019-10-01 18:45:41 630

原创 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 161

原创 Kotlin 学习:基本语法

1. 函数1.1 函数的声明函数定义使用关键字 fun,参数格式为:参数 : 类型 fun sum(a: Int, b: Int): Int { return a + b }1.2 省略返回值类型将表达式作为函数体、返回值类型自动推断的函数:fun sum1(a: Int, b: Int) = a + b1.3无返回值的函数在 K...

2019-09-22 20:16:56 149

ComponentDemo.zip

Android组件化(https://blog.csdn.net/zzw0221/article/details/105357871)相关代码

2020-05-22

BitmapDemo.zip

https://blog.csdn.net/zzw0221/article/details/102876413 此篇文章的例子。

2019-11-09

Messenger示例代码

文章 Android 进程间通信:Messenger 中的示例代码,blog地址:https://blog.csdn.net/zzw0221/article/details/93399407

2019-06-26

AndroidAIDLDemo.zip

blog:Android 进程间通信:AIDL(https://blog.csdn.net/zzw0221/article/details/92616358)中的实例所对应的代码。

2019-06-19

JniDemo2.zip

jni动态调用的例子,请看对应的blog:https://blog.csdn.net/zzw0221/article/details/90612038

2019-05-28

JniDemo1.zip

文章JNI介绍(一)(https://blog.csdn.net/zzw0221/article/details/90311024)中的代码。

2019-05-25

android多线程断点下载

android多线程断点下载,可支持断点下载

2014-08-06

自定义ProgressDialog

自定义ProgressDialog,彻底摆脱系统自带的其丑无比的ProgressDialog

2014-07-08

自定义Spinner--利用TextView以及Dialog组合

自定义的Spinner,利用TextView以及Dialog组合而成的Spinner

2014-06-21

异步扫描SD卡

异步扫描SD卡 AsyncTask 希望对大家有帮助

2014-06-08

C#微信公众平台二次开发例子

C#微信公众平台二次开发例子,希望能够对大家有用

2014-06-08

Android Design 安卓设计指南 官方翻译中文版

Android Design 安卓设计指南 官方翻译中文版

2014-06-08

SlidingMenu

SlidingMenu,整理好的SlidingMenu

2014-06-05

Android圆形菜单

Android圆形Menu 特殊的菜单效果

2014-06-05

Android开发指南中文版.pdf

让你快速掌握Android开发技巧,中文版的哦!

2014-06-05

Android Studio使用指南

Android Studio,开发Android工具,比Eclipse更专业的Android开发工具。教你如何使用Android Studio

2014-06-05

JAVA经典编程50题附答案.doc

JAVA经典编程50题附答案,是学习java最常遇到的几个问题,希望能对学习java有所帮助!

2014-03-02

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除