- 博客(47)
- 资源 (1)
- 收藏
- 关注
原创 Matrix-ApkChecker 关于 Unused Resources的原理
Matrix 的 ApkChecker 中关于无用资源扫描的源码解析
2023-03-25 20:01:22
662
原创 Kotlin 与 Java 对象成员初始化区别
Kotlin 与 Java 对象初始化过程中,对成员变量的赋值是有区别的,Kotlin 不会对成员重复赋予初始值
2022-06-10 10:19:59
485
原创 如何写一个日志框架
整体功能设计1、支持控制台打印2、支持缓存到文件,支持日志文件上传3、支持接入APM性能监控需要考虑的细节有哪些?1、日志文件 和 APM 的区别是什么?APM 是通过上传部分关键日志,使得开发人员可以查询用户APP 的上传每条日志,进行问题排查;而日志文件是存在用户设备上的,一般情况下不会上传,只有需要的时候,通过开关设置,来触发指定名单用户的日志上传,用来获取更多信息来排查问题。2、写入日志文件的策略是什么?内存中日志最大数目是多少?什么时候触发写入文件?日志文件多大?线程怎么管理?最
2022-04-09 10:13:48
567
原创 Gson源码解析
这里写自定义目录标题遇到的问题Gson.fromJson() 源码功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入遇到的问题在使用Gson将 Json字符创 转化为 Java 对象的时候,由于没有给字段加上@Serializab
2021-02-24 20:56:28
346
原创 Dart operator重载操作符介绍
1. 概述operator 是 Dart 的一个关键字,它和运算符(如=)一起使用,表示一个 运算符重载函数,在理解时可将operator和运算符(如operator=)视为一个函数名。使用 operator 重载运算符,是 Dar 扩展运算符功能的方法。使用 operator 扩展运算符功能的原因如下:使重载后的运算符的使用方法与重载前一致扩展运算符的功能只能通过函数的方式实现对...
2019-04-20 22:49:09
5833
1
原创 自定义实现播放暂停Drawable
本文一步步解析自定义播放暂定 Drawable,该 Drawable 可以用于控件的背景,和自定义View是大同小异的。这篇文章的来源是一个开源项目的动画效果,我下载下来看了下,感觉是个入门自定义View很好的例子,所以写了这篇文章~~那个开源项目的名字是 Timber,是个音乐播放器!废话不多说,进入正文~~先看效果图放个大一点的好,当我第一次看到这个效果的时候,...
2019-04-19 17:07:21
656
原创 拍照并使用OkHttp上传图片到服务器
之前遇到需要上传图片到服务器的需要,特此记录~首先是调用相机拍照,首先创建一个 imageUri,并作为参数传入intent,这个 imageUri就是拍照时候照片的存储路径,拍摄完后就可以从这个 imageUri 获得照片的路径等信息了。 private void takePhoto() { File outpuImage = FileUtil.createLoo...
2019-04-14 18:07:20
1960
3
原创 自定义右上角数字圆点ImageView——NumImageView
我们经常会遇到需要在图标的右上角显示一个小红点或者包含数字的小红点,在网上搜罗了一番,然后决定自己来写一个~~效果图如下:可以是圆点、数字加圆点、数字加椭圆字体大小颜色和背景大小颜色都可以调整。源码地址:https://github.com/SkUnK-cc/MyWidgetLib如何使用?首先引入依赖implementation 'com.github....
2019-04-14 17:18:21
1711
原创 Activity状态保存onSaveInstanceState()
当 Activity pause 或 stop时,Activity 的状态会得到保留。 因为当 Activity pause 或 stop时,Activity 对象仍保留在内存中 ,所以它的成员和当前状态的所有信息仍处于活动状态。 因此,用户在 Activity 内所做的任何更改都会得到保留,这样一来,当 Activity 返回前台(即resume)时,这些更改仍然存在。不过,当系统为了恢复内...
2019-04-10 23:02:08
666
原创 Android——一个Demo带你了解MVVM模式
最近学习MVVM模式,特此记录~~本文目的:①主要通过一个 MVVM的 Demo来了解一下我们在平时该怎么使用它②对比 MVP和 MVVM的区别好了,废话不多说~开始吧首先我们来看一下 MVP和 MVVM的结构图:图片来自https://mp.weixin.qq.com/s/PspA4DYPhzLtsJGJykGY0w可以看出两者的区别并不大,MVP的 Pr...
2019-04-07 15:37:28
1333
原创 关于MediaPlayer播放音频的使用及状态管理
最近在app播放音频的时候,时常出现 IllegalStateException,在网上看了别人写的博客,想了解一下MediaPlayer的生命周期及使用时要注意的点,没想到查的资料说法都不一样(后面会指出),索性去看了官方文档,特此记录~~~使用MediaPlayerMediaPlayer类是媒体框架最重要的组成部分之一。此类的对象可以以最少的设置来获取,解码和播放音频和视频。它支持几种...
2019-03-27 22:13:21
1784
原创 前台服务Service更新Notification进度条
在弄音乐播放的app的时候,我们时常需要用一个前台Service来播放音乐,同时管理和更新Notification,而且,Notification的点击事件需要用Broadcast来传递。今天就手把手来看看如何在Service中管理Notification以及Broadcast!首先,我们先来看看Notification的布局,xml文件如下:<?xml vers...
2019-03-26 11:44:22
2764
原创 JVM内存模型
程序计数器(线程私有):也有称作PC寄存器。每个线程都有一个私有的程序计数器,程序计数器存放的是当前线程所执行的字节码的行号指示器。当CPU需要执行指令时,需要从程序计数器中得到当前需要执行的指令所在存储单元的地址,然后根据得到的地址获取到指令,在得到指令之后,程序计数器便自动加1或者根据转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令。程序计数器也控制着程序的分支、循环、跳转...
2019-02-25 23:09:25
244
原创 Glide4缓存机制源码解析
这篇文章基于Glide4,只分析Glide4的缓存机制,如果大家还不了解Glide4源码,可以去看一下下面这两篇做一下铺垫:Glide4初始化Glide4数据模型转换与数据获取好了,直接进入正题~~这里以加载一张网络图片来讲解缓存过程,从前面的文章中可以知道,当第一次加载一张新的网络图片时,本地是没有这张网络图片的缓存的。所以会进入到SourceGenerator类的start...
2019-02-22 23:18:08
638
1
原创 关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题
假设下面一种情况:当前Activity中持有一个fragment对象,且fragment中有一个AsyncTask异步任务正在执行,当配置发生改变时(比如屏幕旋转),假设消息队列的情况如下1.配置改变,用户旋转屏幕,但是此时AsyncTask已经运行2.Fragment的onDetach方法被调用3.AsyncTask的doInBackground方法完成,也就是后台任务执行完毕4....
2019-02-08 13:31:23
596
原创 初学Flutter基础:关于InheritedWidget的理解
InheritedWidget是Flutter的一个功能型的Widget基类,它能有效地将数据在当前Widget树中向它的子widget树传递。它的子Widget树可以通过 BuildContext.inheritedFromWidgetOfExactType()方法获得最近的指定类型的Inherited widget,进而获取它的共享数据。在介绍State生命周期时,我们说到State对象...
2019-02-03 23:20:43
7014
1
原创 使用BottomSheet和BottomSheetDialog实现嵌套滑动效果
先看效果: 这就是我们要实现的嵌套滑动效果,即在同一个事件序列中,先滑动外部控件,当外部控件滑到设定的高度时,滑动内部空间。我们都知道,在传统的时间分发机制中,某个View一旦决定拦截,那么这一个事件序列都只能由它来处理(如果事件序列能够传递给它的话)并且它的onInterceptTouchEvent不会再被调用。所以上面的效果用传统的事件分发是无法实现的。这时候就要用到我们的Nest...
2019-02-01 16:30:21
6188
1
原创 Flutter中State的生命周期
State作为StatefulWidget的逻辑和内部状态的持有者.一个StatefuleWidget类会对应一个State类,在Widget生命周期内,当Widget被build或者Widget发生改变时,会同步读取State的信息。当Widget状态发生改变时,有必要使用State.setState()及时通知State。State中有两个常用属性: widget,它表示与该St...
2019-01-27 00:00:18
2557
原创 关于Class.forName()与ClassLoader.loadClass()与new的区别
这篇文章解决三个问题:1.Class.forName()与ClassLoader.loadClass()的区别;2.new与Class.forName()的区别;3.有了new,为什么还要Class.forName();一、Class.forName()与ClassLoader.loadClass()的区别首先了解Java类的加载机制,什么是类的加载?类的加载指的是将类的....
2018-12-28 23:02:24
1258
原创 Android存储路径
总结存储路径,方便下次查阅,看了很多介绍存储路径的文章,但是还是自己验证一下来的爽快~这里分为内部存储和外部存储。内部存储:即手机自带的存储目录。外部存储:如SD卡。不管现在的手机是否有可移动的SD卡,总是有外部存储和内部存储。先上图:内部存储(一)非私有目录:不会随着 APP 的卸载而删除1. Environment.getDataDirectory()...
2018-11-22 18:02:45
49869
原创 组件化入门——手把手写一个Demo
组件化开发就是基于可重用的目的,将一个大的软件系统分离,拆分成多个独立的组件。组件可以是模块、web资源、软件包等。最近想知道组件化是什么东西,于是看了很多博客,设计到很多理论知识,但是越看越懵。还不如找个Demo学一下,学的过程又遇到很多新的东西,特此记录一下!顺便也可以作为新手入门组件化的文章(不要脸- -)。。。我觉得看再多还不如跟着写一个Demo来的实际点。所以,开始吧!我们先...
2018-11-21 22:11:06
1907
原创 Android——View绘制流程
ActivityManagerService在介绍ActivityManagerService之前,我们先简单了解一下Android Zygote系统启动过程。在Android系统中,所有的应用程序进程和系统服务进程SystemServer都是由Zygote进程孕育(fork)出来的,因为Android系统是基于Linux内核的,而在Linux系统中,有一个init进程,他是内核启动的第一个...
2018-11-07 20:13:42
522
原创 简单使用Camera自定义相机
最近需要使用到自定义的相机,由于网上的教程大多讲不清楚,于是自己去找了个开源的自定义相机学习了下。现在起码知道怎么用了,所以在此简单记录一下,顺便加深一下理解。先看效果图:首先,想要使用相机,那我们需要的就是一个能够显示摄像头拍摄到的图像的控件,这个控件就是SurfaceView。那么SurfaceView是什么呢? 从这里我们可以知道①SurfaceView继承自View,②S...
2018-10-27 06:03:58
1244
原创 常用网络命令ARP、FTP
ARP常用命令ARP(地址解析协议) 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以...
2018-10-11 13:47:49
1490
2
原创 沉浸式状态栏详解
要想知道各式各样的状态栏怎么实现的,我们先要了解一下下面几个方法的作用!setSystemUiVisibility这个方法可以改变系统UI的可见性。使用如下:int flag = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;getWindow().getDecorView().setSystemUiVisibility(flag);系统为这个方法...
2018-10-08 22:29:49
359
原创 Android——主线程的loop为什么不会造成死循环?
线程是一段可执行的代码,当可执行代码执行完成后,线程生命周期便该终止了,线程退出。而对于主线程,我们是绝不希望会被运行一段时间,自己就退出,那么如何保证能一直存活呢?简单做法就是可执行代码是能一直执行下去的,死循环便能保证不会被退出。MainThread的loop为什么不会造成死循环?因为这个loop处理一切的事件,包括绘制,点击事件等等,它停止了,那整个android程序就退出了。但这...
2018-10-05 16:25:45
1132
原创 Android——new Canvas(Bitmap)中对canvas和bitmap的理解
最近刚接触自定义View的时候,看到Canvas有一个构造函数需要传入一个Bitmap,不解。于是有了这篇文章!我们先看Canvas的定义:The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canva...
2018-09-28 19:02:02
9328
2
原创 简洁易懂——网络七层协议
国际标准化组织ISO于1984年提出了OSI(Open Ssystem Interconnection Reference Model,开放系统互联参考模型)。OSI很快成为计算机网络通信的基础模型。OSI依层次结构来划分:第一层,物理层;第二层,数据链路层;第三层,网络层;第四层,传输层;第五层,会话层;第六层,表示层;第七层,应用层。层次结构如下图。物理层物理层负责连接计算机与...
2018-09-26 23:13:17
3607
原创 RxJava2源码解析
本篇文章的目的:①了解RxJava的基本流程②了解RxJava中线程调度的实现③了解了上面那些,其他的操作符对你来说就不是问题了RxJava基本流程我们从基本的使用作为入口:Observable.create(new ObservableOnSubscribe<String>() { @Override publ...
2018-09-21 15:10:57
371
原创 自定义ViewPager导航控件
项目中我们经常会使用viewpager+fragment,这时候就需要一个导航控件,本文介绍如何自定义一个导航控件。先看效果图:先看xml布局文件:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com...
2018-09-19 23:13:01
494
原创 Android使用OkHttp3实现多文件下载、断点续传
最近在音乐app中遇到在线歌曲下载问题,于是有了这篇文章。这篇文章借鉴了https://blog.youkuaiyun.com/cfy137000/article/details/54838608,在此感谢,自己在此基础上修改了一点。代码用Kotlin写的,这里只上核心代码。class DownloadManager { //这里采用单例模式 companion object {...
2018-09-18 19:21:34
4335
7
原创 Fragment中getContext得到的context从哪来?
我们先看下fragment的getContext方法: @Nullable public Context getContext() { return mHost == null ? null : mHost.getContext(); }可以看到context是由mHost的getContext方法得到的,Ctrl+左键发现mHost是一个Fragm...
2018-09-10 21:19:50
6329
4
原创 Kotlin变量声明属性
kotlin中的属性声明有两种:var声明普通变量,val声明只读变量(即Java中的final类型)。1、var可以使用lateinit延迟初始化,val在声明时必须初始化,但两者都可以用abstract修饰,让子类来初始化2、空安全:当我们使用Java开发时,我们的代码大多是防御性的。如果不想遇到NullPointerException,我们就需要在使用它之前不停地去判断它是否为nul...
2018-09-09 22:19:33
928
原创 PopupWindow使用
我们常见的PopupWindow使用如下:PopupWindow popupWindow = new PopupWindow(contentView,width,height);popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));popupWindow.setOutsideTouchable(tr...
2018-09-06 14:50:40
479
原创 Activity启动模式SingleTask和Intent.FLAG_ACTIVITY_CLEAR_TOP区别
Activity启动模式介绍 Android 启动模式之前,先介绍两个概念task和taskAffinity task:翻译过来就是“任务”,是一组相互有关联的 activity 集合,可以理解为 Activity 是在 task 里面活动的。 task 存在于一个称为 back stack 的数据结构中,也就是说, task 是以栈的形式去管理 activity 的,所以也叫可以称为“...
2018-08-29 21:21:31
6933
2
原创 Fragment与Activity之间生命周期的关系
本篇文章讲Fragment生命周期和Activity生命周期的关系,如图:可以看到Fragment的生命周期和它所在的Activity的生命周期是相关联的看Demo:public class MainActivity extends BaseActivity{ private FrameLayout fragContainer; @Override p...
2018-08-26 15:51:28
3326
转载 Android SDK作用和结构
本文主要介绍一下SDK目录结构!现在对SDK目录做一下总结阐述!SDK目录add-ons这里面保存着附加库,第三方公司为android 平台开发的附加功能系统。比如GoogleMaps,当然你如果安装了OphoneSDK,这里也会有一些类库在里面。docs这里面是Android SDKAPI参考文档,所有的API都可以在这里查到。extras该文件夹下存放了Andr...
2018-08-26 14:57:34
10695
原创 Retrofit源码解读
本篇文章使用的是Retrofit 2.3.0版本。Retrofit是基于okhttp的一个RESTful的HTTP网络请求框架的封装,内部的网络请求还是由okhttp完成的,对OkHttp不了解的可以看看:OkHttp3源码解读(一)同步与异步 OkHttp3源码解读(二)请求响应与拦截器Retrofit封装了接口层的请求参数以及请求结果的解析及转换(支持Gson、XML、JSON、p...
2018-08-23 22:11:03
570
原创 OkHttp3源码解读(二)请求响应与拦截器
OkHttp3源码解读(一)同步与异步上篇文章对比了同步与异步请求流程的区别,最终都是通过getResponseWithInterceptorChain()方法返回得到响应,这个方法涉及到了okhttp的核心,也就是拦截器,接下来我们了解一下其工作原理。Response getResponseWithInterceptorChain() throws IOException { ...
2018-08-19 23:00:56
908
原创 OkHttp3源码解读(一)同步与异步
OkHttp3系列OkHttp3源码解读(一)同步与异步OkHttp3源码解读(二)请求响应与拦截器OkHttp是一个很常用的网络请求库,支持HTTPS。缓存、异步/同步请求。协议类型是Http/1.0,Http/1.1,SPDY,Http/2.0,WebSocket。Http/1.0 每一次请求创建一个TCP连接。Http/1.1 起,默认使用Keep-alive机制建立长连接,...
2018-08-19 11:19:12
1071
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人