自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(105)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 用力一瞥Android渲染机制-黄油计划

涉及到滑动流畅,Android在谷歌4.1版本引入了黄油计划。其中有三个重要的核心元素:VSYNC、缓存区和Choreographer。

2022-10-02 17:09:24 2002 1

原创 从APK安装过程来认识PMS

在涉及到一个包的安装过程的时候,往往都绕不开,它是Android系统中最常用的服务之一。主要负责系统中Package的管理,应用程序的安装、卸载、信息查询等工作。

2022-07-08 09:00:00 1021

原创 Window管理深入了解WindowManagerService

在这几个中App主要负责业务逻辑,绘制视图,AMS负责管理组件和进程信息以及堆栈信息,WMS负责管理Activity的窗口以及子窗口和系统窗口,SF则是在用于管理图形缓冲区,进行屏幕渲染。本文分析就基于Android 10.0上。...

2022-06-06 23:47:11 781

原创 一文搞明白协程的挂起和恢复

协程是使用非阻塞式挂起的方式来实现线程运行的。那协程又是如何挂起和恢复的,这里面的概念又是什么,带着这些问题就让我们重新探究下协程的挂起和恢复。我们先创建个协程:override fun initView() { lifecycleScope.launch { val num = dealA() dealB(num) } }private suspend fun dealA():Int { wit

2022-05-30 14:09:47 817

原创 Android系统核心服务-“无处不在“的AMS

要有个前言,都知道ActivityManagerService是系统的引导服务,应用程序的启动、切换、调度和四大组件的启动和管理都需要AMS的支持,也可以看出其在Android中的重要性了。今天的故事就要从其启动流程开始讲起,虽然过程是有点枯燥的(本篇基于Android11)。1. AMS启动过程它是从SystemServer的main方法中开始的。//zygote 的主要入口点 public static void main(String[] args) { new SystemS

2022-05-01 14:35:37 590

原创 破解Gradle(六) Gradle Plugin技术及玩转transform

如果你想在编译期间搞事情,如常用的有无痕埋点,方法耗时统计和组件通信中自动注入等等,就要来学习字节码插桩的技术。而所谓字节码插桩技术其实就是修改已经编译好的class文件,在里面添加自己的字节码,然后打出的包就是修改后的class文件。

2022-02-27 23:30:40 2485 3

原创 Kotlin委托必须重视的几个点

委托模式是实现继承的一个很好的替代方式,也是Kotlin语言的一种特性,可以很优雅的实现委托模式。在开发过程中也少不了使用它,但常常都会被低估。所以今天就让它得到重视,去充分的掌握kotlin委托特性以及原理。一、委托类我们先完成一个委托类,常常用于实现类的委托模式,它的关键是通过by关键字:interface Base{ fun print()}class BaseImpl(val x: Int): Base{ override fun print() { print(x) }}

2022-01-23 16:36:02 2425

原创 破解Gradle(八) 从Gradle Plugin 构建看APK打包流程解析

目前,Android在进行构建APK,最常用到的就是Gradle打包。而要了解Android Apk打包的过程,就要深入了解Gradle Plugin的整个构建过程,在了解了之后,我们才能对Gradle Plugin开发游刃有余。我们先了解一下APK内部的结构:一、Android APK包结构来看看一个正常的APK的结构。我们可以打开build–outputs–apk–debug下的apk文件,就得到了下图,通常一个APK打包完之后,会有下面几个目录,用来存放不同的文件。class.dexja

2022-01-20 23:53:26 4033

原创 破解Gradle(五) Task完全掌握

一个 Task 是 Gradle 里项目构建的原子执行单元,Gradle 通过将一个个Task串联起来完成具体的构建任务,每个 Task 都属于一个 Project。Task API文档开始前,我们执行./gradlew tasks来查看项目中有多少Task。可以看到如下输出:上图就是当前工程中的每条task都已罗列出,并且有黄色的输出表示当前task的描述。一、Task定义及配置常见的有两种定义方式://直接通过task函数创建task helloTask{ println "i a

2022-01-11 23:40:10 1117

原创 破解Gradle(四) Project完全掌握

每一个build.gradle脚本文件被Gradle加载解析后,都是会生成一个Project对象。在脚本中的配置方法其实都对应着Project中的API。Project API 文档在开始前,我们先介绍一些最常用到的API,具体的可以看下文档:API描述getRootProject()获取根ProjectgetRootDir返回根目录文件夹getBuildDir返回构建目录,所有的build生成物都放入到这个里面setBuildDir(File path)

2022-01-11 23:39:16 1665

原创 破解Gradle(三) Gradle构建生命周期

Android Studio默认的工具是Gradle,通常开发者不需要了解Gradle的脚本配置,也能开发出一个App,但是如果你需要修改打包中的输出目录、提高打包速度的话,就要对Gradle有个深入的了解了。而在开发学习Gradle不能仅仅把它当做一个工具来学习,更应该把它当成编程框架来看,这里是Gradle API文档,我们再编写编译脚本,其实就是在玩 Gradle的API。Gradle的组成可以分为三部分:groovy核心语法Build script blockGradle API:包含pr

2022-01-11 23:37:26 1419

原创 【源码解读】抽丝剥茧的分析ViewModel的核心原理

ViewModel背景ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel类让数据可在发生屏幕旋转等配置更改后继续留存。摘自 ViewModel概览详细讲,ViewModel有如下几个特点:对于简单数据,Activity被销毁的时候,可以使用onSaveInstanceState()方法从onCreate中恢复其绑定数据,但不适用数量较大的数据,如用户列表或位图。而Viewmodel支持大量数据,也不需要序列化和反序列化操作。视图控制器经常需要进程可能需

2021-12-12 15:17:34 1586

原创 【源码解读】最详细的LiveData分析,从未如此丝滑

前言根据Jepack官方文档介绍:LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。如果观察者(由 Observer 类表示)的生命周期处于 STARTED 或 RESUMED 状态,则 LiveData 会认为该观察者处于活跃状态。LiveData 只会将更新通知给

2021-12-05 23:44:25 2164

原创 【源码解读】Lifecycle来翻个底朝天

相信大家平时经常用到Lifecycle,对它怎么使用应该已经相当熟悉了吧,所以今天省略这一块内容。想个问题,它解决了什么痛点?在真实的应用中,最终会有太多管理界面和其他组件的调用,以响应生命周期的当前状态。管理多个组件会在生命周期方法(如 onStart() 和 onStop())中放置大量的代码,这使得它们难以维护。同时也无法保证组件会在 Activity/Fragment停止后不执行启动。那Lifecycle是怎么解决这些问题的呢,我们直接进入分析源码正题吧。Lifecycle类分析之前先看下

2021-11-28 19:29:14 1482

原创 (Android11.0)App启动过程的深度挖掘(下篇)

前文说到,Activity启动过程在ATMS中绕了一大圈,最终还是通过调用ClientTransaction的schedule方法,回到了ApplicationThread中。那我们就接着往下看启动过程。ActivityThread启动Activity我们来看下ApplicadtionThread的scheduleTransaction方法:### ActivityThread/ApplicationThread public void scheduleTransaction(ClientTran

2021-11-28 19:24:23 1368

原创 (Android11.0)App启动过程的深度挖掘(上篇)

前言Activity的启动分为两种,一个是根Activity的启动过程,另一种是普通Activity的启动过程。而第一种就是指一个app启动的过程,普通Activity就是指在应用中调用startActivity的过程。拿根Activity的启动来讲比较全面,也很好的理解Android的整个启动过程。可以分为三个部分Launcher请求过程、AMS到ApplicationThread的调用过程和ActivityThread启动Activity。把android7、8、9的启动过程看了一遍,那我们现在就

2021-11-25 01:01:44 1273

原创 破解Gradle(一) Gradle配置文件拆解

gradle是什么gradle是一个通用的构建工具,允许你构建任何软件,因为它很少假设你要构建什么或应该如何构建。最显著的限制是依赖关系管理目前只支持Maven和Ivy兼容的存储库和文件系统。gradle脚本使用了groovy或者Kotlin DSL,gradle 使用 groovy或者 kotlin编写,不过目前还是 groovy 居多。那什么是 DSL 呢?DSL 也就是 Domain Specific Language 的简称,是为了解决某一类任务专门设计的计算机语言。gradle基于gro

2021-11-22 22:49:42 1070

原创 手写ButterKnife来搞明白Android注解处理器

Butterknife现在在项目中基本没用到了,逐渐被ViewBinding所代替,而我们所熟知它的内部原理是通过自定义注解+自定义注解解析器来动态生成代码并为我们的view绑定id的。今天就通过重新手写ButterKinife来搞明白我们今天的主角–Anotation Processing(注解处理器)。源码地址:APTDemo运行时注解在写注解处理器之前,先用运行时注解来操作下。这里我们先新建一个library取名lib-reflection然后自定义注解,我们只实现了View与id的绑定功

2021-11-21 00:07:47 973

原创 全方位来认识WindowManager

Window应该都比较清楚,它是一个抽象类,具体的时间类未PhoneWindow, 它对View进行管理。WindoowManager是一个接口类,继承自接口ViewManager,从名称上来看它是用来管理Window的,它的实现类为WindowManagerImpl。如果我们想要对Window进行添加、更新和删除操作就可以使用WindowManger,WindowManger会将具体的工作交由WMS来处理,WindowManager和WMS通过Binder来进行跨进程通信。Window和WindowMa

2021-11-17 23:57:31 1348

原创 【源码解读】Arouter是如何实现的

原理我们在代码里加入的@Route注解,会在编译时期通过apt生成一些存储path和activityClass映射关系的类文件,然后app进程启动的时候会拿到这些类文件,把保存这些映射关系的数据读到内存里(保存在map里),然后在进行路由跳转的时候,通过build()方法传入要到达页面的路由地址,ARouter会通过它自己存储的路由表找到路由地址对应的Activity.class(activity.class = map.get(path)),然后new Intent(),当调用ARouter的withS

2021-11-17 00:53:53 649

原创 还不懂Android的触摸反馈机制

当我们的手指从触摸屏幕上的各种View,开始到这个点击事件的结束到底经历了什么,我们来详细分析下。事件类型触摸事件会有三种类型: int action = MotionEventCompat.getActionMasked(event); switch(action) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: break

2021-11-17 00:23:06 1372

原创 【源码解读】OkHttp内部剖析探究

OkHttp内部关键在于拦截器的处理来实现,把网络请求封装到各个拦截器来实现,实现了各层的解耦。我们首先发起一个请求://创建okHttpClient对象OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(6, TimeUnit.SECONDS) .readTimeout(6, TimeUnit.SECONDS)

2021-11-13 18:19:17 647

原创 Jetpack-paging3看会了吗

听到Paging3的时候,觉得这是个分页加载库,自己早就封装了一套,可学可不学吧。后来看到很多项目有用到这个,就想着它到底哪里方便了。平时在加载数据的时候需要手动实现这些功能:跟踪用户滑到末尾请求确保多个请求不会同事触发对数据进行缓存跟踪加载状态,在列表上显示加载状态,如果有失败的加载,可重试的加载而在paging3中则不需要考虑滑动底部的时候发起一个网络请求加载下一页数据,它是一个全新的思路,在学习paging3的时候关联了协程、Flow、DiffUtil、MVVM等知识点。首先我们先了

2021-08-26 22:27:05 393

原创 Kotlin协程的前世今生

Kotlin协程的前世今生CoroutineScope 协程作用域CoroutineContext 协程上下文Job组合上下文中的元素调度器协程取消和超时协程异常协程中有几个概念: CoroutineScope, Job,CoroutineContextCoroutineScope 协程作用域异步作用域函数创建作用域有两种创建方式,常用的launch只是CoroutineScope的扩展函数//没有返回结果public fun CoroutineScope.launch( context

2021-08-22 15:34:25 122

原创 Uniapp插件开发

开发指南:https://ask.dcloud.net.cn/article/35428注意事项: https://ask.dcloud.net.cn/article/35139自定义组件模式和uni-app离线打包时必须添加uniapp-release.aaruni跟5+的启动方式不同,请确保使用的是自己的appid自定义调试基座:https://ask.dclou...

2020-04-04 12:08:19 666

原创 Flutter状态管理-Provider

在开发中经常会遇到状态管理的问题。一般原则是:如果状态跨组件共享,则该状态应该由各个组件共同的父元素来管理。目前已经有很多专门用于状态管理的包了,Provider、Redux、bloc和Scoped Model。现在我们就看一下google推荐使用的Provider。我们要做的是针对项目中登录状态、主题、国际化进行状态管理。1.添加依赖像之前一样,在pubspec.yaml文件汇总引入 ...

2020-04-04 12:06:11 1212 1

原创 音视频开发-音频尝鲜

在安逸的知识领域待久了,人就变得迷茫的。接触了音视频开发,打算一步步学起。Android预备的知识有音视频的基础知识、openGl的知识和最主要的Ffmeng知识。音视频的基础AndioRecord是Android系统提供的用于实现录音的功能类AudioTrack可以完成Android平台上音频数据的输出任务MODE_STREAM:在这种模式下,通过write一次次把音频数据写到Audi...

2020-03-24 17:10:42 198

原创 Android开发-AccessibilityService的操作姿势

我们来了解下Android的辅助功能AccessibilityService,Android提供这个类的初衷是辅助人们去使用Android设备,但通过我们的了解,才发现它的作用不仅仅只有这样。我们可用它进行自动化抢红包,自动安装的等等。AccessibilityService运行在后台,并且能够收到由系统发出的一些事件(AccessibilityEvent,这些事件表示用户界面一系列的状态变化)...

2019-01-06 23:23:51 787

原创 [Weex 学习]Weex Debug模式

在你写完一个界面之后,需要单独对他调试,可以直接在命令行里这时会直接出来一个界面接下来你要做的是使用 weex playground app 扫描二维码,扫描成功后,浏览器自动跳转到下面页面,点击下图框中的二维码,并使用 weex playground app 扫描,即可开始调试待 debug 的页面。这样子我们就来到了该界面的调试界面断点调试有时候我们进行网络请求,都需要查看返回了...

2018-12-20 22:57:43 1567 1

原创 OkHttp源码探究

网络同步请求Interceptor:是Okhttp最核心的一个东西,不要误以为它只负责拦截请求进行一些额外的处理(例如 cookie),实际上它把实际的网络请求、缓存、透明压缩等功能都统一了起来,每一个功能都只是一个 Interceptor,它们再连接成一个 Interceptor.Chain,环环相扣,最终圆满完成一次网络请求。使用了责任链模式:主要用于Interceptor它包含了...

2018-11-12 10:50:52 154

原创 Retrofit源码探究

简要原理,将一个Java接口翻译成一个Http请求,然后用Okhttp去发送这个请求精华代码,@SuppressWarnings("unchecked") // Single-interface proxy creation guarded by parameter safety. public <T> T create(final Class<T> servic...

2018-11-12 10:47:52 161

原创 Picasso源码解读

Picasso是Square公司出品的一款非常优秀的图片加载库,它可以帮我们完成一些android中处理的图片,使用最小的内存来完成图片的过渡。使用的方法如下:Picasso.with(context).load(“image url”).into(imageView);源码剖析我们就根据图片显示的这一条流程下来,一步步探究。先看上面一行代码public static Picasso...

2018-11-12 10:44:43 204

原创 Gradle打包入坑

现在讲讲Gradle打包apk的事情配置资源文件在做马甲包的时候,一般都是每个apk有不同的icon、不同的名字及界面上显示的文字也不同。往往这样子就需要有额外的资源文件。可以在src下建立新的目录来存放对应的资源文件,例如:命名与渠道名相同, src下,与 main 同级。shenzhen 中 res 下的文件目录和 main/src/res相同。可以在main下面建立个文件夹,比...

2018-11-12 10:41:05 448

原创 Mybatis整合spring

mybatis和spring整合的思路让spring管理SqlSessionFactory让spring管理mapper对象和dao1. 整合的jar包spring的jar包Mybatis的jar包Spring+mybatis的整合包。Mysql的数据库驱动jar包。数据库连接池的jar包。2. 加入配置文件2.1 SqlMapConfig.xml文件<?xm...

2018-11-12 10:36:08 181

原创 MyBatis的入门

1. MyBatis的介绍MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。2. Mybatis架构mybatis配置SqlMapConfig.xml,此文件作为mybatis的全局配置文件...

2018-11-12 10:24:36 202

原创 RecycleView.ItemDecoration全面了解

前言在开发的时候,如果你用到的是RecycleView,就常常会有下划线的视觉。平时我们就直接在item视觉里就加上了上划线,但今天结ItemDecoration类,会更快速地实现我们的表现效果。##使用在自定义ItemDecoration通常要复写其3个方法public class TestDividerItemDecoration extends RecyclerView.ItemDe...

2018-11-12 00:21:59 379

原创 Java后台—Spring

1. Spring介绍Spring的核心是控制反转(IoC)和面向切面(AoP)。 总共分为三层结构:WEB层:Spring MVC业务层:Bean管理(IOC)持久层:Spring的JDBC模板,ORM模板用于整个其他的持久层框架 Spring 的Bean属性注入:1.1 Sping架构核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory

2017-12-10 10:16:22 455

原创 JavaWeb核心-servlet

1. Servlet1.1 Servlet的认知Servlet是用啊处理客户端请求、响应给浏览器的动态资源。它主要包含三个技术点:servlet技术、filter技术和listener技术。1.2 Servlet的使用Servlet的规范要求:Servlet程序要编写实现类,并在xml进行配置。 通常继承HttpServlet类,并复写doGet和doPost方法。 另外还需要在web.xml进

2017-12-02 10:41:12 374

原创 MySQL多表与JDBC优化

1. MySQL多表1. 1 外键外键的目的是保持数据的完整性 进行外键约束的语法:ALTER TABLE product ADD FOREIGN KEY(category_id) REFERENCES category(id); 语法:alert table 从表 add [constraint][外键名称] foreign key (从表外键字段名) references 主表(主表外键名

2017-12-02 10:32:36 323

原创 MySQL与JDBC

1. MySQL1.1 数据库操作: database创建数据库: create database 数据库名 create database 数据库名 character set 字符集 查看数据库: show database 查看数据库服务器中所有的数据库删除数据库 drop database 数据库名称 切换数据库 use 数据库名select database() 查

2017-12-02 10:16:15 391

Chrone书签

5—19书签 bookmarks_16_5_19.html

2016-05-19

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

TA关注的人

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