自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 资源 (1)
  • 收藏
  • 关注

原创 kotlin - object关键字的使用

kotlin - object关键字的使用kotlin中的object关键字主要有如下三种用途:对象表达式对象声明伴生对象对象表达式对象表达式是完全取代java的匿名内部类的,并且它可以指定多个父类型,和java的匿名内部类还是有区别的,java的匿名内部类只能实现一个父类型。对象表达式的语法如下:object:[0-N接口或类]{//后面接口和类不是必须的可以不写 //对象表达式的类体部分}使用示例代码如下:interface OnClickListener {

2021-11-08 17:26:51 2829

原创 kotlin - this关键字的指向

this关键字的指向kotlin中的this比java的this功能更加的强大,它支持带标签的写法,通过这种带标签this的写法可以进行非常细致的区分。kotlin关于this的处理规则如下:类的方法或属性中,this代表着调用该属性或方法的对象。在类的构造器中,this代表着构造器即将返回的对象。在扩展函数或者带接收者的函数字面值中,this表示(.)左边的接收者。如果this没有限定符,那么它优先代表包含该this最内层的接收者,并且会自动向外搜索。如果要让this明确引用特定的接收者,可

2021-11-08 16:49:38 1465

原创 kotlin - 类委托和属性委托

kotlin - 类委托和属性委托类委托类委托是代理模式的应用。类委托的本质就是把这个类需要实现的部分委托给其他对象,相当于是借用其他对象的方法作为自己的实现。示例代码如下:interface Outputable { fun output(msg: String) var type: String}class DefaultOutput : Outputable { override fun output(msg: String) { println(

2021-11-07 22:38:17 1312

原创 kotlin - 扩展方法和扩展属性

kotlin - 扩展方法和扩展属性我们都知道java要扩展一个已有类的方法和属性必须采用继承、组合或直接修改现有类来进行功能和属性的扩展。而kotlin是完全支持扩展方法和扩展属性的,这样我们就可以像正常调用对象方法一样使用扩展方法和属性了。扩展方法扩展方法的定义语法如下:fun [扩展类].(参数列表){ //方法执行体}示例代码如下:class Row{ fun test(){ println("test") }}//给Row扩展了一个inf

2021-11-07 22:02:49 3251

原创 kotlin - 接口和抽象类

kotlin - 接口和抽象类接口kotlin中的接口java中的接口也有一些区别,kotlin中定义接口的语法如下:[修饰符] interface 接口名:父类接口1,父类接口2...{ 0个或者多个属性定义 0个或者多个方法定义 0个或者多个嵌套类、嵌套接口、嵌套枚举定义 }kotlin中接口的特点与java8相似的是,kotlin的接口既可包含抽象方法,又可以包含非抽象方法接口中的属性没有幕后字段(field),不能保存状态,在接口中定义的属性要么是抽象

2021-11-07 20:30:14 507

原创 kotlin - 密封类

kotlin - 密封类kotlin中sealed关键字修饰的类就是密封类。密封类其实是一种特殊的抽象类,专门用于派生子类的。密封类的特点密封类的子类是固定的密封类的直接子类必须和密封类在同一个文件中密封类间接的子类可以在不同文件中密封类所有的构造方法都是private的如下程序定义了一个密封类和两个子类:sealed class Vegetable{ abstract fun taste() fun test(){ println("-----test-------")

2021-11-07 17:34:23 1075

原创 kotlin - 数据类data

kotlin - 数据类data在kotlin中数据类通过data关键字来修饰。数据类需满足的条件主构造器必须至少有一个参数主构造器中的参数需要用var/val声明为属性数据类不能用abstract、open、sealed修饰,也不能定义成内部类数据类可以实现接口也可以继承其他类系统自动为数据类生成哪些内容生成equals/hashCode的方法。自动重写toString方法返回形如:”User(name=guojingbu,age=18)“的字符串为每个属性生成operator修

2021-11-07 17:19:34 2608

原创 kotlin - 内联函数

kotlin - 内联函数首先我们了解一下什么是高阶函数:高阶函数就是为函数传入函数或者lambda表达式的函数。由于在我们执行传进来的函数或lambda表达式时都会为它们创建一个对象,在函数压找出栈的过程也是比较消耗性能的。所以为了避免这种函数的调用过程,编译器就会复制被调用的函数到原来的执行代码中。为了让告知编译器帮我们复制、粘贴哪些代码可以通过内联函数来实现。内联函数的使用只要用inline关键字修饰函数,那么这个函数就变成了内联函数。代码如下:inline fun calculate(a:

2021-11-07 17:00:44 926

原创 kotlin - 类与对象

kotlin - 类与对象类的属性类的属性的作用其实就是用于保存该类对象的状态数据的。kotlin中如果不写任何修饰符那么这个属性的访问权限默认为public的。类的属性不需要我们编写setter和getter方法,需要自定义的情况除外。class Person { var name: String = "" var age: Int = 0 lateinit var address:String}kotlin规定类的属性必须要有初始化器,简单的说就是要有初始化值,如果你

2021-11-07 00:27:08 199

原创 kotlin - 幕后字段和幕后属性

幕后字段和幕后属性幕后字段在kotlin中定义普通属性时,kotlin会为该属性生成一个field(字段)、getter和setter方法(只读属性没有setter方法)。kotlin为该属性生成的field(字段)被称为幕后字段。注意:如果kotlin类的属性有幕后字段,那么就一定要给这个属性显示的指定初始值,要么在定义的时候指定,要么在构造器中指定初始值。如果没有field(字段)就不需要初始化幕后字段生成的条件该属性使用了kotlin自动生成的getter、setter方法或者之一。简单的

2021-11-06 23:05:39 783

原创 kotlin - lambda表达式

kotlin中的lambda表达式使用lambda表达式代替局部函数lambda表达式可以简化代码。比如现在我们要定义一个函数,根据不同的type来确定返回求平方、求立方、求阶乘的函数的应用。如下代码://定义函数,该函数的返回值类型为 Intfun qetMathFunc(type: String): (Int) -> Int { when (type) { //调用局部函数 " square" -> return { n: Int ->

2021-11-06 22:29:42 169

原创 kotlin - 函数和闭包

函数和闭包方法的定义定义语法:fun [方法名] ( [参数名] : [参数类型] ) : [返回类型]{ ... return [返回值] }有返回值的函数:fun multiply(x: Int, y:Int): Int { return x * y}如果函数体中只有一条返回语句我们也可以简写为:fun multiply(x: Int, y:Int): Int = x * y也可以写成lamda表达式的形式:var multiply = { x: Int, y:

2021-11-06 21:39:48 1201

原创 Android 11 ContentProvider启动流程分析

Android 11 ContentProvider启动流程分析这一篇主要介绍一下ContentProvider的启动流程,并通过query方法为代表看一下整个操作方法的执行流程。ContentProvider的主要作用是实现数据共享的,它一般是配合ContentResolver 来使用的,我们通过ContentResolver配合URI就可以轻松访问ContentProvider暴露的数据了。ContentProvider作为四大组件之一,在平时开发中并没有其他三大组件使用的那么频繁。在开发过程中我们大

2021-06-07 22:43:15 1062 3

原创 Android 11 广播的注册、发送和接收流程分析

Android 11 广播的注册、发送和接收流程分析一、广播的注册流程BroadcastReceiver的注册有两种,静态注册和动态注册,静态注册是由PackageManagerService来完成的,这里只介绍BroadcastReceiver的动态注册。动态注册的实现其实在ContextImpl中,ContextWraper只是个代理类,没有实现真正的功能。那这里我们直接来看ContextImpl中的registerReceiver方法代码如下: public Intent registe

2021-06-06 15:07:59 2686 3

原创 Android11 Service绑定流程分析

Android11 Service绑定流程分析上一篇我们介绍了Android11 Service启动流程,这一篇我们接着介绍Service绑定流程。service的绑定流程有一部分与启动流程是重合的我们就不重复介绍了,例如:服务没有启动的时候会先走创建启动service的流程。这里只分析它的绑定流程。不了解Service的启动流程的可以查看我的这一篇文章《Android 11 Service启动流程分析》service绑定流程调用时序图service绑定流程源码分析我们一般在使用中会调用bindSe

2021-06-01 11:12:30 716

原创 Android 11 Service启动流程分析

Android 11 Service启动流程分析上一篇我们介绍了Activity启动流程,接下来的这一篇我们接着分析一下Service的启动流程。不了解Activity的启动流程的可以看我的这篇文章Android 11 Activity启动流程分析。本篇文章是基于android11源码来分析的。Service启动流程调用时序图service启动流程源码分析首先,我们在启动一个服务时会在Activity中调用startService方法,它的实现在ContextWrapper中,代码如下:publ

2021-05-31 11:20:44 1119 1

原创 滴滴插件化方案VirtualApk源码分析

滴滴插件化方案 VirtualApk源码分析概述插件化的难点在于对四大组件的支持,我们知道在Android中要使用四大组件就必须要在Manifest配置文件中进行注册,而插件apk中的组件是不可能预先知道名字的,我们无法提前把插件apk中的组件注册到宿主apk中。所以现在基本上都是通过hook一些系统的api做一些替换工作来解决,VirtualApk的大致方案如下:Activity:在宿主apk中提前占几个坑,然后两次替换来欺骗AMS对未注册的Activity的检查来启动插件apk中的Activi

2021-05-25 17:23:11 438

原创 Android 11 Activity启动流程分析

Android 11 Activity启动流程分析本片文章是基于Android 11版本来分析应用Activity的启动的,Activity是Android四大组件中最重要的一个,因为我们所有的页面基本上都是基于Activity开发的,所以了解Activity是怎么启动的是很有必要的,接下来我们就来分析一下Activity的启动流程。Activty启动调用时序图下面我们就来根据这张时序图来具体看一下代码中的调用流程我们一般在开发中会用下面的方法来启动一个Activity,那我们分析源码的如果其实就

2021-05-25 17:09:12 2074 1

原创 handler消息机制总结

handler消息机制总结什么是handler消息机制handler消息机制:简单的说,其实是android系统为了线程间通讯而设计的一套线程间通讯框架。对android有一定了解的人员都知道,我们android里只能在主线程中更新UI,那我们子线程中可以更新吗?答案肯定是可以,我们只能通过handler发送消息通知主线程更新UI。那有人可能就会问为什么要这样设计呢?其实这样设计google开发工程师也是考虑到性能以及维护复杂度才这样设计的,如果我们每个线程都能更新UI那势必会增加系统管理UI的复杂度

2021-05-12 15:14:51 169

原创 初探retrofit网络请求框架

初探retrofit网络请求框架retrofit简介retrofit是由square公司的大神开发的一个网络请求适配器框架,这个框架简化了对okhttp的使用,它将一个基本的Java接口通过动态代理的方式翻译成一个HTTP请求,并通过OkHttp去发送请求。此外它还具有强大的可扩展性,支持各种格式转换以及RxJava。本文是基于Retrofit 2.9.0 版本去分析的。retrofit的简单使用这里我们只是展示一下retrofit的简单使用,主要函数为我们分析源码提供入口//创建接口服务int

2021-04-29 10:17:51 168

原创 android jetpack room 使用问题总结

android jetpack room 使用问题总结问题一:Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide room.schemaLocation annotation processor argument OR set exportSchema to false.模式导出目录未提供给注释处理器,因此我们无

2021-03-26 14:59:25 1974 6

原创 设计模式之单例模式

设计模式之单例模式单例模式的定义单例模式(Singleton Pattern) 确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。实现单例模式的步骤:持有一个私有的自身的引用构造函数私有化只能自行实例化提供一个公有的方法提供外部回去该实例化对象单例模式的优缺点优点减少内存开支,由于内存中只有一个实例,所有的访问者都拿到的是同一个实例,不需要频繁的去创建实例减少的内存的开支。减少了性能的开销,当一个对象比较大的时候,频繁的创建实例会消耗大量的性能,单例模

2021-01-31 22:41:32 93

原创 Android Activity的启动模式总结

Android Activity的启动模式总结activity作为Android四大组件之首是非常重要的,有时候为了满足项目的需求,就必需要使用activity的启动模式,所以我们必须要搞清楚它的启动模式和标志位,本片文章将会一一介绍。Activity的LaunchMode首先要说一下Android默认activity的启动模式是多实例启动也就是我们常说的standard模式。我们知道当我们多次启动同一个activity的时候,系统会创建多个实例并把它放到一个activity任务栈中。当我们点击返回的

2021-01-31 22:33:10 708 1

原创 eventBus3.0源码分析

eventBus3.0源码分析之前我写过一篇关于eventBus1.0的源码分析没有看过的兄弟可以移步到EventBus1.0源码分析eventbus1.0的源码相对简单一点能够很清晰的了解到它的整体实现原理,eventbus3.0做了很多优化使其性能更优。接下来们就来看一下eventBus3.0具体是怎么实现的。1.重要类的说明与作用SubscriberMethodFinderMap<Class<?>, List> METHOD_CACHE = new Conc

2020-11-11 16:58:35 85

原创 常用的git命令大全

下面的是我们在日常工作中常用到的git 命令。大家工作中有什么常用到的命令被我遗漏的都可已在评论区反馈我会更新上去。以便以后查阅:下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、新建代码库# 在当前目录新建一个Git代码库$ git init#添加远程仓库到本地$.git remote add origin [要关联的远程仓库地址]# 新建

2020-09-20 23:08:34 87

原创 kotlin-基础篇(二)-函数的定义与使用

函数的定义与使用函数的定义定义语法有返回值无返回值成员方法静态方法顶级方法命名参数可选参数可变参数函数的定义定义语法[可见性修饰符] fun [方法名] ( [参数名] : [参数类型] ) : [返回类型]{ ... return [返回值]}kotlin中默认未指定可见性修饰符的函数默认为public而java中默认是protected有返回值fun double(x: Int): Int { return 2 * x}当函数返回单个表达式时,可以省略花括

2020-09-20 22:54:48 238

原创 kotlin-基础篇(一)-变量声明

文章目录只读变量可变变量成员变量静态变量顶级变量变量的getter和setter方法getter和setter方法的可见性新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入只读变量只读变量可以理解为java中的常量用fi

2020-09-19 18:23:41 1841

原创 android 获取系统缓存之 java.lang.reflect.InvocationTargetException

android 获取系统缓存之 java.lang.reflect.InvocationTargetException今天我给大家分享一个关于获取android手机应用缓存信息的方法以及androidO以上的版本适配问题。如果不做适配兼容的话就会报java.lang.reflect.InvocationTargetException错误。以前我们在获取的方法如下:public void ge...

2019-09-07 16:18:07 8089

原创 静态代理模式以及动态代理模式

静态代理模式以及动态代理模式代理模模式代理模式也叫委托设计模式。那什么叫代理模式呢?其实在我们日常生活中代理模式随处可见。比如说我们一般上外网上需要代理服务器才能访问世界的各大网站;我们在买东西的时候很多时候不是跟厂家直接交互,而是和厂家委托的代理商去交互买东西;我们在遇到法律纠纷时委托律师帮我们打官司等等。在我们程序员的世界中也是如此。代理模式的定义就是为其他对象提供代理对象来对这个对象...

2019-07-20 11:24:11 262

原创 git使用clone资源是报error setting certificate verify locations:

git使用clone资源是报error setting certificate verify locations: git clone -b beta https://github.com/flutter/flutter.gitCloning into 'flutter'...fatal: unable to access 'https://github.com/flutter/flutte...

2019-06-25 17:00:11 525

原创 android 代码混淆

android 代码混淆什么是代码混淆用白话说就是把你的编写的代码通过proguard工具转化为难以阅读理解的代码,主要是保护你的产权,使那些想要盗用你源代码的人增加难度。混淆还可以使你的apk的体积减小也是apk瘦身的一种手段。androidstudio怎么开启代码混淆我们在开发中一般在release版本的时候会开启代码混淆,那么怎么开启呢?在android studio中开启是很方便的...

2019-05-08 16:28:35 235

原创 自定义倒计时button

自定义倒计时button)在我们日常开发中经常会遇到点击按钮然后去发送验证并且button上面会显示一个倒计时。这样的需求实现方法很多比如:handler发送延时消息、CountDownTimer,TimerTask等这些方法都可以实现。今天我给大家分享的是利用CountDownTimer+button自定义控件,这样封装的好处是我们使用简单并且可复用性强。效果图支持的自定义属性 ...

2019-02-25 10:04:16 345

原创 自定义流式布局FlowLayout

自定义流式布局FlowLayout今天给大家分享一个自定义的流式布局。自定义流式布局首先要知道什么是流式布局什么场景下会用到流式布局。流式布局:就是由左向右依次排列如果上一行显示不下就另起一行然后再由左向右排列以此类推。使用场景:主要用于关键词搜索或者热门标签等场景效果图:自定义ViewGroup步骤自定义viewgroup步骤:(1)继承ViewGroup重写构造方法。(2)重...

2019-02-23 22:32:11 751

原创 android ViewGroup点击事件分发机制

android ViewGroup点击事件分发机制前言好久没有写博客了,今天在看书的同时我想把我所学的用写博客的形式记录下来。这样又便于日后查看,并且还能在写博客的同时加深自己的印象。上一篇博客我们主要介绍的是view的事件分发,这一篇文章我们主要介绍一些viewgroup的事件分发。源码分析我们知道当一个点击事件发生后它的传递过程遵循如下的顺序:activity-&amp;amp;gt; window-...

2019-01-26 19:28:34 1165 2

原创 android View点击事件分发流程

android View事件分发流程android 中的view虽然不是四大组件,但是同样也是相当重要的。不论是我们在平时自定义控件还是面试的时候总会遇到一些关于view点击事件分发的一些问题。接下来就让我给大家分享一下关于view的事件分发流程。要想了解view的事件分发首先我们要知道什么是事件分发?所谓点击事件分发,其实就是对MotionEvent事件的分发过程,即当一个MotionE...

2018-09-10 23:19:43 1989

原创 EventBus1.0.1源码解析

EventBus1.0.1源码解析很久没有更过文章了,今天有时间我想着写一篇文章来冒个泡,接下来的一段时间我会对一些开源框架的源码进行一些分析。我为什么要分析开源框架的源码呢?主要有几方面原因:分析开源框架的源码使自己在这些开源框架中学到一些作者的思想。阅读开源框架的源码对架构方面的知识也有一定的提高。可以了解到自己有哪些api不熟悉或者不了解可以去查询学习这样会很好的提高自己。可...

2018-09-04 16:05:34 119

转载 Https单向认证和双向认证

这一段时间由于项目中用到了https协议,以前没有用过也不知道双向与单向认证的区别,所以就百度了一下搜了一些大神的博客了解了一下,自我感觉博主”沙僧”这一篇写的非常简单明了通俗易懂,就拿来给大家分享一下,也作为自己的一点记录以免以后忘掉。转载链接:https://blog.csdn.net/duanbokan/article/details/50847612 ...

2018-05-31 08:59:48 458

原创 android studio使用小知识点

android studio使用小知识点最近在看由Alibaba团队开发的一款用于android组件式开发解耦的开源项目Arouter。发现了他们的android开发团队在使用androidstudio有一些小细节我们以前没有用过,在这里给大家分享一下,同时也作为自己的一个积累吧!有时在我们android开发项目中用到的一些api并不依赖于android的SDK只是用到了java的一些ap

2018-01-17 12:29:39 735

原创 Android studio 自带模拟器在联想thinkpad E470c 笔记本中无法打开问题

Android studio 自带模拟器在联想thinkpad E470c 笔记本中无法打开问题上一周买了一台thinkpad E470c 的笔记本作为平时用来开发程序使用,在我装Android studio 开发环境时发现我的模拟器始终无法打开。报的错误如下图所示遇到这个问题,看他弹出的提示可以知晓,这个和开发环境的安装应该是没有关系的。它提示我们BIOS中的Intel virtualizati

2017-12-23 21:57:13 2186

原创 android aes加密

android aes加密及gson转化json串时“=”“u003d”在我们开发项目的时候有时有一些敏感信息需要加密,在加密的方式中我们一般用到的就有两种:一种是非对称加密,一种是对称加密。今天我给大家分享一下对称加密中的AES加密。废话不多说我们直接上代码。import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;//i

2017-12-19 14:39:19 482

头像上传

主要是图片的上传和修改,保存赶快送来了

2015-12-09

空空如也

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

TA关注的人

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