Android
文章平均质量分 87
Tʀᴜsᴛ³⁴⁵
纸上得来终觉浅,绝知此事要躬行
展开
-
Android | Activity 启动流程分析
Activity类是 android 应用的关键组件,在日常开发中,绝对少不了组件。既然用了这么久,你知道他的启动流程🐴?作为一个应用层开发者,大多数人可能觉得学习这些对日常开发可能没有太大帮助。但是多了解一下 framework 的代码还是很有必要的,了解系统组件机制,对于一些问题我们也能快速的定位找到问题的所在点,并且在面试的时候也是一个加分项。本文基于 Android 12 版本源码,从作为切入点,对整个启动流程进行分析。原创 2022-12-22 17:26:22 · 1114 阅读 · 1 评论 -
Android | WMS 解析(一)
前段时间分析了 Window 的添加、更新和删除流程,也知晓了 Activity 、Dialog 和 Toast 中 Window 的创建过程,今天就接着上篇文章,看一下 WMS 的创建 以及WindowManager 添加 WIndow 后 WMS 是怎样进行操作的。上篇文章点这里直达;简称 WMS ,是系统的核心服务,主要分为四大部分,风别是窗口管理,窗口动画,输入系统中转站,Surface 管理。原创 2022-11-02 11:58:21 · 862 阅读 · 0 评论 -
Android | Handler.runWithScissors 解析
在一个线程中通过 Handler 向另外一个线程发送消息,并等待另一个线程处理完成后再继续执行。原创 2022-10-21 12:45:31 · 589 阅读 · 0 评论 -
Android | LiveData 源码分析
LiveData 是一种持有可被观察的数据存储类,和其他可被观察的类不同的是,LiveData 是就要生命周期感知能力的,这意味着他可以在 Activity ,fragment 或者 service 生命周期活跃状态时 更新这些组件。在日常开发过程中,LiveData 已经是必不可少的一环了,例如MVVM以及MVI开发模式中,都用到了 LiveData。......原创 2022-08-29 18:07:25 · 1066 阅读 · 0 评论 -
Android | 如何计算图片占用内存的大小
前言对于一张图片,你知道应该存放在那个资源目录下面吗,或者说,放在那个资源目录下加载起来更省内存呢?在日常开发中我们可能不太注意这些东西,但是这些却是基础,是必不可少的一环,所以这几天重新温习了一下并整理了一下。基础知识MDPIHDPIXHDPIXXHDPIXXXHDPIdensity(像素密度)160240320480640分辨率360x640540x960720x12801080x19201440x2560比例11.5234原创 2022-04-11 23:49:35 · 4945 阅读 · 0 评论 -
Android | 理解 ViewRootImpl
简介ViewRootImpl 是 View 的最高层级,是所有 View 的根。ViewRootImpl 实现了 View 和 WindowManager 之间所需要的协议。ViewRootImpl 的创建过程是从 WindowManagerImpl 中开始的。View 的测量,布局,绘制以及上屏,都是从 ViewRootImpl 中开始的。我们通过一张图来认识一下它:Window我们知道界面中所有的元素都是由 View 构成的,View 是依附于 Window 上面的。Window 只是一个原创 2022-03-21 15:57:57 · 6537 阅读 · 0 评论 -
Android | 理解Window 和 WindowManager
前言Window 是一个窗口的概念,是所有视图的载体,不管是 Activity,Dialog,还是 Toast,他们的视图都是附加在 Window 上面的。例如在桌面显示一个悬浮窗,就需要用到 Window 来实现。WindowManager 是访问 Window 的入口。Window 是一个抽象类,他的实现类是 PhoneWidow,Activity 中的 DecorView ,Dialog 中的 View 都是在 PhoneWindow 中创建的。因此 Window 实际是 View 的直接管理者,原创 2022-03-18 11:24:35 · 4004 阅读 · 0 评论 -
Android 集成 Flutter | 与交互
这篇文章将以如何在 Android 项目中集成 Flutter 和 如何在两者之间进行交互为主要内容。原创 2022-01-19 10:51:48 · 2442 阅读 · 0 评论 -
Android | 作用域存储适配
前言Android 10 已经发布了很长一段时间了,并且 Android 11 已经有很大一部分人在使用了,那么你的程序对他做了适配吗?在 10.0 中,作用域存储变得非常重要,这个新的功能颠覆了我们一直惯用外置存储的方式,因此大量的 app 都面临着代码的适配本篇文章对作用域存储,以及如何进行适配,做了比较详细的介绍在 7.0 以前我们访问内存卡中的文件时可以通过 Uri.fromFile ,将 File 转换成 Uri 对象,这个 uri 对象表示这本地真实路径。 在 7.0 后,这种.原创 2021-01-25 11:57:46 · 320 阅读 · 0 评论 -
使用优化 | RecyclerView中可优化的点
你可能不知道的一些东西,如缓存,优化方式,以及 Diff 的使用等原创 2020-10-28 23:14:19 · 485 阅读 · 0 评论 -
实用技巧 | Android 在release版本上打印日志
buildTypes { release { minifyEnabled false zipAlignEnabled false debuggable true signingConfig signingConfigs.release// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'progu原创 2020-10-09 10:23:16 · 943 阅读 · 0 评论 -
Android 中使用线程池
系统 创建一个线程的成本还是比较高的,因为他涉及与系统的交互,在这种情形下,使用线程池可以很好地提高性能,尤其是在程序中需要创建大量生存期比较短暂的线程时,就更应该使用线程池。思路:体检创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。好处:提高响应速度(减少了创建新县城的时间)降低资源消耗度(重复利用线程池中线程,不需要每次创建)便于线...原创 2019-04-13 19:10:07 · 172 阅读 · 0 评论 -
文字绘制 | Android 单行,多行文字绘制
绘制文本文字纵向居中的算法(Y轴居中),横向居中用 Paint.Align.CENTER 即可获取文字的上下左右位置,计算中心点,然后偏移即可://文字位置aint.textAlign = Paint.Align.CENTER//获取文字的位置信息,相对于 baseLine 的左上右下位置paint.getTextBounds("哈哈哈", 0, "哈哈哈".length, rect)//计算文字中点val offset = (rect.top + rect.bottom) / 2原创 2020-07-07 15:40:47 · 1088 阅读 · 0 评论 -
上手指南 | Jetpack Hilt 依赖注入框架
Hilt 是 Android 的依赖注入库,是基于 Dagger 。可以说 Hilt 是专门为 Andorid 打造的。原创 2020-07-02 23:37:20 · 2771 阅读 · 6 评论 -
源码阅读 | Okhttp
首先先看一下用法:val client = OkHttpClient.Builder().build()val request = Request.Builder() .url("https://www.baidu.com") .build()val call = client.newCall(request)call.enqueue(object : okhttp3.Callback { override fun onFailure(call: okhttp3.Call, e: IOE原创 2020-06-26 12:47:05 · 294 阅读 · 0 评论 -
Http | 工作机制
HTTP 是什么 用于传输超文本的协议,以前是 HTML ,现在也包括 Web API 的数据。HTTP 的工作方式 最直观的方式:地址栏输入地址,然后页面就会显示结果 实际上是:在地址栏输入地址,回车后就会向服务器发送请求,然后服务器会进行响应,接着浏览器就会将响应的数据进行渲染出来URL -> HTTP 报文示例:http://www.baidu.com/s?cl=3其中 http 为协议类型,协议类型都有 http,ftp 等等,这些叫做应用层协议//www.ba原创 2020-06-16 17:08:05 · 3800 阅读 · 0 评论 -
自定义 View | 画板
自定义签字板,实现名字居中,增加边距等。可直接获取到 bitmap,uri,File ,并且直接进行保存到手机,支持 Android Q原创 2020-05-28 00:08:21 · 1696 阅读 · 1 评论 -
源码分析 | 布局文件加载流程
Activity 和 AppCompatActivity 的setContentView 有啥区别呢?AppCompatActivity是怎么兼容的?LayoutInflater 是怎样加载布局的?怎样去拦截 View 的创建呢?原创 2020-05-15 15:51:50 · 2014 阅读 · 0 评论 -
源码分析 | Resource资源加载
了解资源的加载过程,实现加载皮肤文件中的资源文件原创 2020-05-15 15:37:48 · 1883 阅读 · 0 评论 -
Gradle详解
Gradle 是什么? gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化构建工具,他使用一种 基于 groovy 的特定领域语言来声明项目的设置,而不是使用传统的 XML 。gradle 就是工程的管理,帮我们做好了依赖,打包,部署,发布,各种渠道的差异管理等工作Gradle 的组成 gradle 完全使用的是 groovy 的语法。...原创 2019-12-23 10:45:26 · 1802 阅读 · 0 评论 -
Android ClassLoader 源码阅读
Java 中的 ClassLoader 回顾Bootstrap ClassLoader :加载虚拟机指定的 class 文件Extension ClassLoader:加载虚拟机指定的 class 文件App ClassLoader :加载应用中的class 文件Custom ClassLoader :通过自定义 ClassLoader 加载自己指定的 clas 类加载过程...原创 2019-11-26 15:39:33 · 200 阅读 · 0 评论 -
Android IPC 之 AIDL 原理
在上篇文章中我们使用 AIDL 完成了进程之间的通信,下面我们分析一下 AIDL 文件的实现类aidl 文件如下:/** * 连接服务 */interface IConnectionService { oneway void connect(); void disconnect(); boolean isConnected();}实现类在 gen/aid...原创 2020-04-09 14:24:41 · 1416 阅读 · 0 评论 -
Android IPC 之 AIDL 跨进程通信
文章目录IPC 简介IPC 基础,主要包含三个方面:1,Serializable 接口2,Parcelable 接口3,Binder使用 AIDL实战:通过 AIDL 实现跨进程通信1,创建子进程的 Service2,完成连接服务3,完成消息的发送,注册,反注册关键字的作用总结IPC 简介IPC 的含义为进程间通信或者跨进程通信,是指两个进程之间数据交换的过程多进程的情况分为两种:1,一个...原创 2020-04-09 14:15:37 · 1582 阅读 · 0 评论 -
Kotlin+Jetpack 实现一键式下载
项目地址,欢迎 star首先看一下效果:使用方式: fileUrl.setText("https://kotlinlang.org/docs/kotlin-docs.pdf") fileName.setText("Kotlin-Docs.pdf") downloadButton.setOnClickListener { Do...原创 2020-03-16 23:11:54 · 1824 阅读 · 0 评论 -
Android 的消息(Handler)机制
本文将对Android消息机制的实现原理做一个分析,由于Android的消息机制实际上就是Handler的运行机制,分别是Handler,MessageQueue和Looper。同时也说一下主线程的消息循环。1,主线程的消息循环:android的主线程就是ActivityThread,主线程的入口方法为main,在main方法中通过Looper.prepareMainLooper()来创建主...原创 2019-02-12 18:20:04 · 286 阅读 · 1 评论 -
ViewPager2 详细使用
ViewPager2取代了ViewPager,解决了它的前身的大部分难点,包括从右到左的布局支持、垂直方向、可修改的片段集合等。 上个月的 20 号(19/11-20) ViewPager2 正式发布,用来取代 ViewPager,并且解决了很多的问题,因为原来还没有正式发布,也没有学习,今天正式的学一下 首先,Viewpager2 是在 AndroidX 的库中,没有被内置到系...原创 2019-12-30 21:41:36 · 7482 阅读 · 4 评论 -
Http 和 Https 区别
HTTP Http用于客户端和服务器之间的通信,请求访问文本或图像资源的一端称为客户端,而提供资源的一方称为服务器端。在两台计算机之间使用 HTTP 协议通信时,在一条线路上必定有一端是客户端,另一端是服务器端 Http 协议规定,请求必须从客户端发出,最后服务器端响应该请求并返回。HTTP 请求 1,请求方法,有 get ,post ,这两种最常见,还有 PUT ,DELE...原创 2019-12-24 22:25:51 · 1691 阅读 · 1 评论 -
Android 友盟简单快速集成
1,打开友盟官网,进行注册,添加 app ,记住 key。2,集成,一共两种方式,使用 jar 包和 自动集成,这里我们选择自动集成,如下: 在项目的 gradle 中添加如下: repositories { ...... maven { url 'https://dl.bintray.com/umsdk/release' } }reposito...原创 2019-11-22 09:53:07 · 940 阅读 · 0 评论 -
Retrofit 自定义 Adapter 和 Converter + 源码分析
不解释,直接撸自定义 Adapter 和 Converter1,接口:@GETLiveData<CustomResponse> get(@Url String url, @QueryMap Map<String, Object> params);@GETLiveData<String> get(@Url String url, @FieldMap ...原创 2019-10-23 21:53:22 · 675 阅读 · 0 评论 -
android中SVG 的使用姿势
SVG(Scalable Vector Graphics,可伸缩矢量图形 )是W3C推出的一种开放标准的文本式矢量图形描述语言,它是基于XML、专门为网络而设计的图像格式,SVG是一种采用XML来描述二维图形语言,所以它可以直接打开xml文件来修改和编辑在 Android 中如何使用 svg 呢,下面我们来看一下:SVG 静态图自定义 svg 图1,创建 svg 格式的图 制作地址:...原创 2019-10-18 11:20:40 · 880 阅读 · 0 评论 -
Android EventBus的使用
EventBus 是一个开源库,他利用 发布/订阅 者模式来对项目进行解耦,他可以利用很少的代码,来实现多组件的通信。android 的多组件通信可以通过 Handler,广播等,但使用他们进行通信 代码量非常多,组件之间容易产生耦合。1,基本使用添加依赖:compile 'org.greenrobot:eventbus:3.1.1'定义事件,可以是普通的对象例如:public...原创 2019-10-15 16:23:52 · 195 阅读 · 0 评论 -
Android DataBinding 的使用姿势
DataBinding 的使用DataBinding 一般情况下很少使用,但是如果你要使用 MVVM 框架,那么 DataBinding就是必不可少的了。下面我们看一下他的用法:准备工作 先在使用的 module 中添加如下android { ...... dataBinding { enabled = true }}文章目录DataBin...原创 2019-10-12 15:23:18 · 633 阅读 · 0 评论 -
DiskCacheDir + LruCache + AsynTask 的封装,实现照片墙的效果
上次对 DiskLruCache 进行了封装,但是他只能每次加载一张图片,不能放在ListView 等控件中使用。下面进行一次二次封装。首先是网络请求public class NetRequest { private OkHttpClient client = new OkHttpClient(); public byte[] request(final String ur...原创 2019-06-19 21:23:55 · 186 阅读 · 0 评论 -
MpChart 简单的饼图加折线实现
话不多说,先看一下效果接下来看一下具体实现的步骤1. 添加依赖,这个我就不多说了如果不会可以参考这篇博客。2. 设置布局<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:...原创 2019-01-07 19:48:51 · 413 阅读 · 0 评论 -
Android DialogFragment 的封装
在日常开发中,我们经常会使用到 对话框。原来一直使用的就是普通的 dialog。但是最近看到了 DialogFragment。于是就研究了一下,他本是也是一个 fragmen,它具有自己的生命周期,只是内部绑定了一个 dialog。经过几天的使用之后,我对他做了一个 封装。满足了日常的需求。下面看一下封装的过程1,BaseFragDialogpublic class BaseFragDi...原创 2019-10-09 21:55:52 · 1037 阅读 · 0 评论 -
在 fragment 中使用 Toolbar 的 menu
直接开始1,创建 menu 的布局<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/scan_music" an...原创 2019-08-17 21:37:02 · 443 阅读 · 1 评论 -
使用ButterKnife 和 Gradle 冲突的问题
今天在一个项目中使用到了 ButterKnife 我使用的是当时的最新版 10.1.0 ,但是一直在报错,最后经过查找,发现是 Gradle升级到3.0以上 就会和 ButterKnife 冲突,最后得到了一个解决的办法修改 ButterKnife 的版本为 8.4.0 ,然后Build 进行clean Project ,然后进行同步 即可解决问题https://blog.csdn.net/M...原创 2019-04-17 13:58:49 · 1235 阅读 · 3 评论 -
清单文件合并失败Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4
Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91 is...原创 2019-04-17 13:57:33 · 656 阅读 · 0 评论 -
Application 的简单介绍和生命周期
每个app都有一个application实例,如果我们没有继承他,app就会创建一个默认的实例。application有这个和app一样的长的生命周期,当app开启的时候,application的实例就会创建,app销毁的时候也会随之销毁。下面我们看一下他的使用方法。public class Myapplication extends Application { final Stri...原创 2019-03-02 15:22:21 · 2113 阅读 · 0 评论 -
Android 活动被回收了怎么办
当一个 活动进入到了停止状态,是有可能被系统回收的。想象以下场景:应用中有一个活动A,用户在A的基础上启动了B,活动A进入了停止状态。这个时候由于系统内存不足,将活动A回收了,然后用户按Back键返回活动,这个时候活动A会正常显示,只不过这个时候并不会执行onRestart()方法,而是执行活动A的onCreate()方法,因为活动A在这种情况下会被重新创建一次。当我们的应用出现了这种情况,是...原创 2019-01-30 19:19:39 · 581 阅读 · 2 评论