android
文章平均质量分 90
昨夜西风在吹
这个作者很懒,什么都没留下…
展开
-
android 组件化之概述《一》
前言模块化在进入组件化之前,我们先说一下模块化。一个功能分为一个模块,例如登录模块,支付模块,广告模块。传统的开发模式中一个模块就是一个Module(也有不同模块放在不同包里面的情况)。模块在功能上对代码进行了划分,但是在开发上任然存在问题。例如当 需要debug 某一个模块的时候此时我们必须编译整个项目,当项目比较大的什么会很耗时间。我们希望任何一个模块都可以单独运行,单独测试。实际组件化话主要解决的就是上面这个问题,希望将每一个模块都可以单独开发,运行,测试...原创 2021-07-09 10:25:37 · 176 阅读 · 1 评论 -
android 组件化之ARouter《二》
一 ARouter的使用步骤第一步 添加依賴因为ARouter在各个模块都会用到,因此可以在ModuleBase 里面添加依赖。 api 'com.alibaba:arouter-api:1.4.0'第二步 引入注解处理器ARouter 使用了编译时注解,这里需要在各个子模块引入处理器。annotationProcessor 'com.alibaba:arouter-compiler:1.2.1' 为编译期间生成路径映射。同时也需要在各子模块的build中加入..原创 2021-07-09 10:25:27 · 390 阅读 · 1 评论 -
android 组件化之ARouter《三》
前言我前一篇介绍偶尔ARouter的初始化过程已经导航过程。在初始化话的时候我们知道需要遍历所有的dex 文件找到编译期间生成的类,这个过程比较耗费时间,因此ARouter 提供了一个gradle 插件在编译期间遍历所以的class 文件,找到动态生成的类,然后动态修改字节码插入部分代码,避免了程序运行期间查找,提高了效率。本篇就来研究器实现方式。一、动态生成的代码我们通过Route 注解了一个名为TestActivity的页面,在编译期间会动态生成一些类,关于动态生..原创 2021-07-09 10:25:14 · 317 阅读 · 1 评论 -
android 内存管理之adj 《四》
概述前面几篇介绍了adj与内存回收之间的关系,在实际应用中我们可以根据adj 来优化我们的app。1.1 优化1.ui进程启动service的隐患案例a:进程启动一个服务开始执行备份,备份服务运行在ui进程(服务未调用startForeground())隐患:备份服务一般需要较长时间,在用户按Home键退出后台后,备份进程会处于previous状态,继续使用手机其他应用,会是使得备份进程处于cch-started-ui-services的状态,即是启动了服务并且包含ui的进程原创 2021-07-09 09:44:20 · 188 阅读 · 0 评论 -
android 内存管理之adj 《三》
概述1.1 oom_adj与oom_score_adjAndroid系统的设计理念正是希望应用进程能尽量长时间地存活,以提升用户体验。因此当应用推入到后台的时候进程并不会被立即杀死,而是存活一段时间,这样下次再使用则会非常快。但是如果处于后台的进程过多导致内存不足,此时就必须有选择的杀死部分进程。到底该回收哪个进程呢?那么需要一个能管理所有进程,根据一定策略来释放进程的策略,这便有了lmk,全称为LowMemoryKiller(低内存杀手),lmkd来决定什么时间杀掉什么进程。系...原创 2021-07-09 09:44:03 · 1518 阅读 · 0 评论 -
android 内存管理之adj 《二》
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数..原创 2021-07-09 09:43:28 · 1188 阅读 · 0 评论 -
android 内存管理之adj 《一》
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数..原创 2021-07-09 09:43:14 · 647 阅读 · 0 评论 -
android 开发之activity 启动流程《四》
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数..原创 2021-07-08 21:21:57 · 589 阅读 · 1 评论 -
android 开发之activity 启动流程《三》
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数..原创 2021-07-08 21:21:42 · 626 阅读 · 0 评论 -
android 开发之activity 启动流程《二》
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数..原创 2021-07-08 21:21:27 · 444 阅读 · 0 评论 -
android 开发之activity 启动流程《一》
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数..原创 2021-07-08 21:21:12 · 440 阅读 · 0 评论 -
Android 开发之Gradle《二》脚本的函数的调用
一、MOP前面一节说过build.gradle 脚本会被编译为一个ProjectScript 的子类,因此我们可以在build.gradle 里面调用ProjectScript的所有方法,但是上面调用的getRootProject 方法是Project 的方法,难道build.gradle脚本编译之后生成的类是Project 的子类?。答案当然是否定的。下面我们就来看看这是怎么回事。1.1 groovy 对象首先我们要知道Gradle 脚本使用的groovy 语言。Groovy 中的对象其实原创 2021-07-08 19:20:07 · 815 阅读 · 0 评论 -
Android 开发之Gradle《三》DynamicObject
前言在前一篇文章里面介绍了build.gradle 里面方法调用的路由过程,知道了build.gradle 内部调用方法会通过DynamicObject 映射到对应的Project类里面。build.gradle 脚本在编译之后会生成一个BasicScript子类,BasicScript有一个成员变量target,放到build.gradle脚本里面来讲target 就是Project 对象,setting.gradle 脚本里面target就是Settings对象。假如build.gradle 脚本原创 2021-07-08 19:19:52 · 313 阅读 · 1 评论 -
Android 开发之Gradle《四》Configuration
前言在往下面讲解前,我们先了解一下Configuration的一些知识。按照官网所说:Every dependency declared for a Gradle project applies to a specific scope. For example some dependencies should be used for compiling source code whereas others only need to be available at runtime. Gradle rep原创 2021-07-08 19:19:42 · 1663 阅读 · 1 评论 -
Android 开发之Gradle《四》依赖下载
前言 implementation 'org.greenrobot:eventbus:3.0.0'前面一章介绍了通过implementation 添加依赖的执行过程,在build 阶段的时候gradle 就会下载对应的额依赖。本章主要研究依赖的下载过程。一 下载依赖Configuration 有一个resolve 方法。 /** * Resolves this configuration. This locates and downloads the files which m原创 2021-07-08 19:19:31 · 1062 阅读 · 0 评论 -
Android 开发之Gradle《一》
前言现在的Android应用都是采用Android Studio来开发的,AS默认是采用Gradle作为构建工具的。所谓的构建工具是一个把源代码生成可执行应用程序的过程自动化的程序(例如Android app生成apk)。构建包括编译、连接跟把代码打包成可用的或可执行的形式。下载依赖将源代码编译成二进制代码打包生成的二进制代码进行单元测试部署到生产系统在Android开发中,很多时候我们不需要修改 *.gradle 文件太多,我们添加依赖、修改target compile、最低支持API原创 2021-07-08 19:18:56 · 614 阅读 · 0 评论 -
Android 开发之Glide《五》缓存
前言一、简介缓存设置 Glide.with(this).load("url").skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.ALL)设置内存缓存开关:true 表示不使用内存缓存skipMemoryCache()设置磁盘缓存模式:diskCacheStrategy()可以设置4种模式:DiskCacheStrategy.NONE:表示不缓存任何内容。DiskCacheStrategy.DATA:表示原创 2021-07-08 19:18:47 · 1123 阅读 · 0 评论 -
Android 开发之Glide《四》ModelLoader
一、ModelLoader翻译过来就是将复杂数据模型转换为具体的数据。数据模型就是资源的地址,这个地址一般是url,但是也可以是任何自定义的类,如果是一个自定义一的类,那么我们就必须提供对用的LoadData。这个LoadData 负责加载根据资源的地址获取到对应的数据。Glide 默认的资源地址类型可以是URL,URL,String ,GlideUrl。例如 Glide.with(this).load("https://n1image.hjfile.cn/zhuanti/2020原创 2021-07-07 10:12:02 · 583 阅读 · 0 评论 -
Android 开发之Glide《三》
前言前面一章我们介绍了Glide 下载图片的过程,我们本章梳理下载图片之后回调的过程一、回调loadData 获取到数据流之后通知回调,数据就绪。此处的callbakc 实际指向的是SourceGenerator。所以看看SourceGenerator对象的onDataReady方法都做了什么private final FetcherReadyCallback cb; //成员变量@Overridepublic void onDataReady(Object data) { DiskC原创 2021-07-07 10:11:48 · 123 阅读 · 0 评论 -
Android 开发之Glide《二》
前言前一章介绍了Glide 的创建与Request 的创建,本篇我们探究Request 的执行过程。一、下载图片 private <Y extends Target<TranscodeType>> Y into( @NonNull Y target, @Nullable RequestListener<TranscodeType> targetListener, @NonNull RequestOptions options)原创 2021-07-07 10:11:35 · 212 阅读 · 0 评论 -
Android 开发之Glide《一》
前言Glide是一个快速高效的Android图片加载库。同样的本篇文章侧重分析Glide的源码分析,不介绍Glide 的使用,有不会用的同学可以先百度一下。在介绍Glide 之前,我们先分析一个图片库需要解决哪些问题。通常情况下我们的图片都是展示在一个列表里面,如果上下滑动的话,需要确保这个图片只会创建一次请求。快速滑动列表的时候会android 会复用View,此时怎么避免图片显示错乱,例如ImageView当前显示A图片,滑动的时候会多次复用,需要依次显示B,C 图片,需要确保图片显示原创 2021-07-07 10:11:22 · 503 阅读 · 0 评论 -
Android 开发之编译时注解之基础知识
注解注解,也被称为元数据,为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。(Java编程思想)目前很多框架开发或者Android开发中都用到了注解,SDK开发中也有很多可以对接口添加限制以规范用户使用的规则,这些都是值得我们去学习的。关于注解的基础知识与android自定义注解本文就不做具体的介绍了,给大家推荐一篇博文如果有不了解android 自定义注解的同学可以先看看这篇文章。android自定义注解简单的例子public class MyPr原创 2021-07-07 09:02:56 · 361 阅读 · 0 评论 -
Android 开发之EventBus《二》
前言在EventBus 源码解析里面我们已经分析过EventBus 是如何通过反射获取到注解的方法,并且在post消息的时候将消息分发给对应的方法处理的流程。在通过反射获取获取所有的被Subscribe注解的方法的时候需要获取类内所有的方法,在过滤这个方法上是否是存在 Subscribe注解,这个过时比较耗时,因此EventBus通过编译时注解在编译时获取到Subscribe注解的方法的名称,参数等信息,在调用register的时候可以快速获取到所有被Subscribe注解的方法,以此提高了效率。我们本篇原创 2021-07-07 09:02:45 · 265 阅读 · 0 评论 -
Android Okhttp3《四》CacheInterceptor之DiskLruCache
前言本章我们介绍一下ConnectInterceptor,这个类主要是与服务端建立连接操作,例如HTTP1,HTTP2,HTTPS以及HTTP代理与Socktet代理。在 OKHTTP 底层是通过 SOCKET 的方式于服务端进行连接的,并且在连接建立之后会通过 OKIO 获取通向 server 端的输入流 Source 和输出流 Sink。这里我们仅仅分析HTTP1 的相关部分,同时本篇不会像之前几篇写的那么细致入微,这里仅仅大致分析一下其实现方式。一、ConnectInterceptor1.1原创 2021-07-07 07:48:40 · 176 阅读 · 0 评论 -
Android 开发之Retrofit》《一》
一、Retrofit是什么?Retrofit 是一个 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装,所以你可以将Retrofit 看成是一个对OkHttp 封装的网络请求框架。本篇文章也不但算介绍Retrofit 的基本用法,而是研究一下Retrofit源码,知其然也要知其所以然。二、源码解析 public interface NetInterface { @GET("getSomething")原创 2021-07-07 07:48:28 · 294 阅读 · 0 评论 -
Android 开发之EventBus》《一》
一、EventBus 简介EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,。它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多不便。EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。本篇文章照旧不会介绍EventBus 的基本使用,而是作用着重与源码,研究Event原创 2021-07-07 07:48:19 · 367 阅读 · 0 评论 -
Android Okhttp3《一》
前言OkHttp 就不做多余的介绍了,可说说是目前使用最广泛的网络请求框架,在很多的其他第三方框架中也是用了改网络请求框架例如Retrofit,这里主要想说一些问什么使用okhttp。一、为什么使用版OKHttp1.1 Socket如果我们需要从服务器获取一个资源,那么就一定需要访问网络,访问网络就一定需要使用到Socket,我想大家在学习Java的网络编程的时候也就是Socket 编程的时候一定写过客户端与服务端,客户端法一个消息然后服务端返回一个消息,就是一个极为简单的聊天软件,理论上我们可以通原创 2021-07-06 09:31:29 · 234 阅读 · 0 评论 -
Android Okhttp3《二》RetryAndFollowUpInterceptor
前言前一篇文章简单介绍了OkHttp 以及创建一个请求与请求执行过程,本编继续接着向下介绍一、责任链 private Response getResponseWithInterceptorChain() throws IOException { // Build a full stack of interceptors. List<Interceptor> interceptors = new ArrayList<>(); interceptors.a原创 2021-07-06 09:31:19 · 347 阅读 · 0 评论 -
Android Okhttp3《三》BridgeInterceptor
前言前一篇文章介绍了RetryAndFollowUpInterceptor,这一篇介绍OKHttp的第二个拦截器BridgeInterceptorBridge,桥,什么桥?按照官方对此类的注释所说:Bridges from application code to network code. First it builds a network request from a user request. Then it proceeds to call the network. Finally it buil原创 2021-07-06 09:31:08 · 170 阅读 · 0 评论 -
Android Okhttp3《三》CacheInterceptor
前言前一篇文章介绍了BridgeInterceptor,本篇我们介绍CacheInterceptor,望文知意,CacheInterceptor 肯定与数据的缓存有关系。一 HTTP 缓存在进入源码之前,这里需要介绍一下HTTP 协议中关于缓存控制的部分。1.1 Cache-Control1.1.1在请求中使用Cache-Control 时,它可选的值有:Cache-Control 是用于告诉浏览器或者是代理服务器关于使用缓存的一些方式,这个字段对于最终的服务器而言没有什么作用。app内部使原创 2021-07-06 09:30:57 · 264 阅读 · 0 评论 -
Android Okhttp3《四》CacheInterceptor之DiskLruCache
前言通过上一篇文章我们知道CacheInterceptor 最终使用DiskLruCache 将网络数据保存在本地次磁盘,这一篇我们就来研究一下DiskLruCache 的源码。一、DiskLruCache不想啰里啰嗦的介绍了,看名字就知道是用来在硬盘缓存数据的一个框架,DiskLruCache(Google官方编写,但获得官方认证。在进入源码之前,需要介绍一些相关的东西,否者直接读源码会读的雨里雾里。在DiskLruCache 有一个journal 文件,这个文件记录了每次读取操作的记录,类似原创 2021-07-06 09:30:46 · 280 阅读 · 0 评论 -
android Jetpack《三》Room(一)
系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言Room的使用Room 数据库的创建一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言 Android 应用数据存储简单来说有这么几种:文件存储、SharedPreference 存储、SQLite 数据库存储,第三方的网上数据库存储。 当需要本地存储大原创 2021-07-06 09:30:11 · 180 阅读 · 0 评论 -
android Jetpack《三》Room之SQLiteOpenHelper
SQLiteOpenHelper 是什么 依照官方的解释就是一个用户管理数据库的帮助了,也就是用于数据库的增删改查的一个帮助类。 实际上在Android 里面对于数据库的操作都需要使用的这个类,包括第三方的各种orm框架,在底层依然还是使用的SQLiteOpenHelper 操作的数据库,当然Room框架也不会例外。 所以我们就从SQLiteOpenHelper 开始逐步进入Room框架一、创建数据可以看到获取读数据库与写数据库都是通过getDatabaseLocked 方法区别只是参数原创 2021-07-06 09:30:00 · 558 阅读 · 0 评论 -
android Jetpack Room之数据库的创建
前面一篇介绍了Room的对于SqliteOpenHelper 的封装,本篇就来了解一下Room 框架中数据库的框架以及对SqliteOpenHelper封装之后 的使用。 由于Room框架使用的编译时注解,会在编译期间生成很多的类,所以这先贴出一个Room的使用范例示例// 定义表非常简单,只需要创建一个 class 并标记上 Entity 注解,// 可以使用它的 `tableName` 属性声明该表的名称@Entity(tableName = "table_cache")class原创 2021-07-06 09:29:50 · 1178 阅读 · 0 评论 -
android Jetpack Room之增删改查
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档前言 上一篇主要介绍了RoomDateBase的创建过程,本篇主要介绍的是对于Room对于数据库的操作的过程,虽然文章的标题是增删改查,但是四者之间的流程是差不多的,所以这里不会每个操作的流程都逐一分析。 Room对于数据库的操作一般都封装在一个使用@Dao注解的类里面,Dao全称data access object 翻译为中文就是数据访问对象。 本文依然采用上一章的例子@Daointerface CacheDaoTest原创 2021-07-06 09:29:36 · 814 阅读 · 0 评论 -
android Jetpack Room之数据库加密
数据加密 Android平台自带的SQLite有一个致命的缺陷:不支持加密。这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到。如果是普通的数据还好,但是当涉及到一些账号密码,或者聊天内容的时候,我们的应用就会面临严重的安全漏洞隐患。加密方案第一种方案 在数据存储之前进行加载,在加载数据之后再进行解密,这种方法大概是最容易想的到,而且也不能说这种方式不好,就是有些比较繁琐。 如果项目有特殊需求的话,可能还需要对数据库的表明,列明也进行加密。第二种方法 对数据库整个文件进行加密原创 2021-07-06 09:29:17 · 2694 阅读 · 3 评论 -
android Jetpack《一》
Jetpack 简介JetPack 不是一个库。更多的是Google的一个态度。早些时候,Android开发者基本都是被放养的。生态基本全靠自建,代表有Square全家桶,Glide,Google自己也肯定是出力的,只不过并没有明确Android开发的几个大方向。比如Support lib 经常自己打自己脸。一会推这个API, 一会又Deprecate那个API,再比如标准库中Camera API,苦不堪言。Google自家的几个库又并不是那么好用,比如Volley,当然Google也有许多优秀的库,比如原创 2021-07-05 17:45:38 · 143 阅读 · 0 评论 -
android Jetpack《二》ViewModel
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、ViewModel是什么?二、ViewModel 的创建1.工厂模式2 其他二、ViewModel 保存现场2.读入数据总结前言前一篇文章介绍了android 开发的三种建构,MVC,MVP,MVVM。 本篇开始介绍android MVVM 架构中的ViewModel一、ViewModel是什么?关于ViewMdoel 是什么,有什么作用?我们看看ViewModel 源码里面给我们的注释* ViewModel i原创 2021-07-05 17:45:14 · 156 阅读 · 0 评论 -
android Jetpack《二》LiveData
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言什么是LiveDataLiveData 的特点与作用LiveData 与生命周期LiveData 添加观察者黏性消息不绑定生命周期前言什么是LiveDataLiveData is a data holder class that can be observed within a given lifecycle. * This means that an {@link Observer} can be added in原创 2021-07-05 17:43:52 · 148 阅读 · 0 评论