自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 收藏
  • 关注

原创 JetPack之WorkManger

一、WorkManger简介1.1 作用看google官网介绍,WorkManger旨在用于可延迟运行(不要求立即执行)并且在应用推出或者设备重启时能够可靠运行。看到这里感觉到了WorkManger似乎就是为了进程保活而诞生的,其实不然。1.2 应用场景(1)埋点上传(2)非即时性上传和下载(3)等等试想为什么Google在有service的前提下,还会推出一个WorkManger呢?1.3 优势1、确保可以被执行,并且可以设置执行的限定条件(例如仅仅在有网络连接的时候才进行图片的上传)

2021-03-28 21:51:49 271

原创 Android属性动画

一、简介在Android3.0为了取代传统诞生的产物,相较于传统动画有着很灵活的优势。**传统动画:**仅仅只能实现平移、缩放、旋转、淡入淡出这四种效果,并且对Button实现从左上角平移到右下角,点击右下角的Button时,并不能触发click事件,也就是说传统的补间动画并未对View的属性做到修改;以及传统动画仅仅只限于对View及其子类做动画。**属性动画:**可扩展性较高,实现简单,不仅仅可以实现上述传统动画的四种效果,也可以实现ObjectAnimator对任意对象实现动画效果,并且真正意义

2021-03-28 18:25:01 3516 6

原创 RecyclerView源码解析

一、基本用法RecyclerView作为Google为了取代ListView而推出的更加灵活的列表视图,其使用方法如下:1.1 在app.gradle中导入以下依赖包implementation 'com.android.support:recyclerview-v7:29+'1.2 在main_activity.xml中加入RecyclerView标签<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayo

2021-03-27 22:16:28 549

原创 Jetpack之Navgation和Fragment

一、简述Jetpack中的Navgation和SystemUI中的NavgationBar导航栏并不是一个东西。在Jetpack中的Navgation是为了适配Fragment而诞生的,在当今Android开发中,Fragment的优点在于轻量、可控制性强,但其相较与Activity而言,仍然有着其弊端,如:Activity的回退栈以及页面的参数传递。此时Navgation正是为了适配Fragment开发而推出的。此篇仅仅简单介绍Navgation的使用,原理下篇叙述。二、Navgation介绍2.1

2021-03-27 00:06:00 2325 3

原创 JetPack之ViewModel+DataBinding

一、声明此篇仅仅叙述DataBinding的基本用法以及搭配ViewModel实现VIew和Model的双向绑定。ViewModel在JetPack的作用:持久化数据;DataBinding的作用是:实现View和Model的双向绑定二、ViewModel基本用法继承ViewModel后,将Activity中需要保存的数据存放在ViewModel中,当Activity切换横竖屏时,保存在ViewModel中的数据不会丢失。public class MainActivity extends App

2021-03-26 00:19:23 981

原创 JetPack篇之LiveData

一、引言JetPack作为google大力推出的MVVM框架有着其独特的“天之骄子”身份,作为Android系统工程师,自然而然地需要研究一下Jetpack。作用:1、LiveData作为JetPack中的数据持有者。2、主要用于观察数据源发生变化,或者Activity的生命周期发生变化时,通知观察者;2、并且可以和Activity的生命周期进行绑定,当Activity的生命周期处于onDestroy时,不会通知观察者,从而避免造成内存泄漏。二、LiveData基本用法2.1 代码Live

2021-03-25 00:10:58 191

原创 使用SVG打造不规则自定义控件

传统的ImageButtom图片等控件都是基于长方形等规则图形,若是想使用不规则图形,则可以使用SVG图片定义Path路径,从而打造不规则图形,代码如下:public class ChinaMap extends View { //初始化画笔 private Paint paint; private Context context; private ProviceItem select; //装中国地图的Rectf private RectF total

2021-03-23 23:26:47 194

原创 Android事件分发机制,应用层篇

一、引言此篇文章将先从最上层的应用层的事件分发机制讲起,Android内核的Key机制和framework的InputManagerService将事件机制将在后续文章中讲解。二、设计思想用户习惯于可以看得见各式各样的控件之间进行的交互,如之前的View绘制流程可知,Android视图采用类似于俄罗斯套娃的形式展示,Activity—>Window—>DecorView,而第三方App中自定义控件放在顶层视图DecorView的content区域。但在Android体系中,最先是由TP硬

2021-03-22 23:20:51 204

原创 Handler原理

一、Handler的基本用法1、在主线程发送消息,在主线程中处理消息在主线程中使用Handler,注意这里handler需要加static将其变为内部类,从而不持有MainActivity对象,避免了Activity退出时,而Handler持有MainActivity导致的内存泄露。public class MainActivity extends AppCompatActivity { private static final int MSG =1; private static f

2021-03-21 12:19:08 144

原创 自定义ViewGroup

一、自定义ViewGroup代码自定义VIew的关键在于重写onMeasure和onDraw,而自定义ViewGroup的关键在于重写onLayout方法。public class FlowLayout extends ViewGroup { //存储每行由哪些控件 List<List<View>> lineViews = new ArrayList(); //存储每行的高度 List<Integer> heightArray =

2021-03-20 23:19:05 1237

原创 App启动流程(三)---View绘制流程

一、Activity的onResume在Activity的onCreate中通过setContentView加载完布局,但并未对布局文件中的控件进行测量、布局、绘制。从Acitivity的各个生命周期可知,在onCreate时Activity并不可见,onStart虽然可见,但并未显示在前台,无法与用户进行操作,因此google将测量、布局、绘制流程放在了onResume中。回看ActivityThreadpublic ActivityClientRecord performResumeActivity

2021-03-20 17:32:03 133

原创 App启动流程(二)

三、onMeasure、onLayout、onDraw调用流程先看看在onCreate中setContentView做了些什么?经过调用到AppCompatDelegateImpl中public void setContentView(int resId) { //1、创建Window和DecorView ensureSubDecor(); //2、加载contentFrameLayout,这是所有 ViewGroup contentPa

2021-03-19 23:47:13 114

原创 App启动流程(一)

一、Application启动此处App启动流程先从应用层的角度分析流程,用户在launcher上点击图标到Zygote孵化进程,在后续章节叙述。先从Zygote孵化app进程后的ActivityThread.java开始看起。申明:以下流程是基于AndroidR1.1ActivityThread.java在成变量中先创健了一个ApplicaitonThread对象,此处先做一个记号,后面会用到。final ApplicationThread mAppThread = new Applicatio

2021-03-19 00:35:56 223

原创 AOP面向切面编程之AspectJ实现权限申请框架

一、AOP简介1.1 AOP是啥AOP(Aspect Oriented Programming):面向切面编程。1.2 如何运作的将业务逻辑中与类不相关的通用功能切面式的提取分离出来,让多个类共享一个行为,一旦这个行为发生改变,不必修改类,而只需要修改这个行为即可。1.3 优缺点相较于传统的OOP(面向对象编程)技术性能更优。二、AspectJ2.1 简介AspectJ是一个实现了AOP的框架,它扩展了Java语言。AspectJ定义了AOP语法,它有一个专门的编译器用来生成遵守Java

2021-03-18 00:04:32 259

原创 编译时技术二、使用APT编译时手写ButterKnife

一、原理简介ButterKnife框架原理的是采用APT编译时技术,主要运用到注解+注解处理器的方式动态地为添加了BindView等注解的成员或方法生成类文件,开发者无需自己手写findViewById等等重复的代码,简化了开发者的工作量。二、手写ButterKnife想要完全理解ButterKnife底层的APT技术,手写实现ButterKnife可以帮助更好地吸收这种技术。2.1准备工作(1)创建Android工程,并且在此项目中新建一个java Module取名为annotataion,用于

2021-03-16 23:03:57 209

原创 编译时技术(一)使用注解+反射实现ButterKnife

编译时技术(一)使用注解+反射实现ButterKnifeButterKnife第三方框架帮助我们开发项目时不用在去写无聊的findViewById()、setContentView等等重复的代码,取而代之的是通过ButterKnife.bindView一句简单代码帮我们实现。类上的注解先定义注解,用此注解替代setContentView,通过申明Target元注解为Type标记为类上的注解,RUNTIME表示运行时注解。@Target(ElementType.TYPE)@Retention(Re

2021-03-16 00:30:17 135

空空如也

空空如也

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

TA关注的人

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