![](https://img-blog.csdnimg.cn/20190910145121620.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Android
文章平均质量分 75
鹭岛猥琐男
耐得住寂寞,才能守得住繁华
展开
-
Android 包体积优化
Android优化原创 2022-07-01 11:35:38 · 392 阅读 · 1 评论 -
Material Design 的 BottomNavigationView 使用
1.前言最近公司的项目开始出原型图了,虽然还没正式的 UI 出图,但是UI图不会和原型图有太大的差距。而项目中的主页就有类似微信底部的导航栏。在以前可能用线性布局以及对应的权重来实现此功能,而 Android 的现有库中已经有了实现此功能的控件。本着如果有原生的用,就用原生,没有原生就自己实现,自己实现复杂再用第三方库。因此此篇文章用于记录对BottomNavigationView 的学习,官方的相关文档查看:https://material.io/components/bottom-naviga.原创 2020-11-15 17:01:16 · 401 阅读 · 0 评论 -
Android Jetpack 之 DataStore
Google 推出了 JetPack 的新成员 DataStore,DataStore 是一种新的数据存储方案。DataStore以异步、一致的事务方式存储数据,克服了 SharedPreferences 的一些缺点。Jetpack DataStore 是经过改进的新版数据存储解决方案,旨在取代 SharedPreferences。DataStore 基于 Kotlin 协程和流程构建而成,提供两种不同的实现:Proto DataStore,它允许您存储类型化的对象(由协议缓冲区提供支持)Pre原创 2020-10-25 16:54:12 · 9781 阅读 · 0 评论 -
JNI介绍(五):
NDK 构建代码有两种方法:ndk-build 和 CMake。在之前介绍 JNI 的文章都是采用 ndk-build 的方式,对于CMake 的方式一直没有尝试过。此篇文章将采用 CMake 的方式来进行 JNI 的调用。原创 2020-07-28 21:33:11 · 470 阅读 · 0 评论 -
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 · 889 阅读 · 0 评论 -
Glide 4.11 源码解析(二):缓存机制
1.前言在上一篇文章Glide 4.11 源码解析(一):图片加载流程中梳理出来图片的加载流程如下:在 with 方法中通过 GlideBuilder 创建 RequestManagerRetriever 对象,并当做参数传入 Glide 的构造方法中。GlideBuilder 默认创建了网络加载线程池、磁盘缓存加载线程池、动画线程池、Bitmap池(用于复用)、数组池(用于复用)、内存缓存、磁盘缓存、图片加载引擎等。采用单例模式的方式获取到 Glide 对象,并通过 RequestManage..原创 2020-07-18 23:10:22 · 818 阅读 · 0 评论 -
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 · 667 阅读 · 0 评论 -
Android MVVM:基于 DataBinding + Kotlin
在MVVM中,数据和业务逻辑处于独立的 View Model 中,ViewModel 只要关注数据和业务逻辑,不需要和UI或者控件打交道。由数据自动去驱动 UI 去自动更新 UI,UI 的改变又同时自动反馈到数据,数据成为主导因素,这样使得在业务逻辑处理只要关心数据,方便而且简单很多。原创 2020-07-10 01:40:04 · 4969 阅读 · 10 评论 -
Glide 4.11 源码解析(一):图片加载流程
Glide 是一个图片加载框架,可以在 Android 平台上以简单的方式来加载和展示图片。通过Glide.with(this).load(url).into(imageView)一句代码就可以搞定。虽然调用方式很简单,但是内部的实现却不简单。下面将根据这句代码展开梳理 Glide 如何实现加载网络图片。原创 2020-07-08 00:25:03 · 4208 阅读 · 5 评论 -
View 绘制流程和刷新机制
当 Activity 启动时候,会调用到 ActivityThread 的handleResumeActivity 方法,接着调用ViewRootImpl 的 setView 方法。setView 方法中会调用 requestLayout,requestLayout 方法中调用scheduleTraversals,接着doTraversal ,最终调用到了performTraversals。接着分别执行 performMeasure、performLayout、performDraw 方法。原创 2020-07-05 20:42:48 · 804 阅读 · 0 评论 -
Android Jetpack 之 App Startup
App Startup 库提供了在应用程序启动时用于初始化组件的简单、高效的方式。开发人员可以使用 App Startup来简化启动序列,并显式地设置初始化顺序。App Startup 允许您定义共享单个内容提供程序的组件初始化器,而不是为每个需要初始化的组件定义单独的 contentProvider。这可以显著提高应用程序的启动时间。原创 2020-07-02 20:33:02 · 5099 阅读 · 0 评论 -
Android App 启动流程梳理(基于 Android 10)
1. 概述当我们点击桌面的应用图标,直到应用的启动页出来,这期间的在源代码的流程中到底是什么样子的?之前追过 Android App 启动的相关源码,由于没有做相关记录,时间一久,已经忘得差不多了。现在有时间,也下载了 Android 10 的源码,就重新追一遍并且画一画相关的流程图。2. 从点击桌面图标开始Android 的桌面本身也是一个 APP,为 Launcher。由于 Android 是开源的,很多手机厂商都做了相关的修改,甚至重新做一个新的启动页。之前做公司做电视系统的定制化,就没.原创 2020-06-16 00:28:10 · 4062 阅读 · 0 评论 -
Android 组件化
1.概述早期用 Eclipse 进行 Android 开发,创建一个工程,对于引入开源框架时候,采用的是用库的形式进行引入;到后来有 Android Studio 的出现,在 Project 下可以存在多个 module,除了要运行的 module 是 application 外,其他 module 都是 library。在每个 module 的 build.gradle 文件中区分:应用...原创 2020-05-21 06:12:42 · 672 阅读 · 0 评论 -
Android Bitmap 的优化
Android 中的图片是以 Bitmap 方式存在的,绘制的时候也是 Bitmap,直接影响到app运行时的内存。通过 ImageView 来显示图片,很多时候 ImageView 并没有原始图片的尺寸那么大,这个时候把整个图片加载进来后再设置给 ImageView,显然是没有必要的,因为 ImageView 根本没办法显示原始图片。可以将图片缩小后再加载进来,这样图片既能在 ImageView 显示出来,又能降低内存占用从而在一定程度上避免OOM,提高了 Bitmap 加载时的性能。原创 2019-11-02 20:59:59 · 1052 阅读 · 0 评论 -
Android Jetpack 之 Navigation
1. Navigation 的定义Navigation 是指支持用户导航、进入和退出应用中不同内容片段的交互。Android Jetpack 的导航组件可帮助实现导航,无论是简单的按钮点击,还是应用栏和抽屉式导航栏等更为复杂的模式,该组件均可应对。导航组件还通过遵循一套既定原则来确保一致且可预测的用户体验。导航组件由以下三个关键部分组成:导航图:在一个集中位置包含所有导航相关信息的 X...原创 2019-10-25 04:49:28 · 514 阅读 · 0 评论 -
Android Jetpack 之 DataBinding
1.DataBinding通过声明的方式,将 xml 布局中的组件与程序中的源数据进行绑定的框架库。当数据变化的同时组件能够及时同步并更新,减少Activity 中 View 的定义以及初始化,代码更加简洁。2.DataBinding 的使用2.1 在项目中对应 module 的 build.gradle 文件中添加 dataBinding 可用的配置:android { ...原创 2019-10-24 13:16:14 · 572 阅读 · 0 评论 -
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 · 263 阅读 · 0 评论 -
Android Jetpack 之 LifeCycle
1. JetpackJetpack 是一套库、工具和指南的集合,并不是一个框架或者组件。Jetpack 包含与平台 API 解除捆绑的 androidx.*软件包库。Android Jetpack 组件是库的集合,这些库是为协同工作而构建的,不过也可以单独采用,可全部使用,也可混合搭配!Lifecycle 就是 Android Jetpack 组件之一。2.LifecycleL...原创 2019-10-24 00:09:46 · 415 阅读 · 0 评论 -
FFmpeg 的编译
之前在投简历很多公司都做短视频相关的,都要求懂FFmpeg,抖音真的带动了一大波短视频相关岗位哈。下面就记录下使用的相关步骤:1.编译环境用的是我买的一个阿里云。也可以在Windows下安装VMWare搭建虚拟机。可以参考我之前写的文章:VMware虚拟机搭建。2.准备 NDK下载:wget https://dl.google.com/android/repositor...原创 2019-10-20 18:30:32 · 1207 阅读 · 0 评论 -
Android 自定义控件:继承View
在自定义控件中,一种类型就是继承自 View,通过画笔,从无到有画出一个符合需求的控件。在工作中,相机模块中,需要做一个点击后的聚焦框,就是通过继承 View,从无到有画出来的。实现代码如下:package cn.zzw.customview.custom.view;import android.content.Context;import android.graphics.Can...原创 2019-10-19 22:43:22 · 390 阅读 · 0 评论 -
Android 系统启动流程(二)
1. 前言在Android 系统启动流程(一)中,描述了 Android 系统启动流程中从按下 Power 到 Zygote 进程的启动。最终 Zygote 启动了 SystemServer,并调用了 SystemServer 中的 main 方法,这里继续分析启动 SystemServer 后的流程。2.SystemServer 源码SystemServer 的入口为 main ...原创 2019-10-19 00:44:37 · 307 阅读 · 0 评论 -
Android 系统启动流程(一)
1. 前言看过很多关于 Android 系统启动流程的博客,对此都是半知半解。坚信只有自己将流程走一遍,才能有更进一步的认知,以及更深的理解。此篇文章算是自己在梳理 Android 系统启动流程所做的记录。由于自己对 C 以及 C++ 了解的不足,这里只从 Java 层开始追。此流程是基于 Android 9.0 的源码做出的记录,具体源码链接:http://androidxref.com/9...原创 2019-10-16 22:13:54 · 437 阅读 · 0 评论 -
Serializable 和 Parcelable 的用法和区别
1. Serializable 和 Parcelable 的用法Android 开发过程中,需要对对象进行存储和传递,而对于对象的存储传递就需要用到Serializable 和 Parcelable 对对象进行序列化和反序列化。1.1Serializable 的使用对象类实现Serializable 接口,并定义serialVersionUID:package cn.zz...原创 2019-10-15 20:38:38 · 278 阅读 · 0 评论 -
Android知识复习归纳
一两个月前,在准备面试的时候发现很多知识多多少少有了解过,但是知识都是都是很零散的。以后将逐步得把自己了解过的Android方面的知识做下记录。此篇文章是对我写过的关于Android知识相关的blog做一个索引。现在还很少,慢慢的会把Android知识网络补全。Android 布局知识:Android 约束布局(ConstraintLayout)Android 适配: And...原创 2019-06-16 20:45:20 · 824 阅读 · 2 评论 -
LruCache 源码解析
1. 概述对于Android 开发者,LruCache 肯定不陌生,几乎所有的图片缓存框架都会用到它来实现内存缓存等,可见LruCache 在 Android 开发中的重要性。LRU 是Least Recently Used 的缩写,近期最少使用的意思。当我们进行缓存的时候,如果缓存满了,会先淘汰使用最少的缓存对象。因为在 Android 中为每个APP分配的内存大小有限,而 LruCa...原创 2019-10-08 01:26:58 · 417 阅读 · 0 评论 -
Android Handler 内存泄漏问题
1. 问题先看以下代码:第一种写法:public class MainActivity extends AppCompatActivity { ... ... ... private class MyHandler extends Handler { @Override public void handle...原创 2019-06-29 21:23:53 · 7590 阅读 · 2 评论 -
Activity 、 Window 、 View 之间的关系
先上代码:public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView...原创 2019-07-04 22:18:17 · 344 阅读 · 0 评论 -
AsyncTask的使用及其源码分析
1. AsyncTask 简介AsyncTask是一个抽象类,它是由Android封装的一个轻量级异步类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。2.实例先看下效果:代码如下:public class MainActivity extends AppCompatActivity { private TextView...原创 2019-07-04 22:16:08 · 250 阅读 · 0 评论 -
Android Handler 消息机制
1.概述在Android中使用消息机制,最常见的就是Handler,主要作用用来实现不同线程之间的通信。通常情况下,因为 Android 不能在主线程执行耗时操作,Handler的主要使用场景就是在子线程执行耗时操作后将消息发送到主线程,从而进行UI的更新。2. Handler 实例先看一个使用Handler的简单实例:先不考虑Handler造成的内存泄漏问题package cn...原创 2019-06-29 08:34:36 · 4927 阅读 · 0 评论 -
Android 进程间通信:Messenger
1.概述项目中常用到的进程间通信更多是用AIDL,在前阵子复习的时候才了解还有 Messenger 这种方法。既然要学习就记录下,以后要用的时候才能快速的掌握。Messenger 是一种轻量级的IPC方案,它的底层实现是AIDL,可以在不同进程中传递 Message 对象,它一次只处理一个请求,在服务端不需要考虑线程同步的问题,服务端不存在并发执行的情况。2. Messenger的构造...原创 2019-06-23 19:17:28 · 3581 阅读 · 0 评论 -
Android 进程间通信:AIDL
1. 概述AIDL:Android Interface Definition Language,即Android接口定义语言。在 Android 上,一个进程通常无法访问另一个进程的内存。 尽管如此,进程需要将其对象分解成操作系统能够识别的原语,并将对象编组成跨越边界的对象。 编写执行这一编组操作的代码是一项繁琐的工作,因此 Android 会使用 AIDL 来处理。(摘自Google dev...原创 2019-06-17 14:02:40 · 5134 阅读 · 0 评论 -
Android动画(一)
Android中的动画可以分为几类:1.View Animation:视图动画,也叫做Tween (补间)动画,可以在一个视图容器内执行一系列简单变换(位置、大小、旋转、透明度)。2.Drawable Animation:也叫做Frame动画,帧动画,元咯是将一张张单独的图片连贯的进行播放,从而在视觉上产生一种动画效果;有点类似幻灯片的播放以及gif动画。3.Property Anim...原创 2019-05-28 21:52:04 · 227 阅读 · 0 评论 -
JNI介绍(四)
JNI分为静态注册和动态注册。前面的文章就是静态注册的例子,此篇会写动态注册的例子。静态注册:流程: 1.编写Java代码,实现Native方法; 2.利用javah指令生成对应的.h文件; 3.对.h文件中的声明进行实现;优点:理解和使用方法简单,使用相关工具按照流程操作就行。缺点:编写不方便,JNI方法名字必须遵循...原创 2019-05-27 21:14:52 · 299 阅读 · 0 评论 -
JNI介绍(三)
在JNI介绍(一)中,jni目录下新增了两个文件Android.mk和Application.mk,以及对app下的build.gradle都进行了修改。此篇介绍下这几个文件的内容。1. Android.mkAndroid.mk 文件位于项目 jni/ 目录的子目录中,用于向编译系统描述源文件和共享库。LOCAL_PATH := $(call my-dir)include $...原创 2019-05-27 18:20:05 · 577 阅读 · 0 评论 -
JNI介绍(一)
在工作中有用过JNI调用, 虽然实际项目中有用过,但是却从来没有去做知识的梳理。趁现在比较不忙,做下知识的梳理。一、什么是JNI 百度百科的解释:JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。在工作中,有时候需要调用到C/C++的代码,比如第三方库FFmpeg,或者调用一些由C/C++...原创 2019-05-24 15:39:38 · 655 阅读 · 0 评论 -
JNI介绍(二)
前面一篇JNI介绍(一)主要介绍如何用Android studio进行JNI的开发,但是并对于为什么要这么写,没有任何的说明。接下来的文章将会逐一进行解释。Java调用C例子://// Created by zuowe on 2019/5/23.//#include "cn_zzw_jnidemo1_jni_JniTools.h"JNIEXPORT jstring JNICALL...原创 2019-05-27 14:27:03 · 345 阅读 · 0 评论 -
主线程 Looper.loop() 死循环为何不会ANR
先看下 ActivityThread 中的这段代码:而 loop() 方法中,存在一个死循环: public static void loop() { ... ... ... for (;;) { Message msg = queue.next(); // might block ...原创 2019-06-30 06:38:17 · 4181 阅读 · 0 评论 -
IntentService 的使用和源码分析
1. 定义IntentService是Android里面的一个封装类,继承自四大组件之一的Service。IntentService,可以看做是Service和HandlerThread的结合体,在完成了使命之后会自动停止,适合需要在工作线程处理UI无关任务的场景。2. 实例实例模型:在页面按后退键退出的时候,退出当前页面的同时,开启 IntentService。直接看以下代码:创...原创 2019-08-03 21:25:57 · 313 阅读 · 0 评论 -
HandlerThread 的使用及源码解析
1. 简述Android中耗时操作不能放在主线程,执行耗时操作都需要开启子线程来执行,执行完线程以后线程都会自动销毁。如果经常要开启线程,接着又销毁线程,这是很消耗性能的。可以选择的方案有:a. 使用线程池 (线程池的相关介绍可以参考之前的文章:Java线程池)b. 直接创建子线程(创建线程的方式可以参考之前的文章:Java创建线程的三种方式)c. 使用 HandlerThread...原创 2019-08-04 22:52:17 · 488 阅读 · 0 评论 -
Android 自定义控件:Path
在 Canvas 的学习中,只能画一些比较规则的图形,如方形,圆,弧线等。如果要画一些比较复杂的图形,只要计算好坐标,就需用到 Path 类就能做到,以及著名的贝塞尔曲线也是用 Path 来实现。这里列举下 Path 常用的方法。画笔等相关设置为: private void init() { mPaint = new Paint(); mPaint....原创 2019-10-05 21:01:09 · 245 阅读 · 0 评论