自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 dagger and Hilt 看完这篇就会啦

theme: smartblue马上入职新公司了,新公司使用了Hilt,所以这几天先熟悉一下。Hilt是对Dagger的封装,所以还得先把Dagger练习一下。这俩都是依赖注入框架,依赖注入是基于控制反转的原则,控制特定代码的执行也就是控制对象的创建,由外部容器创建对象,外部容器创建好之后,在注入到当前对象里面。依赖注入是一种广泛应用的编程原则,遵循这种规范可以让代码更加的灵活,比如下面几个方面解耦:对象的创建依赖于依赖注入的容器, 如果某个对象在很多地方使用,某天该对象改变了,或者实现类改变了.

2021-12-19 22:56:59 949

原创 Jetpack Compose初体验之自定义图表

开发项目的时候,难免会遇到原生控件无法满足,需要自定义的情况,今天通过绘制几个图表来练习一下Jetpack Compose 中的自定义View。线形图绘制原理和之前xml中一样,只不过实现的方式变了一些,比之前简单了很多,比如下面通过path来绘制线形图。构建好path之后,直接在Canvas中绘制就OK了。如果想要对图标进行双指缩放,可以通过Modifier.graphicsLayer().transformable()来监听手势。通过rememberTransformableState来监听手指

2021-07-19 16:40:36 944

原创 Jetpack Compose初体验(2)

上一篇Jetpack Compose初体验中练习了Compose中的布局、自定义布局、自定义view、动画、手势等操作,这些都是在一个页面中完成,一个应用不能只有一个页面,今天来练习一下Jetpack Compose中的导航。普通导航在Jetpack Compose中导航可以使用Jetpack中的Navigation组件,引入相关的扩展依赖就可以了 Navigation官方文档implementation "androidx.navigation:navigation-compose:2.4.0-a

2021-07-14 10:36:35 965

原创 Jetpack Compose初体验

概览Jetpack Compose 是用来构建Android界面的新款工具包,前段时间beta版本刚发布的时候就已经心痒难耐的想要尝试了,最近轻松点了赶紧尝试一波。以前我们都是通过xml布局,通过findViewById()找到控件之后手动给控件赋值。这样的缺点首先是解析xml生成view对象需要通过反射浪费性能,然后是手动给控件赋值容易出错,比如过个地方控制一个view的显示和隐藏,随着控制它的地方越来越多,维护起来也越来越复杂。这几年,整个行业都开始向声明式界面模型转换,这个模型大大的简化了我们构

2021-04-29 16:10:43 957 2

原创 Android线程知识点大全

我们可以把安卓中的线程笼统的分为UI线程和工作线程,UI线程主要是用来更新UI界面,工作线程主要用来处理耗时的逻辑。线程的创建new Thread最基本的创建线程的方式,这种方式创建一个线程非常简单,不过现实开发中我们一般不会使用这种方式,因为它缺乏统一等管理,可能会创建太多的线程这些线程之间互相竞争,可能导致系统资源因为被占用太多而卡死。AsyncTask安卓系统提供的轻量级线程工具(使用场景:需要知道任务等执行进度,多个任务串行执行)缺点:默认情况下多个线程是顺序执行的(如果某个任务

2021-03-07 00:18:11 277

原创 Jetpack之MotionLayout

MotionLayout 继承自 ConstraintLayout ,用来管理布局中元素的运动轨迹和动画。可向后兼容到API 14。MotionLayout 可以让布局转换和复杂运动更加简单,提供了属性动画,TransitionManager和和 CoordinatorLayout的各种能力。先来个简单的效果试试水一个MotionLayout的布局有两部分组成,一个是我们的正常的xml文件,另一个是与之对应的在目录res/xml/文件夹下面对应的一个xml文件用来描述动画场景的文件,下面我们就称之为场

2020-07-21 22:40:05 333

原创 JetPack之Paging3.0

之前写过一篇Paging2.x的是使用和分析,Paging2.x运行起来的效果无限滑动还挺不错的,不过代码写起来有点麻烦,功能也不是太完善,比如下拉刷新的方法都没有提供,我们还得自己去调用DataSource#invalidate()方法重置数据来实现。最近google出了3.0的测试版,功能更加强大,用起来更简单,现在来开始尝试一把先看看官网对Paging3.0的功能介绍分页数据缓存到内存中,保证应用在处理页面数据的时候,更有效的使用系统资源同时多个相同的请求只会触发一个,确保App有效的使用网络

2020-06-26 21:21:17 1087

原创 JetPack之使用CameraX完成拍照和拍视频

前段时间CameraX的Beta版发布了,这几天有时间也来尝试一下。Beta版本是对外测试版本,意味着它已经走出实验室走向生产,API的调用基本稳定不会大改了,bug也会更少可以用于生成环境。之前使用Camera1和Camera2开发相机功能的时候需要调用非常复杂的API,而且由于Android手机的碎片化严重,不同手机对相机功能的支持度也不一样,因此很多做相机相关应用的公司都会封装自己的相机库来简化相机的使用步骤和处理兼容性问题。CameraX其实就是Google开发的一个用来简化相机开发时候API的

2020-05-31 15:28:22 3163 6

原创 Jetpack之自定义Navigation轻松实现路由导航

之前的一篇文章Android Jetpack之Navigation对Navigation的使用进行了练习,并且看了一下Navigation的源码。虽然Navigation的功能很强大,不过在xml中配置感觉还是不够灵活,随着项目的增大,页面多了之后xml会变的非常庞大不利于维护。而且使用Navigation做底部导航的时候,每次都会新建Fragment,这个也不是我们想要的,因此来改造一下Navi...

2020-04-19 15:41:37 1766 5

原创 Android自动化测试入门(四)单元测试

单元测试一般分两类:本地测试:运行在本地的计算机上,这些测试编译之后可以直接运行在本地的Java虚拟机上(JVM)。可以最大限度的缩短执行的时间。如果测试中用到了Android框架中的对象,那么谷歌推荐使用Robolectric来模拟对象。插桩测试:在Android设备或者模拟器上运行的测试,这些测试可以访问插桩测试信息,比如被测设备的Context,使用此方法可以运行具有复杂Android...

2020-03-23 11:22:00 509

原创 Android自动化测试入门(三)Espresso

Espresso是谷歌力推的一个UI自动化测试框架,新建一个Andrdoid工程的时候默认就引入了Espresso的核心依赖,所以作为Android开发者,非常有必要学习这个框架。之前使用UI Automator的时候,我们经常在不同的指令之间添加一个时间延时保证手机端执行完成,在Espresso直接使用onView(),onView()会等待界面执行完在执行下一步。Espresso和UI A...

2020-03-09 22:52:16 808

原创 Android自动化测试入门(二)UI Automator

UI Automator是一个界面测试框架,支持跨进程,几乎可以模拟所有的人工操作。需要运行在4.3或者更高的系统版本上。它的测试代码的编写不依赖于目标应用的内部实现细节,非常适用编写黑盒自动化测试。官方文档UI Automator 测试框架的主要功能包括:uiautomatorviewer: 用来扫描和分析当前设备的当前页面的布局结构,它是sdk中自带的工具位置在 sdk/tools/b...

2020-03-09 22:51:03 334

原创 Android自动化测试入门(一)Monkey和MonkeyRunner

测试是应用开发中不可或缺的一部分。测试所做的工作,虽然不能让用户看到效果,但是想要保证一个有一定用户基础的应用的稳定性,测试是必须做的,否则严重的崩溃率肯定会导致用户的差评或者流失。ADB工具使用ADB的使用Android开发者应该都很熟悉了,它是电脑和手机之间连接的一个桥梁。电脑端有一个Client和一个Server,Client负责输入命令,Server负责和手机连接,手机端通过adbd跟...

2020-03-09 22:46:01 330

原创 Android Jetpack之Navigation

1 前言Android Jetpack 的导航组件Navigation可以很方便的管理fragment/activity的导航。注意:如果您要在 Android Studio 中使用 Navigation 组件,则必须使用 Android Studio 3.3 或更高版本。导航组件有三个关键部分NavGraph:导航图,包含一组页面和它们之间的跳转关系,比如A页面跳到B页面 B页面跳...

2020-02-20 22:32:38 1280 1

原创 Android Jetpack之Paging

Jetpack中的Paging组件可以轻松的给RecyclerView增加分页加载的功能,通过预加载实现无限滑动的效果。先说一下这无限滑动效果,项目中的分页加载一般分两大种情况:一种是滑到底部上拉松手后加载或者滑到底部后自动显示一个加载动画加载。一种是当还没滑动到底部的时候就开始加载了,当滑到底部的时候数据可能已经加载完成并续上了,这样就有一种无限滑动的感觉,Paging默认就是这种模式。...

2020-02-10 16:01:59 565

原创 Retrofit加kotlin协程为何如此优雅

前奏Retrofit的正常写法先啰嗦一遍如下:interface AipInterface {@GET("article/list/1/json")fun getHomeList() : Call<WanBaseResponse<Data>>}val retrofit = Retrofit.Builder() .addConv...

2020-01-09 19:13:10 1093 2

原创 Andorid加载大图,双击放大,手势缩放

Android开发中,有时候会有加载巨图的需求,如何加载一个大图而不产生OOM呢,使用系统提供的BitmapRegionDecoder这个类可以很轻松的完成。效果图:BitmapRegionDecoder:区域解码器,可以用来解码一个矩形区域的图像,有了这个我们就可以自定义一块矩形的区域,然后根据手势来移动矩形区域的位置就能慢慢看到整张图片了。OK 核心原理就是这么简单,不过做起来还是有一...

2019-12-20 21:00:43 304

原创 APP瘦身优化

1 为什么要瘦身优化1.1 瘦身优化的好处提高下载转化率大型APP都有Lite版本渠道合作商要求,降低推广成本应用市场比如 Google Play 要求超过 100MB 的应用只能使用APK 扩展文件方式上传,由此可见应用包体积对应用市场的服务器带宽成本还是会有一点压力。Resource 资源、Library 以及 Dex 类加载这些都会占用不少的内存,包体积减少也能起到优化内存的效...

2019-12-20 20:35:48 494

原创 Flutter 动画

Flutter动画中用到的基本概念Flutter动画中有4个比较重要的角色:Animation、Controller、Curve、Tween,先来了解一下这四个角色1.1 AnimationAnimation是Flutter动画库中的核心类,用于插入指导动画的值Animation对象知道动画当前的状态(比如开始还是停止),可以使用addListener和addStatusListener监...

2019-11-28 22:59:00 292

原创 Gradle之自定义插件

前面两篇了解了Gradle的基础知识,最终目的就是为了自己能写出Gradle插件来解决现实项目中的问题。现在Gradle自定义插件用的越来越广泛,插件化,热修复,性能优化,指标检测,多渠道打包等等都会用到Gradle插件。自定义Gradle插件的方式有三种,代码都差不多,都是必须实现Plugin<T>这个接口,然后实现接口中的apply方法。只不过写的地方不一样。第一种在build...

2019-11-27 12:04:58 349

原创 Gradle之Project,Task

gradle基本概念百度百科:Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,目前也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置。gradle是一个构建工具,也是一个编程框架gradle组成:groovy核心语法build ...

2019-11-22 15:11:32 665 1

原创 Gradle之Groovy

作为一名Android开发者,每天使用AndroidStudio,对于项目中build.gradle文件肯定不陌生,里面有各种各样的配置。对于一些常用的配置我们肯定烂熟于心,不过有时候去看一些大厂的代码的时候,经常会发现他们的项目中有很多的gradle的代码,我们往往因为不了解这些而对了解优秀的项目而带来一些障碍。百度百科:Gradle是一个基于Apache Ant和Apache Maven概念...

2019-11-22 15:10:49 347

原创 快速排序

快速排序效率高,空间复杂度底,在工作中一般是用的最多的排序算法,所以需要掌握。在看快速排序之前,先看一下另一个比快排简单点的问题,就是荷兰国旗问题给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)解决思路:准备准备三个指针less、more、curles...

2019-10-20 22:08:35 134

原创 使用ASM完成编译时插桩

ASM,是一个跟AspectJ功能类似比AspectJ更强大的编译时插桩框架。功能虽强大,不过用起来比AspectJ麻烦不少。其实这个框架在Java中用的很多,对于Android开发者来说如果之前没有开发过Java就有点陌生了官网 https://asm.ow2.io/ASM是一个通用的Java字节码操作和分析框架,可以用它来动态的生成类后者增强现有类的功能。ASM可以直接产生二进制的c...

2019-09-28 17:39:31 2521 1

原创 Flutter基础--状态管理

当我们使用编译器创建一个新Flutter应用的时候,我们可以在主界面看到两个小部件StatelessWidget和StatefulWidget。这是两个最常见使用最频繁的小部件了。StatelessWidget ,StatefulWidgetStatelessWidget 状态不可改变的,它内部的数值和UI都应该是常量不可改变StatefulWidget 状态可变,我们可以通过点击,或者网...

2019-09-22 14:50:58 268

原创 Hook式插件化

上一篇文章Andorid Hook进阶,通过Hook系统源码实现了不经过AndroidManifest注册也能跳转到对应Activity的功能。这一篇来分析一下怎么通过Hook的方式来实现插件化从Android类加载的源码开始分析 本文是按照Android9.0源码来,不同系统可能不一样我们平时跳转Activity的时候比如从MainActivity跳转到LoginActivity中,都是这么...

2019-08-21 20:45:31 669

原创 Andorid Hook进阶

上一篇文章学习了Hook的简单用,这次来做个稍微麻烦一点的,我们知道新建一个Activity之后我们需要在manifest中注册,否则启动的时候就会崩溃,现在使用Hook的方法绕过检查来启动一个没有注册的Activity如果我们不注册的话就会报下面的错误android.content.ActivityNotFoundException: Unable to find explicit acti...

2019-08-16 23:06:04 178

原创 Android Hook入门

Hook 英文意思是钩子,可以把一段执行着的代码钩下来,然后加入我们自己的逻辑,最后在放回去。比如我们可以Hook住一段系统代码,在执行系统代码之前加入我们自己的逻辑。Hook技术主要用到java反射和java动态代理两个知识点,下面来个简单的例子,我们来Hook一个按钮的点击事件 Button button = findViewById(R.id.btn_click); bu...

2019-08-16 23:05:25 188

原创 占位式插件化之加载静态广播

接着前几篇文章来:由于插件中的广播是在manifest中配置的,所以就不能使用上一篇中的方法来注册广播了,首先我们需要了解一下APK的解析原理第一步我们要知道静态广播是什么时候注册的?在手机开机的时候,系统谁扫描所有的app,在重新安装一遍,这也是为啥手机开机会这么慢,这时候系统会去解析AndroidManifest文件,解析的过程中遇到静态广播后就会自动注册第二步我们来看一下应用的安装目录...

2019-08-16 23:04:45 165

原创 占位式插件化之加载Service和动态广播

接着上一篇加载Activity来,启动Service和启动Activity的套路是一样的,宿主端定义一个代理的Service,标准的module中定义一个Service的标准接口,然后开始干。先来到标准module中添加一个Service的标准接口public interface ServiceInterface { /** * 把宿主(app)的环境传给插件 *...

2019-08-13 21:41:56 163

原创 占位式插件化之加载Activity

在一些大型的项目中,经常会用到插件化,插件化的优点有不少,即插即用,把不同的功能打包成不同的APK文件,通过网络下发到APP端,直接就可以使用,不用通过应用市场即可随时增加新功能,非常适用于功能多又需要敏捷开发的应用可以实现插件化的方式有很多种,本系列先通过占位式的方法来实现。我们知道,一个apk文件需要通过安装才能运行使用,那我们的插件apk是直接通过网络下载到本地的,不通过用户的安装,也就...

2019-08-13 21:33:23 306

原创 LeakCanary原理

前言Leakcanary是由Square公司开源的一款轻量的第三方检测内存泄露的工具主要原理 watch一个即将要销毁的对象,比如监控一个activity处于什么状态。先来看一下java内存中几个比较重要的部分栈(stack) 存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中堆(heap) 主要存放用new产生的数据,是垃圾回收器主要回收的部分方法区 ...

2019-07-28 17:48:52 644

原创 Andorid组件化跳转路由

简单介绍路由在组件化工程中有非常重要的作用,两个没有相互引用的module之间怎么通信呢。可以使用EventBus,使用广播,使用类加载,使用反射,scheme,隐式意图等等,这些方法各自都有优缺点,现在开源用的比较多的路由框架中ARouter中使用的是类加载的方法下面我们也使用类加载的方式自己封装一个小路由。那怎么使用类加载的方法来进行不同组件之间通信呢。很简单只要我们能拿到一个类的全类名...

2019-07-23 22:33:27 167

原创 Binder机制

Binder概述Binder在我们大Android中是无处不在的,无论是调用媒体服务,传感器,还有我们经常在用的startActivity ,startService等等都在使用着Bindder来完成相应的功能。整个Android系统就可以看成一个基于Binder的C/S架构,binder英文意思是粘合剂,Binder就是这个粘合剂,把各个组件系统粘合在一起。Binder这么重要,作为Andro...

2019-07-13 13:18:55 254

原创 Handler机制

Handler在我们日常开发中会经常用到,它主要用于处理异步消息,当发出一个消息之后,首先进入到一个消息队列,发送消息的函数即可返回,而另外一个部分在消息队列中逐一取出,然后对消息进行处理。虽然经常用到它,但是用的方式不正确也会产生一些问题,下面先来了解一些Handler相关的问题并解决Handler造成内存泄漏Andorid中一般都是在子线程中执行耗时的业务逻辑,然后通过Handler发从...

2019-07-07 19:54:34 503

原创 AOP面向切面编程--解放你的双手

假如现在有一个需求,在对数据库进行增删改查的时候,假如执行每个操作之前都要求把数据备份一下。这个时候怎么做比较好呢,难道要在每个方法之前都写一个save()方法吗,如果用到增删改查的地方非常多,这时候就非常麻烦了。通过java中的动态代理就可以很方便的实现。比如首先有个操作数据库的类public interface DBOperation { int save(); int...

2019-07-07 19:51:50 143

原创 OpenGl ES入门

什么是OpenGLOpen Graphics Library,图形领域的工业标准,是一套跨平台的、专业的、图形变成软件接口。它用于二维、三维图像,是一个功能强大的调用方便的底层图形库。OpenGL与硬件无关,可以在不同的平台比如Windows、Linux、Mac、Andorid、IOS之间进行移植,因此也得到了广泛的应用。Android 中使用OpenGl ESGLSurfaceView,...

2019-06-23 21:38:28 227

原创 直播用到的技术

服务器端搭建NginxNginx是一个高性能的HTTP和反向代理服务器,用来处理前端(Andorid ios Web)过来的请求,以前在一台服务器上需要部署多个服务,需要通过端口号执行访问的具体服务,部署完Nginx之后就不需要这样了,可以用Nginx来导流和分发。下载地址:http://nginx.org/en/download.html在Linux上下载当前最新版本并解压wget h...

2019-06-23 21:35:55 1176

原创 Java设计模式——适配器模式

适配器模式是将一个类的接口转换成开发者希望的另一个接口下面参考Retrofit的源码学习适配器模式,Retrofit现在的Andorid开发者基本都用到过,里面用到了很多设计模式比如动态代理模式,适配器模式等。下面来看其中的一个适配器在使用Retrofit的时候我们经常会看到下面的写法来添加一个addCallAdapterFactory,如果我们不添加,会有自己的一个CallAdapter返回...

2019-06-09 22:14:41 128

原创 Java设计模式——外观模式

外观模式:隐藏了系统的复杂性,为子系统中的一组接口提供了一个统一的访问接口。高内聚低耦合。外观模式非常简单例子:比如一个网络框架一般都有缓存策略,首先从内存中查找,找不到在去硬盘中查找,还找不到在去网络上下载。下面开始先定义几个接口public interface MemoryCache { Bitmap findFromMemory(String url);}public i...

2019-06-09 22:12:00 113

Android文件操作

android zip文件解压 压缩 创建文件

2017-02-22

greenDaoDemo

greenDao简单实例

2016-12-05

RecycleView万能Adapter

RecycleView万能Adapter

2016-04-29

MyEventBus

EventBus实践demo 使用最新的eventbus源码编写的activity和fragment以及fragment和fragment之间通信的demo

2016-03-08

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

TA关注的人

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