目录
Java
泛型
集合
ArrayList
LinkedList
HashMap
LinkedHashMap
ConcurrentHashMap
多线程并发
volatile
线程
反射
JVM
类加载
怎么判断对象是否已死?
垃圾回收机制
四大引用
泛型
集合 ——HashMap、ConcurrentHashMap源码和数据结构
多线程
反射
JVM ——类加载、内存模型、内存管理机制、垃圾回收机制
Android
四大组件和Fragment
activity
Service
BroadcastReceiver
ContentProvider
Fragment
Handler
Hander消息分发机制
HandlerThread
IdleHandler
View
View绘制流程
View加载流程
View事件分发机制
自定义View
布局、资源
动画
应用启动流程
系统启动流程
View事件分发机制
IPC通信
进程优先级与进程保活
AMS源码
WMS源码
数据结构与算法
设计模式
应用架构
性能优化
安全优化
开源框架源码
网络
数据存储
图片
Kotlin
其他
Kotlin 泛型 | 01. 基础_Swuagg的博客-CSDN博客一、泛型1.1 含义参数化类型,用尖括号这种方式表示,如
Kotlin 泛型 | 02. 高阶 - 型变_Swuagg的博客-CSDN博客三、泛型型变:协变、逆变与不变3.1 协变3.1.1 基本定义如果在定义的泛型类、接口和泛型方法的泛型参数前面加上 out 关键词,说明这个泛型类、接口和泛型方法是协变。也就是说,A 是 B 的子类,那么 List 也是List 的子类。class Demo { interface Producer
List、Set、Map、Queue
数组+双向链表/红黑树,能够保证访问顺序的HashMap,LruCache内部使用它做最近最少使用的移除
Java线程池的使用_Swuagg的博客-CSDN博客线程池的产生(1)线程池的产生来源于new Thread的弊端在程序中创建一个线程,通常如下形式:new Thread(new Runnable() { @Override public void run() {}}).start();但这种方式的弊端很明显:每次都new Thread新建对象,性能差。线程缺乏统一管理,可能无限制新建线程,相互之间竞争,...https://blog.csdn.net/Agg_bin/article/details/93889210?spm=1001.2014.3001.5501
if (worker != null) {
worker.interrupt();
try {
worker.join();
} catch (InterruptedException e) {
e.printStackTrace();
worker.interrupt();
}
Java的引用——强引用 、软引用、弱引用、虚引用_Swuagg的博客-CSDN博客先知Java中除了八大基本数据类型,其他都是引用类型,指向各种不同的对象。java.lang.ref包下提供了引用对象类(共包括五个类:PhantomReference、Reference、ReferenceQueue、SoftReference、WeakReference),支持在某种程度上与垃圾回收器GC(垃圾回收机制回收某个对象主要是看是否有引用指向这个对象)之间的交互。对象分类...https://blog.csdn.net/Agg_bin/article/details/93502712?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078175816782388062032%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078175816782388062032&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-93502712.nonecase&utm_term=%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6&spm=1018.2226.3001.4450
启动Activity的方式_Swuagg的博客-CSDN博客显示启动构造方法传入Component,最常用的方式setComponent(componentName)方法setClass/setClassName方法隐式启动通过在AndroidManifest文件中设置action、data、category,让系统来筛选出合适的Activity。action的匹配规则Intent-filter action可以设置多条intent中的action只要与https://blog.csdn.net/Agg_bin/article/details/90486145?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078201416782350932823%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078201416782350932823&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-90486145.nonecase&utm_term=Activity&spm=1018.2226.3001.4450
参考:Android四大组件之Service_Swuagg的博客-CSDN博客https://blog.csdn.net/Agg_bin/article/details/94573631?spm=1001.2014.3001.5502
setContentView——decorView——LayoutInflate——XML的pull方式IO操作——反射创建
步骤:onMeasure,可以不重写,不重写的话就要在外面指定宽高,建议重写; onDraw,看情况重写,如果需要画东西就要重写; onTouchEvent,也是看情况,如果要做能跟手指交互的View,就重写
注意事项:如果有自定义布局属性的,在构造方法中取得属性后应及时调用recycle方法回收资源; onDraw和onTouchEvent方法中都应尽量避免创建对象,过多操作可能会造成卡顿
考虑机型适配:合理使用warp_content,match_parent。 尽可能地使用RelativeLayout。 针对不同的机型,使用不同的布局文件放在对应的目录下,android会自动匹配。 尽量使用点9图片。 使用与密度无关的像素单位dp,sp。 引入 android的百分比布局。 切图的时候切大分辨率的图,应用到布局当中,在小分辨率的手机上也会有很好的显示效果
Android如何实现阴影_Swuagg的博客-CSDN博客_android ui阴影我们知道,Google 在 2014 年 I/O大会上发布的一种新的设计规范——Material Design,这种设计规范给 Android UI 设计带来了很多的变化。比如,更加强调真实性、有立体感,由此引发的一系列针对阴影的UI设计。我相信,很多专注业务逻辑的Android程序员,拿着这样的一个UI效果,往往一头雾水。所以,我仅在此抛砖引玉,希望打开他们的思路,更好的满足UI的要求。好的...https://blog.csdn.net/Agg_bin/article/details/104855255?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078222316781435413737%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078222316781435413737&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-3-104855255.nonecase&utm_term=%E8%87%AA%E5%AE%9A%E4%B9%89View&spm=1018.2226.3001.4450Android实现文本过长时右边渐隐,聚焦时跑马灯效果_Swuagg的博客-CSDN博客写在前面:原创不易,请不要吝啬你的大拇指,点个赞再走呗。然而贴代码很容易,但那不一定有帮助。本文试图从问题点出发,逐步分解,直到实现最终效果。在Android中,我们知道对于控件TextView,在布局时有时候需要单行文本,但可能会存在文本内容的宽度超出了布局宽度,这个时候就需要我们做一定的兼容,不然可能会显示出不太优雅的UI效果。针对于此情况——文本内容的宽度超出了布局宽度,你应该...https://blog.csdn.net/Agg_bin/article/details/104967214?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078222316781435413737%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078222316781435413737&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-4-104967214.nonecase&utm_term=%E8%87%AA%E5%AE%9A%E4%B9%89View&spm=1018.2226.3001.4450Kotlin 实现 Android 系统悬浮窗_Swuagg的博客-CSDN博客_kotlin 悬浮窗Android 弹窗浅谈我们知道 Android 弹窗中,有一类弹窗会在应用之外也显示,这是因为他被申明成了系统弹窗,除此之外还有2类弹窗分别是:子弹窗与应用弹窗。应用弹窗:就是我们常规使用的 Dialog 之类弹窗,依赖于应用的 Activity;子弹窗:依赖于父窗口,比如 PopupWindow;系统弹窗:比如状态栏、Toast等,本文所讲的系统悬浮窗就是系统弹窗。系统悬浮窗具体实现权限申请
关于Json动画与帧动画的对比_Swuagg的博客-CSDN博客关于Json动画与帧动画的异同点,本文主要从流畅度、CPU、内存和文件大小,这4个方面进行的比较。1、运行时的状态图:Json动画运行时,CPU和内存动态图如下:帧动画运行时,CPU和内存动态图如下:2、对比分析(1)从动态图可以分析出如下信息:Json动画更流畅;但是一直占用CPU资源——12%左右;内存一直上升,但差不多上升2M左右会被释放掉;帧动画不太流畅;基本不占用CPU资源——1%左右;内存稳定不变2M左右;(2)文件大小对比:Json动画包括:Json资源文件大小6.96Khttps://blog.csdn.net/Agg_bin/article/details/107976298?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078232316782246464066%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078232316782246464066&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-107976298.nonecase&utm_term=%E5%8A%A8%E7%94%BB&spm=1018.2226.3001.4450
Android源码之App启动_Swuagg的博客-CSDN博客下面以应用桌面Launcher启动App的MainActivity来举例:App启动概述首先,MainActivity是由Launcher组件来启动的,而Launcher又是通过Activity管理服务ActivityManagerService(AMS)来启动MainActivity组件的。由于MainActivity组件和Launcher组件,以及AMS是三个不同的进程, 所以这三个不...https://blog.csdn.net/Agg_bin/article/details/94456778?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078201416782350932823%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078201416782350932823&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-24-94456778.nonecase&utm_term=Activity&spm=1018.2226.3001.4450
Android源码之系统启动_Swuagg的博客-CSDN博客Android系统启动概述上电开机,CPU获取第一条指令,执行BootLoader引导装载程序;BootLoader加载Linux内核并启动内核,加载各种驱动和数据结构;内核启动第一个用户进程,也就是内核空间到用户空间启动的第一个进程——init进程(c代码);init进程读取配置文件init.rc,配置文件中会启动一个Zygote孵化器进程App_main.cpp(由c进入c++...https://blog.csdn.net/Agg_bin/article/details/90314007?spm=1001.2014.3001.5501
Android进程间通信方式与线程间通信方式的列举_Swuagg的博客-CSDN博客_android 线程间通信本文只是列举了Android进程间通信和Android线程间通信的常见方式,还请见谅,具体实现或原理可参见其他博客。Android IPCIntent方式Bundle通信Broadcast方式文件共享的方式AIDL方式(基于Binder)Messenger方式(AIDL+Handler Message的方式)ContentProvider的方式Socket(网络)...https://blog.csdn.net/Agg_bin/article/details/103212525?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078238116782184657996%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078238116782184657996&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-103212525.nonecase&utm_term=%E8%BF%9B%E7%A8%8B%E9%80%9A%E4%BF%A1&spm=1018.2226.3001.4450
Binder驱动、mmap、一次拷贝(come_from_user)+物理地址映射
发送进程——come_from_user到内核缓存区----接收缓存区----接收进程用户空间
AIDL会生成一个服务端对象的代理类,客户端可以通过它实现间接调用服务端对象的方法,AIDL简化Binder的使用,轻松地实现IPC进程间通信机制。
Android性能优化之Activity启动优化_Swuagg的博客-CSDN博客_activity启动优化打开一个app的时候速度比较慢,等一会才能看到UI,有很多种原因,下面是我根据这些个情况做出的多种优化,记录一下。1、采用动态布局: 先是优化了布局,减少层级嵌套,使用merge优化等等。但发现加载xml布局还是慢了点,于是改为动态布局,布局的时间减少了好几倍。2、利用MessageQueue.IdleHandler()回调 按照activity的生命周...https://blog.csdn.net/Agg_bin/article/details/88396449?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078201416782350932823%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078201416782350932823&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-88396449.nonecase&utm_term=Activity&spm=1018.2226.3001.4450
内存泄漏
Android 内存泄漏_Swuagg的博客-CSDN博客我想大家在平时的工作中,或多或少都遇到过或听到过内存泄漏,那今天我希望和大家一起讨论一下关于内存泄漏, 什么是内存泄漏?造成内存泄漏的原因?如何解决内存泄漏?以及如何避免内存泄漏等等。。。主要从三个方面进行讨论:Java类执行的过程;Java中的内存泄漏;Android内存泄露及其解决。一、Java类执行的过程https://blog.csdn.net/Agg_bin/article/details/85303598?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078175816782388062032%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078175816782388062032&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-3-85303598.nonecase&utm_term=%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6&spm=1018.2226.3001.4450
图片优化
内存抖动
布局分析工具:a、adb shell dumpsys activity top,查看最上层activity信息,找到layout信息;b、使用Layout Inspector
从布局绘制流程出发进行优化:
PIA(Privacy Impact Assessment)隐私影响评估
SIA —— Fireline火线扫描、娜迦扫描、Converity
线性表(数组、链表、队列和栈)
二叉树、红黑树
排序算法
排序算法Java实现_Swuagg的博客-CSDN博客冒泡排序特点:运行非常慢,但它的概念是最简单的。基本流程:每一轮从头开始两两比较,将较大的项放在较小项的右边,这样每轮下来保证该轮最大的数在最右边。算法实现:(交换出最大,放在后面)private static void bubbleSort(int[] data) { System.out.println(Arrays.toString(data)); boole...https://blog.csdn.net/Agg_bin/article/details/96307251?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078243816780357247736%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078243816780357247736&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-96307251.nonecase&utm_term=%E7%AE%97%E6%B3%95&spm=1018.2226.3001.4450
查找算法
动态规划算法
贪心算法
LeetCode算法题
创建型5个
行为型11个
结构型7个
简单理解-Head First 设计模式_Swuagg的博客-CSDN博客我们知道四人组的《设计模式》共介绍了23种,并且将其分成3类,分别是:创建型、结构型、行为型,如下所示: - **创建型**:**5个**。工厂方法模式、抽象工厂模式、Builder模式(Retrofit)、单例模式(类初始化)、原型模式 - **结构型**:**7个**。适配器模式、装饰模式(File操作)、代理模式(静态代理——代理对象内部操作委托对象、动态代理——代理对象里面不指定特定的委托对象,更加灵活)、组合模式、桥接模式、外观模式、享元模式 - **行为型**:**11个**。观察者模式https://blog.csdn.net/Agg_bin/article/details/110940981?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078248516782350919040%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078248516782350919040&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-3-110940981.nonecase&utm_term=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450 Code Smell_Swuagg的博客-CSDN博客——如果尿布臭了,就换掉它。《重构:改善既有代码的设计》,在该书的第3章“代码的坏味道”中,收录了Kent Beck关于重构时机的理解——Code Smell。Code Smell的22种代码坏味道如下:Duplicated Code。a、同一个class内的两个函数含有相同的表达式。——需要Extract Method,提炼出重复代码,然后让两个地点都调用被提炼出来的那一段代码...https://blog.csdn.net/Agg_bin/article/details/92840307?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078248516782350919040%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078248516782350919040&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-16-92840307.nonecase&utm_term=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450六大设计原则SOLID_Swuagg的博客-CSDN博客在软件开发中,前人总结了六大设计原则如下:Single Responsibility Principle:不能有多个导致类变更的原因。一个类只负责一个职责。这个原则不仅仅适用于类,对于接口和方法也适用,而且接口和方法的单一职责更容易实现。——单一职责原则Liskov Substitution Principle:就是只要父类出现的地方子类就可以出现,且替换成子类也不会出现任何错误或者异...https://blog.csdn.net/Agg_bin/article/details/92981605?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078248516782350919040%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078248516782350919040&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-13-92981605.nonecase&utm_term=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450单例模式之Java版本以及5种写法_Swuagg的博客-CSDN博客/** * 为什么使用单例? * 一个类专门提供一些公共功能供别人调用,而本身并不会处理业务逻辑。那么创建多个实例,会消耗内存,造成不必要的开销。此时需要单例。 * 单例是什么? * 让整个生命周期内只有一个实例。 *
* 一般单例模式有如下五种写法:懒汉式,双重校验锁,静态内部类,饿汉式和枚举。 * 懒汉式:非线程安全 * 双重校验锁:线程安全 * 静态内...https://blog.csdn.net/Agg_bin/article/details/93201546?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078248516782350919040%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078248516782350919040&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-9-93201546.nonecase&utm_term=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450
创建型设计模式分享_Swuagg的博客-CSDN博客闲说设计模式信耶稣的人都要读圣经,而信OO的人都要读四人组的《设计模式》,这就是OO的圣经。OO概念是我们的基础,OO原则 是我们的目标,而设计模式是我们的做法。把模式装进脑子里,然后在你的设计和已有的应用中,寻找何处可以使用它们。设计模式定义1、模式:在某情境下,针对某问题的某种解决方案。情境:就是应用某个模式的情况。这应该是会不断出现的情况。问题:就是你想在某情境下达成的目标,但也可以是某情境下的约束。解决方案:就是你所追求的,一个通用的设计,用来解决约束、达到目标。2、STAhttps://blog.csdn.net/Agg_bin/article/details/111320086?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078248516782350919040%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078248516782350919040&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-111320086.nonecase&utm_term=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450原型设计模式之Java版本_Swuagg的博客-CSDN博客定义用原型模式指定创建对象的种类,并通过复制这些原型创建新的对象。原型设计模式,是23种设计模式的创建型模式,简单来说,就是对象的克隆。将要被克隆的对象,我们称之为原型。使用场景类初始化或new一个新对象时,需要消耗非常多的资源,因为通过原型复制的方式不会执行构造方法,避免了初始化占有的时间和空间。一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式复制多个对象供调用者使用,即保护性拷贝。UML类图https://blog.csdn.net/Agg_bin/article/details/107027114?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078248516782350919040%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078248516782350919040&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-107027114.nonecase&utm_term=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450Kotlin实现访问者设计模式_Swuagg的博客-CSDN博客访问者设计模式,是GoF阐述的23中常见设计模式中,行为型设计模式的一种。访问者设计模式,表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变个元素类的前提下定义作用于这些元素的新操作。使用该设计模式可以让我们能够访问到各个元素,于是我们可以将相关方法的实现放在类的外部,这样就可以使得类不再臃肿。下面是具体的代码实现:sealed class Target { abstr...https://blog.csdn.net/Agg_bin/article/details/104330847?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078248516782350919040%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078248516782350919040&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-4-104330847.nonecase&utm_term=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450Kotlin实现策略和模版方法设计模式_Swuagg的博客-CSDN博客策略设计模式做的事情就是,将不同的行为策略进行独立封装,与类在逻辑上解耦。根据不同的上下文,切换选择不同的策略,然后用类对象进行调用。有如下例子,一个游泳运动员会蛙泳、仰泳、自由泳多种游泳姿势,我们可以将游泳这个行为封装成接口,根据不同的场景我们可以调用不同的游泳姿势,如下代码所示:package com.agg.kotlinapplicationinterface SwimStra...https://blog.csdn.net/Agg_bin/article/details/104343819?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078248516782350919040%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078248516782350919040&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-5-104343819.nonecase&utm_term=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450Kotlin实现工厂方法和抽象工厂设计模式_Swuagg的博客-CSDN博客_kotlin 工厂方法工厂方法设计模式,它的核心作用就是通过一个工厂隐藏对象实例的创建逻辑,而不需要暴露给客户端,实现解耦。典型的使用场景就是当拥有一个父类与多个子类的时候,我们可以通过这种模式来创建子类对象。比如下面的业务场景:一个电脑加工厂,同时生产个人电脑和服务器主机。interface Computer { val cpu: String companion object Facto...https://blog.csdn.net/Agg_bin/article/details/104331797?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078248516782350919040%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078248516782350919040&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-6-104331797.nonecase&utm_term=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450状态模式之Java版本_Swuagg的博客-CSDN博客定义当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。使用场景代码中包含大量与对象状态有关的条件语句,比如,一个操作中含有庞大的多分支语句(ifelse或switchcase),且这些分支依赖于该对象的状态;设计原则UML类图代码实现日志打印总结状态模式和策略模式的结构几乎完全一样,但它们的目的和本质却完全不一样。优点:将繁琐的状态判断转换成结构清晰的状态族,在避免代码膨胀的同时也保证了可扩展性与可维护性缺点:增加系统类和对象的个数...https://blog.csdn.net/Agg_bin/article/details/110384915?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078248516782350919040%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078248516782350919040&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-7-110384915.nonecase&utm_term=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450策略模式之Java版本_Swuagg的博客-CSDN博客定义策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以互相替换。策略模式让算法独立于使用它的客户而独立变化。使用场景针对同一类型问题的多种处理方式,仅仅是具体行为有差别时;需要安全地封装多种同一类型的操作时;出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时;···总的来说,可以这么理解,使用继承违背常理(狗继承动物,让它飞就太天真了)时,使用实现繁琐(猴鸡狗猪都会叫,他们都各自实现叫的方法太累了)时,此时可以考虑组合(也就是策略https://blog.csdn.net/Agg_bin/article/details/109178910?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078248516782350919040%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078248516782350919040&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-8-109178910.nonecase&utm_term=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450工厂方法模式之Java版本_Swuagg的博客-CSDN博客定义定义一个用于创建对象的接口,让子类决定实例化哪个类。使用场景复杂对象的创建可以使用工厂模式,用new就可以完成的对象的创建就无需使用工厂模式。UML类图一共四个角色,即四大模块:一是抽象工厂Factory,工厂方法模式的核心;二是具体工厂ConcreteFactory,实现了具体的业务逻辑;三是抽象产品Product,是工厂方法模式所创建的产品父类;四是具体产品ConcreteProduct,是抽象产品的某个具体产品对象。代码实现package com.tcl.tvweishhttps://blog.csdn.net/Agg_bin/article/details/107179193?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078248516782350919040%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078248516782350919040&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-10-107179193.nonecase&utm_term=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450抽象工厂模式之Java版本_Swuagg的博客-CSDN博客定义为创建一组相关或是相互依赖的对象提供一个接口,而不需要指定它们的具体类。抽象工厂模式是围绕一个超级工厂创建其他工厂。使用场景一个对象族有相同的约束时可以使用抽象工厂模式,能解决接口选择的问题(比如Android和IOS是不同系统但有相同的电话、短信等软件)。UML类图...https://blog.csdn.net/Agg_bin/article/details/108880991?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078248516782350919040%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078248516782350919040&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-11-108880991.nonecase&utm_term=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450建造者模式之Java版本_Swuagg的博客-CSDN博客定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。使用场景初始化一个对象特别复杂时(如:参数较多,且很多参数都具有默认值);相同的方法,不同的执行顺序,产生不同的事件结果时;产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常合适。UML类图Product产品类——产品的抽象类;Builder——抽象Builder类,规范产品的组建,一般是由子类实现具体的组建过程;ConcreteBuilder——具体的Builder类https://blog.csdn.net/Agg_bin/article/details/111313558?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078248516782350919040%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078248516782350919040&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-12-111313558.nonecase&utm_term=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450使用策略模式和多态去掉switch_Swuagg的博客-CSDN博客_去掉switch为了更好的扩展性,可以“使用策略模式和多态去掉switch”(业务逻辑层适用,界面表现层除外,会增加代码的复杂度)。“使用策略模式和多态去掉switch”的思想如下:多处使用相同switch时(我觉得这个是前提,如果只有一处使用switch,而且后面基本上不会再扩展,那简单封装一下就可以了,毕竟时间那么宝贵,为啥还多去折腾一下呢?),1、先将switch代码块封装到一个新clas...https://blog.csdn.net/Agg_bin/article/details/92839080?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078248516782350919040%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078248516782350919040&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-14-92839080.nonecase&utm_term=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450
View产生事件,使用ViewModel进行逻辑处理后,通知Model更新数据,Model把更新的数据给ViewModel, ViewModel自动通知View更新界面,而不是主动调用View的方法
海外应用插件化(动态模块)之路_Swuagg的博客-CSDN博客1 引言1.1 背景与需求背景:应用是具有多个模块的模块化应用,其中一个模块的功能,是能进行端到端的视频通话(视频通话模块)。需求:视频通话模块接入多个具有相同功能的 SDK,支持动态切换不同 SDK;需求细化:在视频通话模块已接入一个 SDK 的情况下,需要支持动态切换不同 SDK,且不增加应用安装包的大小。1.2 术语和缩略语术语/缩略语全称说明应用Application文章中的应用,都是指海外https://blog.csdn.net/Agg_bin/article/details/117198244?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078279316781818783208%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078279316781818783208&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-117198244.nonecase&utm_term=%E6%A8%A1%E5%9D%97%E5%8C%96&spm=1018.2226.3001.4450插件化框架之VirtualAPK_Swuagg的博客-CSDN博客本文为降低阅读难度,并未采用“插件”这一词,而是采用通俗易懂的“模块”来进行阐述。本文从以下6个方面进行阐述,如有理解不对的地方,希望各位大牛不吝赐教。VirtualAPK是什么VirtualAPK使用场景VirtualAPK如何使用VirtualAPK原理简析VirtualAPK下载与识别VirtualAPK加载与应用VirtualAPK是什么VirtualA...https://blog.csdn.net/Agg_bin/article/details/103210946?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078279316781818783208%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078279316781818783208&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-103210946.nonecase&utm_term=%E6%A8%A1%E5%9D%97%E5%8C%96&spm=1018.2226.3001.4450
Glide
OkHttp3
Retrofit
EventBus
Arouter
Android Debug Database原理简析_Swuagg的博客-CSDN博客写在前面:本文大约有2.5k字,可能需要一刻钟阅读时间。1、Android Debug Database方式与其他方式查看/修改数据库?Android在开发调试过程中,查看/修改app的数据库是比较麻烦的,一般有以下几种方式:将手机app中的SQLite数据库pull到电脑,通过电脑端的软件(如SQLite Expert Professional)打开这个数据库,可以执行相关的CR...https://blog.csdn.net/Agg_bin/article/details/86495897?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078286516781667879158%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078286516781667879158&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-5-86495897.nonecase&utm_term=%E6%BA%90%E7%A0%81&spm=1018.2226.3001.4450
请求头、响应头
参考:全面&详细的面试指南:计算机网络篇 (附答案)_Carson带你学Android的博客-CSDN博客
设计一个日志系统
SP、DataStore、MMKV
File
Sqlite、ContentProvider、GreenDao
我又拿起了《Kotlin核心编程》_Swuagg的博客-CSDN博客_kotlin核心编程《Kotlin核心编程》是水滴技术团队2019-4-15出版的,也不知道为啥这么火,网上搜Kotlin学习文档、书籍,除了Kotlin官方文档,其他大家极力推荐的就是此书了,读完以后才知道为什么。首先,我是19年8月份入手的Kotlin核心编程,先是读了前面3章,但由于工作原因就先放下来了。不幸的是,今年新型冠状病毒导致的疫情异常严重,从刚开始的武汉封城,到城市小区、乡下农村,封区的封区,...https://blog.csdn.net/Agg_bin/article/details/104375560?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078292016782395325614%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078292016782395325614&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-7-104375560.nonecase&utm_term=Kotlin&spm=1018.2226.3001.4450
蓝牙BLE通信
Android BLE4.0 从小白到理解的过程_Swuagg的博客-CSDN博客学习蓝牙低功耗的开发过程,要达到的效果是——利用两台Android手机,通过BLE4.0进行通信,可以发送和接收数据。其中一台Android手机T模拟发出广播,作为BLE设备(周边设备),这个BLE设备在生产环境中就是我们用到的气体检测传感器、智能手环、体重秤、血压计等等;另一台Android手机B,作为中央设备,搜索手机T发出的广播并连接;手机B可以接收手机T的数据,也可以发送数据给...https://blog.csdn.net/Agg_bin/article/details/88713612?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165078295216780357267982%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165078295216780357267982&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-88713612.nonecase&utm_term=BLE&spm=1018.2226.3001.4450Android回声消除调研 20220321_Swuagg的博客-CSDN博客回声产生回声就是声音信号经过一系列反射之后,又听到了自己讲话的声音,这就是回声。在VoIP(Voice over Internet Protocol,基于IP的语音传输 )实时语音通话中,是近端通话者的声音被自己的麦克风拾取后通过网络传到远端,远端扬声器播放出来的声音被麦克风拾取后通过网络又重新发回近端,再加上网络和数据处理等各种延迟的影响,使得近端通话者能够从扬声器中听到自己的刚才所说的话,就产生了回声。回声分类在通信系统中,回声主要分为两类:电路回声和声学回声(线性回声和非线性回声)。https://blog.csdn.net/Agg_bin/article/details/123638819?spm=1001.2014.3001.5501Android 单元测试,从小白到入门开始_Swuagg的博客-CSDN博客_android 单元测试 教程1 引言1.1 背景随着 Android 应用越来越壮大,对应代码量显著增加,代码逻辑也日趋复杂,此时需要采取一定的行动去保证代码质量,减少逻辑漏洞等,于是严格地执行单元测试编写任务,将单元测试落实到平常开发和维护任务当中去,就是很重要的一环,不可忽视。然而,很多应用开发者之前并未编写过单元测试代码,那么如果有一篇通俗易懂并带有操作步骤的文章,能帮助应用开发者完成从单元测试小白到入门的过渡,就再好不过了,于是本文就是在此情况写就的,如有不好之处,请多多包涵,谢谢...https://blog.csdn.net/Agg_bin/article/details/120768579?spm=1001.2014.3001.5501需求评审流程_Swuagg的博客-CSDN博客_需求评审一、目的为了更好的为业务、产品、开发及测试建立统一的需求管理机制和跟踪机制,保证产品开发成果与需求的一致性,提升需求管理全链路运作效率,特制定本流程。此文档主要描述需求和评审等相关的流程,开发、自测、提测、测试、发布和线上监控等流程请参考相应文档。二、适用范围本流程适用于软件研发人员熟悉业务需求。三、参与人员需求方:产品经理必要参与人员:产品经理、开发Owner、设计Owner、测试Owner可能参与人员:项目经理(该需求有项目经理)、安全合规同事(该需求涉及到安全合规有关事项)、云端同事https://blog.csdn.net/Agg_bin/article/details/116533231?spm=1001.2014.3001.5501技术简历的书写建议_Swuagg的博客-CSDN博客感谢:这份简历是在华为部门老大、前腾讯大佬、同行Android高级工程师、测试工程师和HR的建议和意见下,以及自己一周的反复斟酌后,新鲜出炉的。简历共分为六大部分部分一:个人基本信息头像:还看得过去,就贴上。自我描述:20-30个字。比如:“2.5年Android开发经验,喜欢专研不服输,责任心强”。基本信息:有党员身份,写上的话大公司一般会喜欢,如果工作五年以上,...https://blog.csdn.net/Agg_bin/article/details/95358030?spm=1001.2014.3001.5501我用了两年时间去读《Thinking in Java》_Swuagg的博客-CSDN博客路漫漫其修远兮,吾将上下而求索。 ——题记我用了两年时间去读《Think...https://blog.csdn.net/Agg_bin/article/details/89703012?spm=1001.2014.3001.55012022年Android中高级面试框架_Swuagg的博客-CSDN博客Java泛型集合ArrayListLinkedListHashMapLinkedHashMapConcurrentHashMap多线程并发volatile线程反射JVM类加载怎么判断对象是否已死?垃圾回收机制四大引用泛型集合 ——HashMap、ConcurrentHashMap源码和数据结构多线程反射JVM ——类加载、内存模型、内存管理机制、垃圾回收机制Android四大组件和FragmentactivityServiceBroadcastReceiverContentProviderFragmentHhttps://blog.csdn.net/Agg_bin/article/details/123955215?spm=1001.2014.3001.5501
以上内容是Android中高级面试的框架内容,也包括笔者理解的一些答案(仅供参考),谢谢。
2023年Android开发面试系列拆解:
Android开发面试:Android知识答案精解
Android开发面试:Java知识答案精解
Android开发面试:架构设计和网络知识答案精解
Android开发面试:数据结构与算法知识答案精解
Android开发面试:Kotlin面试知识答案精解