自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何调试Gradle插件

调试插件1、创建配置点击Edit Configurations,点击+号,然后点击Remote。生成一个Remote Debug的配置,Name可以随意修改,但红框圈出来的地方不要修改。2、创建调试环境在工程的根目录下开启Gradle远程调试,如下所示:export GRADLE_OPTS="-Xdebug -Xrunjdwp:transport=dt_sock...

2021-10-26 20:40:57 987

原创 Kotlin协程是个什么东西?

theme: juejin协程是什么根据维基百科的定义,协程(Coroutine)是计算机程序的一类组件,推广了协作式多任务的子程序,允许执行被挂起与被恢复。协程(Coroutine)并不是一个新词,马尔文·康威于1958年发明了术语“coroutine”,并将它用于汇编程序。而在其他语言,如Go、Python也都有协程的概念,所以它也不是Kotlin独有的。在不同的语言层面上...

2021-04-24 00:54:04 514

原创 将博客搬至CSDN

迁移博客到CSDN需要的一篇傀儡文章

2020-08-07 15:56:30 186

原创 深入理解Flutter的GestureDetector组件

引言上一篇文章 深入理解Flutter的Listener组件 介绍了触控事件的监听原理,让我们对Flutter中触摸事件的传递过程有了进一步的认识。今天我们学习一下手势识别组件GestureDetector的原理。GestureDetector的内部实现使用的是Listener组件,如果对Listener还不太熟悉,可以先了解一下Listener的原理。源码解析一、GestureDetec...

2020-03-15 11:38:55 1185 1

原创 Android Studio自定义缓存文件路径

引言开发过Android的小伙伴都知道,Android Studio太吃内存了,虽然Google已经为Android Studio进行了大量的内存优化工作,但是还是经不起我们在渣渣电脑上打开多个Android项目,导致的内存吃紧。为了让电脑腾出更多的存储空间,让Android项目编译地更加流畅,我们将自定义缓存文件路径到移动硬盘,这里的缓存文件包括.m2目录和.gradle目录。.m2目录的...

2020-03-04 09:25:43 486

原创 深入理解Flutter的Listener组件

引言有过移动端开发经验的同学都知道,移动端的触摸事件是由手指按下、手指移动、手指抬起这些基本事件组成的。在Flutter中,一切皆Widget。Widget本身并不具备识别触摸事件的功能。能识别触摸事件的Widget,必须经由Listener或GestureDetector组装起来。而GestureDetector本质上还是由Listener组成的,所以我们先认识一下Listener。Li...

2020-03-02 00:56:03 3316 1

原创 认识一下Flutter中Navigator数据传递原理

引言在Flutter中,路由间的页面跳转使用的是Navigator.push、Navigator.pop方法。在页面跳转时如何将数据传递过去,目前有两种方法:1、目标页面的构造函数显式接收参数。例如跳转过去的是SearchPage,接收一个字符串参数,则如下所示。Navigator.push(context, new MaterialPageRoute(builder: (BuildCon...

2020-02-23 01:19:07 481

原创 怎样将Gradle构建速度提升90%

一、第一个最有效的办法检查你使用的Gradle插件版本,是不是最新的。如果不是最新的,请升级到Gradle插件的最新版本。Gradle在升级过程中一直对构建速度做了优化,升级到Gradle最新版本后,能将构建速度提升80%,这是最有效的办法。二、Gradle的一些配置项1、Gradle Daemon开启Gradle的守护进程来构建项目:org.gradle.daemon=true...

2020-02-16 18:03:45 300

原创 Navigator的正确打开方式

引言在使用Flutter进行页面间跳转时,Flutter官方给的建议是使用Navigator。Navigator也很友好的提供了push、pushNamed、pop等静态方法供我们选择使用。这些接口的使用方法都不算难,但是我们会经常碰到下面这个异常。Navigator operation requested with a context that does not include a Nav...

2020-01-04 12:43:50 1253

原创 【源码解析】OkHttp的工作原理

引言OkHttp作为优秀的网络请求框架,已经得到了广大Android开发者的认可。对于它的使用方法,大家也是非常的熟悉。例如同步同步请求、异步请求等,都可以使用很简洁的逻辑来实现。由于OkHttp已经封装了繁琐复杂的请求逻辑,开发者只需要使用其提供的API就能轻松的实现网络请求,这使得开发者能将更多的精力放到业务开发上,提高了工作效率。但是,作为一位有追求的Android开发者,不能一味的衣来...

2019-10-29 20:47:15 181

原创 【源码解析】AsyncTask的用法与规则

引言AsyncTask,相信大家已经很熟悉了。它的内部封装了Thread和Handler,这让我们可以将一些耗时操作放到AsyncTask,并且能将结果及时更新到UI上。AsyncTask主要用于短时间耗时操作,长时间耗时操作不建议使用AsyncTask。下面通过Google官方的一个例子来认识AsyncTask的用法。一个例子private class DownloadFilesTask ...

2019-10-16 21:28:11 148

原创 Mac系统下Android Studio快捷键总结

1、当前行上下移动:alt+shift+up/down2、当前方法上下移动:cmd+shift+up/down3、当前行删除:cmd+delete4、选中代码块扩大缩小:option+up/down5、结构体的生成:cmd+option+t,例如生成if、try...catch、while等结构体6、快速生成set、get:cmd+n7、快速定位到行首/尾:cmd+left/right...

2019-09-18 08:48:23 295

原创 换肤方案

背景需求目前Android APP换肤大体可分为两大类:两套主题的切换(比如白天/黑夜),使用一个开关按钮进行切换。多套主题在线下载并更新。第一种的实现基本上使用设置本地Theme来操作,即将所有的资源打包到APP中,并且根据主题进行切换。第二种不可能使用第一种的实现方式,因为将所有资源都打包到APP中缺乏灵活性,不利于活动的更新,并且也会使得apk包的体积变大。所有第二种的实现必须...

2019-09-18 00:54:06 163

原创 Android插件化原理

1、前言这篇文章来讲一下Android插件化的原理和大概的一个运行流程,最后将一个demo呈现出来。2、分析插件说到底就是一个apk文件,我们要做的事情是从宿主中加载该apk文件的类对象(比如启动Activity)和使用该apk文件的资源等操作。我们知道系统是不会安装apk插件的,所以宿主是不知道我们的插件的任何信息。我们之前分析了Activity的启动过程,其实就是在ActivityThr...

2019-09-18 00:52:07 200

原创 Android换肤机制

LayoutInflater我们经常使用LayoutInflater将布局文件渲染成View层级视图,那么具体是怎么使用的呢?目前有四种方式:context.getSystemService()LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVIC...

2019-09-18 00:51:50 142

原创 ClassLoader问题汇总

1、Android中有哪几种ClassLoader?它们的作用和区别是什么?从源码中可以看到,Android中有三个ClassLoader,分别是BaseDexClassLoader、PathClassLoader、DexClassLoader。从上图可以看出,ClassLoader的直接子类是BaseDexClassLoader、SecureClassLoader;间接子类是Delegat...

2019-09-18 00:51:31 152

原创 Dex的加载过程

前言Android有两个主要的classloader,分别是PathClassLoader、DexClassLoader。它们都继承自于BaseDexClassLoader。PathClassLoader主要是用来加载系统类和主Dex中的类,而DexClassLoader主要是用来加载其他Dex文件的类。PathClassLoader现在来看一下PathClassLoader的源码,如下所示...

2019-09-18 00:51:01 316

原创 进程间的通信——AIDL的使用

前言本篇文章主要是讲述AIDL是如何使用的,而不会太具体地介绍一些代码上面的细节。具体的代码细节可以参考IPC机制之Binder机制这篇文章。我们设定一个情景,客户端向服务端添加书籍并获取当前书籍列表的信息,我们来看一下应该怎么实现。服务端的创建使用AIDL,也就是在Binder的基础上面进行进程间的通信。既然是双端通信,必须有一个客户端,一个服务端。这里我们创建一个服务端:public ...

2019-09-18 00:50:44 120

原创 AIDL的作用与调用过程

1、AIDL的作用AIDL是Android Interface Definition Language,意思就是Android接口定义语言。首先它是一种语言,它被设计出来的目的就是为了实现进程间的通信。通过使用AIDL,可以帮我们生成进程间通信时需要用到的类和接口方法。当然,我们也可以不借助AIDL,而是自己实现这些类和方法,但是借助AIDL会让这个过程变得简单方便。2、AIDL支持的参数...

2019-09-18 00:50:28 314

原创 AIDL中的in、out、inout的区别

一、概念说明定向tag是AIDL中语法的一部分,其中in、out、inout是三个定向tag。在官网上关于Android定向tag的定义是这样的:All non-primitive parameters require a directional tag indicating which way the data goes . Either in , out , or inout . Pr...

2019-09-18 00:50:09 901

原创 Binder概述与使用场景

1、什么是Binder从Android代码的角度看,Binder是Android中的一个类,它实现了IBinder接口。从IPC的角度看,Binder是Android中的一种跨进程通信方式,Binder还是一种虚拟的物理设备,它的设备驱动是/dev/binder。从Android Framework的角度看,Binder是ServiceManager连接各种Manager(Activity...

2019-09-18 00:49:50 533

原创 Binder机制的应用——双应用间的通信

前言之前的一篇文章说过了Binder机制的总结与应用,里面的是《Android开发艺术探索》一书的例子,今天特意将Binder机制应用到双应用之间的通信上,看是否可以实现跨进程的通信。客户端1、首先创建两个aidl文件,分别为Phone.aidl、IPhoneManager.aidl,分别表示一个实体类和一个管理类。如下图所示:Phone.aidl的具体代码如下:// Phone.ai...

2019-09-18 00:49:34 293

原创 IPC机制之Binder机制

前言Binder是Android的一个类,它实现了IBinder接口。从IPC角度来说,Binder是Android中的一种跨进程通信方式;从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于A...

2019-09-18 00:49:06 142

原创 单例模式(Singleton)

一、模式介绍单例模式是应用最广的模式之一,在应用这个模式时,单例对象的类必须保证只有一个实例存在。很多时候,整个系统只需要拥有一个全局对象,这样更有利于我们协调系统整体的行为。例如,在一个应用中,应该只有一个ImageLoader对象,由于ImageLoader对象中含有线程池、缓存系统、网络请求等,是很消耗资源的。因此,我们没有必要构造多个实例对象,这个时候可以考虑使用单例模式。二、模式定...

2019-09-17 21:15:04 86

原创 建造者模式(Builder)

原文链接概念建造者模式是将复杂事物的构建与它的表示进行分离,使得同样的构建过程可以创建不同的表示形式。通过Client、Director、Builder和Product创建建造者模式其中Builder负责Product的构建过程,Director负责指导Builder,要求Builder负责按照其的构建方式进行构建,最后Builder返回结果给到Client。网上对此用了一个很形象的比...

2019-09-17 21:14:45 80

原创 面向对象的六大原则

一、单一职责原则单一职责的定义是:就一个类而言,应该仅有一个引起它变化的原因。简单来说,一个类中应该是一组相关性很高的函数、数据的封装。单一职责的划分界限并不总是那么清晰,很多时候需要依靠个人经验来界定。而最大的问题是对职责的定义,什么是类的职责,以及怎么划分类的职责。虽然单一职责的划分比较模糊,但是它也有一些基本的指导原则,例如,两个完全不一样的功能就不应该放在一个类中,一个类应该是一组相...

2019-09-17 21:13:43 72

原创 设计模式的基本原则

引言在设计模式中有六大基本原则,分别是单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则。在这六大基本原则之上,然后衍生了很多具体的设计模式。本文首先从这六大原则说起,然后再对工作中运用的比较多的几种设计模式进行详述。单一职责原则一个类中应该是一组相关性很高的函数、数据的封装。一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变...

2019-09-17 21:13:20 165

原创 Android中MVC、MVP和MVVM

画出这三种开发模式的设计图,并给出它们的适用场景和优缺点。一、MVC1、MVC简介MVC是Model View Controller的缩写,是一种典型的设计开发模式。其中Model为模型,View为视图,Controller为控制器。它的模式设计图如下所示:它的工作流程是这样的:View接收用户的请求操作View将用户的请求操作传递给ControllerController操作Mo...

2019-09-17 21:12:57 141

原创 ListView观察者模式

概述ListView的源码中使用了多种设计模式,我们先来看一下观察者模式的应用。先来看一张UML图:从图中可以看到ListView通过setAdapter方法将观察者对象传递到BaseAdapter中,然后BaseAdapter通过registerDataSetObserver()方法框观察者对象加入到mDataSetObservable列表中,而通过调用Adapter的notifyDat...

2019-09-17 21:12:28 143

原创 排序算法原理与代码实现

1、直接插入排序与希尔排序直接插入排序直接插入排序算法步骤分为两步:首先,将第一个元素当成一个有序的序列,然后将第二个元素到最后一个元素当成是一个未排序的序列。其次,扫描未排序的序列,将扫描到的每个元素插入到有序序列的适当位置。也就是说它会和有序序列的元素从末尾到头部依次比较,并找到自己的位置。Java实现:public static void insertSort(int[]...

2019-09-17 21:12:06 64

原创 LeakCanary监控原理解析

一、引言最近项目中需要对App的性能进行监控并采集性能数据,在内存泄漏的监控上,采用了LeakCanary的Sdk。LeakCanary是业界公认的比较好的一个内存监控项目,很早以前就听说并使用过,但是一直没有去了解其背后的监控原理。今天就借这个项目的开发之际,好好的分析一下其原理。二、原理分析我们还是从LeakCanary的使用上入手,代码如下:final RefWatcher ref...

2019-09-17 21:11:56 150

原创 【源码解析】Activity的启动过程

在平时启动Activity时,我们常用的是在Activity中直接调用startActivity(intent)就可以启动Activity,或者是通过context来启动Activity。归根结底调用的是ContextImpl类的startActivity(intent)方法。所以我们直接从ContextImpl的startActivity(intent)方法开始,而startActivity(i...

2019-09-17 21:11:46 196

原创 【源码解析】Activity的启动模式

2019-09-17 21:11:35 330

原创 【源码解析】bindService的生命周期分析

2019-09-17 21:11:18 655

原创 【源码解析】ContentProvider的启动过程

2019-09-17 19:19:05 237

原创 【源码解析】Service的启动过程

2019-09-17 19:18:39 193

原创 【源码解析】Service的onStartCommand返回值

2019-09-17 19:18:27 182

原创 【源码解析】Service几个重要的方法运行在哪个线程

2019-09-17 19:18:10 324

原创 【Demo验证】Service的onStartCommand返回值

2019-09-17 19:18:01 95

原创 理解Service的几个概念

2019-09-17 19:17:53 153

空空如也

空空如也

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

TA关注的人

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