![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android
迷途の知归
你知道的越多,你不知道的越多
展开
-
从源码角度上分析常用的换肤原理(二)
目录1.原理简述1.LayoutInflater1.原理简述上篇说道外置资源文件的生成,可以和原来自带的资源文件使用两套Resources进行替换,对于新打开的页面可以根据标签对每个View进行判断并赋值,之前的页面会有无法更新的情况,并且对每个View都重写或主动调用相关的设置属性的方法会很麻烦。那么就得从根源上去处理View属性的创建和缓存的逻辑,就是说,从View的创建上入手,获取到相关的属性,用缓存存储相关页面的View属性信息,更换主题的时候通知所有的缓存中的View即可,当然这些View也原创 2020-08-03 22:23:30 · 304 阅读 · 0 评论 -
从源码角度上分析常用的换肤原理(一)
目录1.适用场景2. Resources1.适用场景所谓的换肤,更换主题,其实是对资源文件的替换,或者说使用额外的同id的资源文件进行更新;而换肤能操作的也只能是资源,比如颜色,图片,必须是应用中预先定义好id的资源类型。也就是说,换主题是要额外的外置资源插件,可以是apk文件,而这个插件中有和应用内相同id名称的资源文件。当需要更换主题时,去加载这个插件,得到一个新的Resources对象(这个和原应用的进行区分,同时保留,根据特定的id名称进行查找替换), 重新加载或刷新页面,如果有插件中同名的资原创 2020-08-02 14:39:15 · 396 阅读 · 0 评论 -
从零开始的ThreadPoolExecutor源码解析
目录1.基本参数ThreadPoolExecutor在我们日常操作中经常使用,常见的那些使用基本使用方法和就不说了,这篇分析一下基本源码(其实是因为源码比较少)1.基本参数首先看一下定义的基本参数 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); private static final int COUNT_BITS = Integer.SIZE - 3; private static原创 2020-07-16 10:59:08 · 234 阅读 · 0 评论 -
从实战开始的NestScrolling学习
目录1.开篇2.实战1.开篇网上相关的NestScrolling介绍有很多,而NestScrolling本身也是很简单的,说白了就是几个接口,里面定义了很多方法,而这些方法需要我们自己传递和处理。我们平常能使用NestScrollView和ReyclerView等进行嵌套滑动,这些都是官方已经帮我们把接口处理完毕了本篇打算自己实现接口完成简单的Demo练习,而不借助NestScrollView等已经实现接口的View的继承,用最基本的几大布局来实现如下的效果2.实战上面看起来很复杂,其实说白了原创 2020-07-12 16:45:36 · 493 阅读 · 0 评论 -
Android那些“没用“知识(一)
目录1. addOnPreDrawListener1. addOnPreDrawListeneraddOnPreDrawListener方法是原创 2020-07-02 20:22:49 · 1322 阅读 · 1 评论 -
Jni的两种调用使用方式
目录1.配置信息2.静态方式调用3.动态方式调用1.配置信息本篇博客用的是CLion去做c代码的编写,因为用的是Windows系统,最终会编库译成dll格式的库文件,然后去使用AndroidStudio去运行Java代码,引入这个库文件,实现双向的简单交互,本质和用AndroidStudio生成so文件是类似的,只做演示处理先是在CLion的CMakeLists中添加库的声明add_library(jnitest-lib SHARED test/testJni.c test/com_learn_jn原创 2020-06-16 21:35:41 · 1841 阅读 · 0 评论 -
安卓app加固的简单实现
目录1.app加固原理2.简单的加固处理1.app加固原理我们在用360加固的时候,会发现目录结构变成了这种格式会发现我们自己的代码完全看不见了,而这里会多出一个Application就是StubApp,在这个StubApp中会去加载360的so文件,然后我们的应用就可以正确执行了。并且Mainfest中Application名会修改为StubApp <application android:name="com.stub.StubApp" android:al原创 2020-06-08 02:15:27 · 6054 阅读 · 1 评论 -
Gson的那些常见使用方法你都知道吗
目录1.什么是Gson2.转换的基本用法1.什么是GsonGson是google提供的一种基于Java的工具库,可以把Java对象转化为Json字符串,也可以把Json格式的字符串转化为Java对象。而Json常用于网络数据结构的传输,H5的数据操作也经常会用到json的数据结构2.转换的基本用法说起转换,我们经常用到的两个方法是toJson和fromJson,一个是把对象转成json字符串,一个是把json字符串转成对象。然而对于Gson来说,能转换的并不是严格要求是完全正确的,或者说是格式良好原创 2020-05-28 00:44:34 · 816 阅读 · 0 评论 -
ViewModel简要分析
目录1.使用2.分析1.使用ViewModel通常用于在页面做数据持久化,可以避免横竖屏切换等场景造成的数据丢失通常我们处理这种场景会在onSaveInstanceState进行数据的临时存取,而ViewModel则直接可以简化这种操作使用方法很简单,这样就可以创建一个ViewModelvar viewModel = ViewModelProvider(this, ViewModelP...原创 2020-04-15 04:27:47 · 903 阅读 · 0 评论 -
jetpack之WorkManager的使用方法
目录1.配置信息2.使用方式2.1 定义Worker2.2 创建WorkRequest2.3 执行任务3.拓展3.1 WorkRequest3.2 约束3.3 Worker3.3 批次任务3.3.1 串行执行任务jetpackd的WorkManager可以用来处理后台任务本篇介绍jetpack的WorkManager的基本使用方法1.配置信息 def work_version = "2...原创 2020-04-11 19:59:19 · 557 阅读 · 0 评论 -
Paging流程分析
目录本篇分析的是paging版本2.1.1的流程因为jetpack目前更新频率较快,可能过几周这部分代码会有变动上篇的例子中的ViewModel创建方法为class PersonViewModel : ViewModel { private var liveData: LiveData<PagedList<Person>> constructor...原创 2020-04-13 02:35:52 · 1113 阅读 · 0 评论 -
WorkManger流程分析(一)
目录1.初始化2.执行任务本篇分析的是WorkManger版本2.3.1的流程因为jetpack目前更新频率较快,可能过几周这部分代码会有变动1.初始化private fun test(){ WorkManager.getInstance(this) .enqueue(OneTimeWorkRequest.Builder(Worker::class.java) .build...原创 2020-04-12 13:26:09 · 912 阅读 · 0 评论 -
jetpack之Paging的使用方法
目录1.配置信息2.实现方式2.1 定义数据源对象2.2 定义DataSourcejetpack的paging是用来处理分页数据加载的一环本篇介绍jetpack的paging的基本使用方法1.配置信息def paging_version = "2.1.1"implementation "androidx.paging:paging-runtime:$paging_version" /...原创 2020-04-09 01:20:01 · 1107 阅读 · 2 评论 -
RoomDatabase的使用方法
目录1.配置信息2.使用方法1.配置信息详情参照官方文档 def room_version = "2.2.3" implementation "androidx.room:room-runtime:$room_version" kapt "androidx.room:room-compiler:$room_version" // For Kotlin use kapt ins...原创 2020-04-05 20:48:16 · 3868 阅读 · 0 评论 -
DataBinding流程初探
1.使用方法创建一个布局文件<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> ...原创 2020-04-02 10:58:57 · 619 阅读 · 0 评论 -
Aspect基础使用方法
所谓切面编程,就算将一个完整的流程切分成若干个,然后主流程只关心调用的方法,而不关心具体的实现逻辑,而子流程在完成业务逻辑后会把通知主流程方法继续向下执行或者通知失败;说白了就是方法的拦截操作,可以在方法执行前后进行一定的处理,然后根据需求判断是否是真正进入执行该方法或是直接跳过该方法抛出异常之类的,可以类比成OkHttp的拦截器Aspect是一个实现切面编程的框架,本篇介绍一下Aspect的...原创 2020-03-29 23:32:45 · 2253 阅读 · 0 评论 -
LifeCycle源码解析
LifeCycle基本使用1.1.声明一个监听的观察者,这里方法最多支持两个参数,且只有Any类型可以有两个,其他类型最多只能有一个参数,而且参数类型都固定,不可以定义其他类型const val MTAG = "MLifeCycle"class MLifeCycle : LifecycleObserver { fun log(msg: String) { L...原创 2020-03-29 00:51:00 · 460 阅读 · 0 评论 -
LiveData源码解析
LiveData作为jettpack的一环,常搭配ViewModel一起使用;相比于RxJava,用LiveData封装的LiveDataBus更加简洁方便,并且LiveData会感知页面的信息变化,当页面是不可见的时候,及时Data有数据更新,页面也不会接收到,然后在页面重新可见再去把数据通知给页面,而且在页面销毁时也会及时销毁数据,大大降低了内存泄露的发生;这篇主要简单分析一下LiveData...原创 2020-03-27 12:04:51 · 408 阅读 · 0 评论 -
javapoet实现的Butterknife的view注入功能
1.配置信息1.1 创建一个java-library用于存放注解的类新型[:annotion]apply plugin: 'java-library'然后创建一个用于绑定View的注解,指定为编译时注解类型,用于Filed的注入类型@Target({ElementType.FIELD})@Retention(RetentionPolicy.CLASS)publi...原创 2020-03-24 18:27:30 · 287 阅读 · 0 评论 -
注解实现EventBus功能
核心还是反射,注解相关的好像都需要通过反射去处理实现思路:1.定义一个Map集合存放注册EventBus的对象,以及该对象注册的事件方法和参数2.注册时去遍历获取该对象符合条件的注解属性,并存到步骤1的集合中3.发送事件时,遍历步骤1创建的集合,判断发送事件的Object对象类型,如果集合中有该对象类型或者该对象类型的父类,则认为是匹配的,这时候的key就是实际注册的Activi...原创 2020-03-23 11:12:13 · 350 阅读 · 0 评论 -
注解实现Butterknife注入功能
注解的核心是反射,就是定义了注解参数后,通过注入方法获取到注入的对象,查找相应的属性,如果包含注解信息,则可以拿到相应的value等属性,比如Filed属性 ,最终会通过field.invoke(obj1,obj2)反射设置值,最终实现属性值的设定1.注入View定义一个view的注解,周期指定运行时,Filed属性@Target(ElementType.FIELD)@Reten...原创 2020-03-23 10:40:38 · 276 阅读 · 0 评论 -
Rxjava的基础用法和源码解析(三)
这篇博客的用法主要有: zip,amb,combineLatest ,concatEagerzippublic static <T1, T2, R> Observable<R> zip(Observable<? extends T1> o1, Observable<? extends T2> o2, final Func2<? su...原创 2020-01-31 00:26:04 · 309 阅读 · 0 评论 -
RxJava的Observable创建和发布流程原理简单分析
Rx框架从发布以来已经被越来越多的人所认可,尤其是其类型转换和线程自由切换可以大大减少代码的回调层数,使代码可读性大大提高我们先看一个例子 Observable.just("1") .map(new Func1<String, Integer>() { @Override ...原创 2020-01-27 21:46:56 · 557 阅读 · 0 评论 -
Android使用ViewDragHelper实现简单的view拖拽和吸边功能
工作了几年,最开始做的是安卓开发,后面的做了一段时间逆向和sdk开发,一直没有系统的整理自己的知识,打算从本篇博客开始,陆续复习并记录一下自己的安卓知识一直不知道怎么排版,先凑合着弄下实现效果,gif上传被压扁了ViewDragHelper的用法viewDragHelper是一个安卓自带的处理拖拽的工具先看一下viewDragHelper的创建步骤 public...原创 2020-01-25 00:37:38 · 3249 阅读 · 1 评论 -
Rxjava的基础用法和源码解析(一)
打算从这篇博客开始整理一下Observable的那些api用法这篇博客的用法主要有:just , from,interval, timer, range, never, empty, error, deferjustpublic static <T> Observable<T> just(final T value)public static <...原创 2020-01-28 21:56:00 · 448 阅读 · 0 评论 -
Rxjava的基础用法和源码解析(二)
这篇博客的用法主要有:lift , map ,merge ,concatliftpublic final <R> Observable<R> lift(final Operator<? extends R, ? super T> operator)这个方法算是rxjava中比较核心的方法,后面的map,flatmap等都会用到这个模块,看一...原创 2020-01-29 22:07:50 · 409 阅读 · 0 评论