![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
简书转载
文章平均质量分 90
简书转载的优秀文章
augfun
旧博客遗失,新博客凑活着用吧
展开
-
Android的KeyStore保护数据
让我们先清除一些有关Android Keystore系统的知识。密钥库不一定只用于密码,它可以用于任何敏感数据,这样做的方式使攻击者或恶意/未经授权的软件很难从我们这里获取此信息。简单来说:应用程序只能编辑,保存和检索密钥。这个概念很简单,但功能强大。该应用将生成或接收私钥-公钥对,然后将其存储在Android Keystore系统中。然后,在将公用密钥存储在特定于应用程序的文件夹中之前,可以使用公用密钥对应用程序秘密进行加密,并在需要时使用专用密钥对相同信息进行解密。转载 2023-06-17 01:43:05 · 3961 阅读 · 0 评论 -
Android KeyStore的使用
先来看看官方对他的定义:AndroidKeystore系统可让您将加密密钥存储在容器中,以使其更难从设备中提取。一旦密钥进入密钥库,就可以将其用于加密操作,而密钥材料仍不可导出。而且,它提供了限制何时和如何使用密钥的功能,例如要求用户进行身份验证才能使用密钥,或者限制仅在某些加密模式下使用密钥。定义其实很简单,他就是用来保存加解密的Key和证书的。转载 2023-06-17 01:38:14 · 9421 阅读 · 0 评论 -
IdleHandler 的原理分析和妙用
我们都知道 Android 是基于消息处理机制的,比如应用启动过程,Activity 启动以及用户点击行为都与 Handler 息息相关,Handler 负责 Android 中的消息处理,对于 Android 中的消息处理机制来说,MessageQueue 和 Looper,Message 也是非常重要的对象,而 IdleHandler 是 MessageQueue 的静态内部接口。IdleHandler,这是一种在只有当消息队列没有消息时或者是队列中的消息还没有到执行时间时才会执行的 IdleHan转载 2022-05-01 22:33:14 · 635 阅读 · 0 评论 -
Retrofit 原理篇
1、Retrofit 实现原理Retrofit 通过 java 接口以及注解来描述网络请求,并用动态代理的方式生成网络请求的 request,然后通过 client 调用相应的网络框架(默认 okhttp)去发起网络请求,并将返回的 response 通过 converterFactorty 转换成相应的数据 model,最后通过 calladapter 转换成其他数据方式(如 rxjava Observable)通过 Retrofit. create( ciass)方法创建出 Service in转载 2022-04-01 01:40:22 · 4294 阅读 · 0 评论 -
ReentrantLock实现原理及源码分析
ReentrantLock是Java并发包中提供的一个可重入的互斥锁。ReentrantLock和synchronized在基本用法,行为语义上都是类似的,同样都具有可重入性。只不过相比原生的Synchronized,ReentrantLock增加了一些高级的扩展功能,比如它可以实现公平锁,同时也可以绑定多个Conditon。可重入性/公平锁/非公平锁 可重入性 所谓的可重入性,就是可以支持一个线程对锁的重复获取,原生的synchronized就具有可重入性,一个用synchroniz转载 2022-03-28 13:48:45 · 245 阅读 · 0 评论 -
深入分析Android ANR
ANR概述首先,ANR(Application Not responding)是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。ANR由消息处理机制保证,Android在系统层实现了一套精密的机制来发现ANR,核心原理是消息调度和超时处理。其次,ANR机制主体实现在系统层。所有与ANR相关的消息,都会经过系统进程(system_server)调度,然后派发到应用进程完成对消息的实际处理,同时,系统进程设计转载 2022-03-21 21:27:17 · 884 阅读 · 0 评论 -
Android性能优化之内存优化
前言成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。内存优化可以说是性能优化中最重要的优化点之一,可以说,如果你没有掌握系统的内存优化方案,就不能说你对Android的性能优化有过多的研究与探索。本篇,笔者将带领大家一起来系统地学习Android中的内存优化。可能有不少读者都知道,在内存管理上,JVM拥有垃圾内存回收的机制,自身会在虚拟机层面自动分配和释放内存,因此不需要像使用C/C++一样在代码中分配和释放某一块内存。Android系统的内存转载 2022-03-20 18:30:48 · 895 阅读 · 0 评论 -
Android性能优化之网络优化DNS和HttpDNS知识详解
本文转载自微信公众号「Android开发编程」,作者Android开发编程 。转载本文请联系Android开发编程公众号。前言小计在 App 访问网络的时候,DNS 解析是网络请求的第一步,默认我们使用运营商的 LocalDNS 服务。有数据统计,在这一块 3G 网络下,耗时在 200~300ms,4G 网络下也需要 100ms。解析慢,并不是 LocalDNS 最大的问题,它还存在一些更为严重的问题,例如:DNS 劫持、DNS 调度不准确(缓存、转发、NAT)导致性能退化等等,这些才是网络优.转载 2022-03-20 13:44:43 · 887 阅读 · 0 评论 -
临时抱佛脚:IdleHandler 的原理分析和妙用
我们都知道 Android 是基于消息处理机制的,比如应用启动过程,Activity 启动以及用户点击行为都与 Handler 息息相关,Handler 负责 Android 中的消息处理,对于 Android 中的消息处理机制来说,MessageQueue 和 Looper,Message 也是非常重要的对象,而 IdleHandler 是 MessageQueue 的静态内部接口。IdleHandler,这是一种在只有当消息队列没有消息时或者是队列中的消息还没有到执行时间时才会执行的 IdleHan转载 2022-03-20 13:39:14 · 718 阅读 · 0 评论 -
Android异常处理之卡顿
参考自动化卡顿检测方案及优化深入探索Android卡顿优化(上)深入探索Android卡顿优化(下)卡顿关于什么是卡顿?可以参考什么是卡顿原理一个线程不管有多少Handler,它只会有一个Looper存在,主线程执行的任何代码都会通过Looper.loop()方法执行。而在Looper函数中,它有一个mLogging对象,这个对象在每个message处理前后都会被调用。主线程发生了卡顿,那一定是在dispatchMessage()方法中执行了耗时操作。那么,我们就可以通过这个mLogg转载 2022-03-20 13:33:22 · 1339 阅读 · 0 评论 -
你真的懂 Fragment 吗?Fragment 的过去、现在和未来~
Fragment 是一个历史悠久的组件,从 API 11 引入至今,已经成为 Android 开发中最常用的组件之一。在这个专题里,我们将从「使用 & 核心原理 & 面试」三个层面来讨论 Fragment。如果能帮上忙,请务必点赞加关注,这真的对我非常重要。Fragment 的过去、现在和未来1.1 Fragment 解决了什么问题?(过去)Fragment 可以将 Activity 视图拆分为多个区块进行模块化地管理 ,避免了 Activity 视图代码过度臃肿混乱。转载 2022-03-04 22:45:39 · 440 阅读 · 0 评论 -
线程池ThreadPoolExecutor实现原理
引言线程池:可以理解为缓冲区,由于频繁的创建销毁线程会带来一定的成本,可以预先创建但不立即销毁,以共享方式为别人提供服务,一来可以提供效率,再者可以控制线程无线扩张。合理利用线程池能够带来三个好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利..转载 2021-06-14 01:52:59 · 3435 阅读 · 0 评论 -
SurfaceView及TextureView对比
SurfaceView是什么 ?SurfaceView优点及缺点?SurfaceView中双缓冲?TextureView是什么?TextureView优点及缺点?两者的性能相比如何?播放器应该选择谁?SurfaceView是什么?它继承自类View,因此它本质上是一个View。但与普通View不同的是,它有自己的Surface。有自己的Surface,在WMS中有对应的WindowState,在SurfaceFlinger中有Layer。我们知道,一般的Activity包含的转载 2021-05-23 23:47:58 · 6743 阅读 · 0 评论 -
认识ClassLoader
写在前面今天继续《热修复与插件化》专题的分享,专栏的上一篇是说到了JVM的一些基础知识点,本篇接着来说一下ClassLoader的相关内容,当然这里说的是Android中的ClassLoader哈,上一篇《带你认识JVM》中我们已经介绍过了Java中的类加载器、它们各自的作用以及加载流程,这里就不再说了,有需要的自行查看,接下来就直奔主题了,去看Android的类加载机制!一、androidClassLoader基本介绍1.1、种类详解BootClassLoader:它的作用和Java中的B转载 2021-04-26 01:04:38 · 3487 阅读 · 1 评论 -
Android热修复实战之AndFix
目录写在前面目录一、AndFix基本介绍1.1、AndFix简介1.2、AndFix方法体替换规则1.3、AndFix BUG修复过程二、AndFix代码实战2.1、AndFix集成2.2、AndFix初始化2.3、构建APK三、AndFix源码解析写在前面上一篇《Android热修复技术简介》中对Android的热修复技术的概念和常用的技术方案做了一个简单的介绍,那么今天就来实战一下热修复技术,我们使用的是AndFix,为什么是它?因为无论是从使用上转载 2021-04-26 00:38:11 · 255 阅读 · 0 评论 -
Listview与RecyclerView对比浅析【重点对比缓存】
RecyclerView和ListView都是用于加载大量数据的控件,RecyclerView作为listview的改进加强型,相对于ListView,RecyclerView做出了以下优化:1.布局效果ListView 的布局比较单一,只有一个纵向效果;RecyclerView 的布局效果丰富, 可以在 LayoutMananger 中设置:线性布局(纵向,横向),表格布局,瀑布流布局在RecyclerView 中,如果存在的 LayoutManager 不能满足需求,可以自定义 Layout转载 2021-03-06 21:12:52 · 2203 阅读 · 0 评论 -
Java进阶--编译时注解处理器(APT)详解
本文同步发布在掘金,未经本人允许不得转载上篇文章《Java进阶–Java注解及其实例应用》我们使用注解+反射实现了一个仿ButterKnife功能的示例。考虑到反射是在运行时完成的,多少会影响程序性能。因此,ButterKnife本身并非基于注解+反射来实现的,而是用APT技术在编译时处理的。APT什么呢?接下来一起来看。一、APT简介1.什么是APT?APT即为Annotation Processing Tool,它是javac的一个工具,中文意思为编译时注解处理器。APT可以用来在编译时扫描转载 2021-03-01 01:01:17 · 589 阅读 · 0 评论 -
ReentrantLock实现原理及源码分析
ReentrantLock是Java并发包中提供的一个可重入的互斥锁。ReentrantLock和synchronized在基本用法,行为语义上都是类似的,同样都具有可重入性。只不过相比原生的Synchronized,ReentrantLock增加了一些高级的扩展功能,比如它可以实现公平锁,同时也可以绑定多个Conditon。可重入性/公平锁/非公平锁 可重入性 所谓的可重入性,就是可以支持一个线程对锁的重复获取,原生的synchronized就具有可重入性,一个用synchronize转载 2021-02-24 01:24:25 · 1395 阅读 · 0 评论 -
Android UI性能优化 检测应用中的UI卡顿
一、概述在做app性能优化的时候,大家都希望能够写出丝滑的UI界面,以前写过一篇博客,主要是基于Google当时发布的性能优化典范,主要提供一些UI优化性能示例:Android UI性能优化实战 识别绘制中的性能问题实际上,由于各种机型的配置不同、代码迭代历史悠久,代码中可能会存在很多在UI线程耗时的操作,所以我们希望有一套简单检测机制,帮助我们定位耗时发生的位置。本篇博客主要描述如何检测应用在UI线程的卡顿,目前已经有两种比较典型方式来检测了:利用UI线程Looper打印的日志 利用C转载 2021-02-20 00:10:33 · 218 阅读 · 0 评论 -
Android性能优化-检测App卡顿
在移动APP性能评测-流畅度评测中,我们介绍了如何准确客观评价APP的流畅度,最终采用SM指标来评价应用的流畅度,在知道如何评价流畅度之后,我们应该如何来检测出APP中的UI卡顿就是我们面临的一个新的问题;在Android性能优化-App卡顿中介绍了Google官方提供的检测卡顿的方法,除此之外还有那边比较好的方法来检测应用卡顿?目前主流的方法主要有:1.利用UI线程Looper打印的日志,典型代表就是BlockCanary;2.采用Choreographer;BlockCanary:blockcana转载 2021-02-20 00:06:30 · 553 阅读 · 0 评论 -
Choreographer全解析
前言今天继续屏幕刷新机制的知识讲解,上文说到vsync的处理,每一帧UI的绘制前期处理都在Choreographer中实现,那么今天就来看看这个神奇的舞蹈编舞师是怎么将UI变化反应到屏幕上的。代码未动,图先行UI变化上期说到app并不是每一个vsync信号都能接收到的,只有当应用有绘制需求的时候,才会通过scheduledVsync方法申请VSYNC信号。那我们就从有绘制需求开始看,当我们修改了UI后,都会执行invalidate方法进行绘制,这里我们举例setText方法,再回顾.转载 2021-02-20 00:04:03 · 5601 阅读 · 0 评论 -
Choreographer机制和卡顿优化
Choreographer 是 Android 4.1 google的黄油计划新增的机制,用于配合系统的 VSYNC 中断信号。其主要用途是接收系统的 VSYNC 信号,统一管理应用的输入、动画和绘制等任务的执行时机。也就是(CALLBACK_INPUT,CALLBACK_ANIMATION,CALLBACK_TRAVERSAL,CALLBACK_COMMIT),而我们主要的用途就是来查看app的帧率情况,下面来具体分析下这个神秘的类当我们进行invalidate或者requestLayout时,总会执行转载 2021-02-20 00:01:46 · 1715 阅读 · 0 评论 -
MemoryFile匿名共享内存使用
Android提供了一个高效的共享内存机制。如果应用中涉及到在多个进程间交换数据时使用Android提高的共享内存机制将会大大的提高效率。但是也许是出于安全考虑,在应用层使用共享内存机制将会遇到很多障碍,这篇文章旨在解决这些障碍frameworks/base/core/java/android/os/MemoryFile.java的源码位置下面是5.0版本的网上源码MemoryFile.java使用共享内存的流程大概是:在一个进程中创建一个共享内存。在Android应用层中,用MemoryF转载 2021-02-19 01:03:26 · 1269 阅读 · 0 评论 -
Android匿名共享内存(Ashmem)原理
阅读之前,不妨先思考一个问题,在Android系统中,APP端View视图的数据是如何传递SurfaceFlinger服务的呢?View绘制的数据最终是按照一帧一帧显示到屏幕的,而每一帧都会占用一定的存储空间,在APP端执行draw的时候,数据很明显是要绘制到APP的进程空间,但是视图窗口要经过SurfaceFlinger图层混排才会生成最终的帧,而SurfaceFlinger又运行在另一个独立的服务进程,那么View视图的数据是如何在两个进程间传递的呢,普通的Binder通信肯定不行,因为Binder不太转载 2021-02-19 00:57:21 · 578 阅读 · 0 评论 -
linux内存映射mmap原理分析
内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间<---->用户空间两者之间需要大量数据传输等操作的话效率是非常高的。以下是一个把普遍文件映射到用户空间的内存区域的示意图。基本函数 mmap函数是unix/linux下的系统调用,详细内容可参考《Unix Netword programming》卷二12.2节。mmap系统调用并不是完..转载 2021-02-18 20:23:54 · 164 阅读 · 0 评论 -
Android性能优化常见Q
1、图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理?参考回答: 首先我们要清楚图片的三级缓存是如何的 如果内存足够时不回收。内存不够时就回收软引用对象 2、内存中如果加载一张500*500的png高清图片.应该是占用多少的内存?参考回答: 不考虑屏幕比的话:占用内存=500 * 500 * 4 = 1000000B ≈ 0.95MB 考虑屏幕比的的话:占用内存= 宽度像素 x (inTargetDensity ..转载 2021-02-16 15:31:57 · 254 阅读 · 0 评论 -
为什么静态成员不能访问非静态成员
首先static的成员是在类加载的时候初始化的,JVM的CLASSLOADER的加载,首次主动使用加载,而非static的成员是在创建对象的时候,即new 操作的时候才初始化的; 先后顺序是先加载,才能初始化,那么加载的时候初始化static的成员,此时非static的成员还没有被加载必然不能使用,而非static的成员是在类加载之后,通过new操作符创建对象的时候初始化,此时static 已经分配内存空间,所以可以访问! 简单点说:静态成员属于类,不需要生成对象就存在了.而...转载 2021-02-15 16:40:25 · 1159 阅读 · 0 评论 -
android mmap的使用
http://kenby.iteye.com/blog/1164700共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式, 因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数转载 2021-02-05 01:15:41 · 1246 阅读 · 0 评论 -
mmap详解
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式, 因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映转载 2021-02-05 01:08:26 · 541 阅读 · 0 评论 -
LeakCanary原理解析
简介LeakCanary是一款开源的内存泄漏检查工具,在项目中,可以使用它来检测Activity是否能够被GC及时回收。github的地址为https://github.com/square/leakcanary使用方式解析将LeakCanary引入AS,在Application中调用如下方法,可以跟踪Activity是否被GC回收。 ...转载 2021-02-03 00:52:31 · 226 阅读 · 0 评论 -
浅析LRUCache原理(Android)
一. LruCache基本原理LRU全称为Least Recently Used,即最近最少使用。由于缓存容量是有限的,当有新的数据需要加入缓存,但缓存的空闲空间不足的时候,如何移除原有的部分数据从而释放空间用来放新的数据?LRU算法就是当缓存空间满了的时候,将最近最少使用的数据从缓存空间中删除以增加可用的缓存空间来缓存新数据。这个算分的内部有一个缓存列表,每当一个缓存数据被访问的时候,这个数据就会被提到列表尾部,每次都这样的话,列表的头部数据就是最近最不常使用的了,当缓存空间不足时,就会删转载 2021-02-03 00:43:53 · 598 阅读 · 0 评论 -
Java 8系列之重新认识HashMap
# 声明此文章不是原创文章,但是是最全面的HashMap讲解,本人也在阅读理解中,秉承好东西要分享的原则,希望本篇文章能帮助到大家。# 摘要HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。#简介Java为数据结构中的映射定转载 2021-02-01 01:05:09 · 129 阅读 · 0 评论 -
Java:CAS(乐观锁)
本文讲解CAS机制,主要是因为最近准备面试题,发现这个问题在面试中出现的频率非常的高,因此把自己学习过程中的一些理解记录下来,希望能对大家也有帮助。什么是悲观锁、乐观锁?在java语言里,总有一些名词看语义跟本不明白是啥玩意儿,也就总有部分面试官拿着这样的词来忽悠面试者,以此来找优越感,其实理解清楚了,这些词也就唬不住人了。synchronized是悲观锁,这种线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁。 CAS操作的就是乐观锁,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突转载 2021-02-01 00:55:05 · 205 阅读 · 0 评论 -
MMKV 原理以及使用
介绍MMKV是基于mmap内存映射的移动端通用key-value组件,底层序列化/反序列化使用protobuf实现,性能高,稳定性强。从2015年中至今,在iOS微信上使用已有近3年,近期移植到Android平台,移动端全平台通用,并全部在Github上开源。MMKV 原理内存准备: 通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。数据组织: 数据序列化方面我们选用 protobuf转载 2021-02-01 00:50:21 · 6272 阅读 · 0 评论 -
Android之练习MVVM+DataBinding框架模式
最近简单学习了MVVM框架,记录一下。结果演示: 分析其功能在不同框架下的构成:无框架 ...转载 2021-02-01 00:44:57 · 440 阅读 · 0 评论 -
Android如何保证一个线程最多只能有一个Looper
1. 如何创建Looper?Looper的构造方法为private,所以不能直接使用其构造方法创建。private Looper(boolean quitAllowed) { mQueue = new MessageQueue(quitAllowed); mThread = Thread.currentThread();}要想在当前线程创建Looper,需使用Looper的prepare方法,Looper.prepare()。如果现在要我们来实现Looper.prepare转载 2020-12-11 01:29:40 · 1120 阅读 · 0 评论 -
崩溃了,一个HashMap
HashMap应该算是Java后端工程师面试的必问题,因为其中的知识点太多,很适合用来考察面试者的Java基础。面试官: 你先自我介绍一下吧!我: 我是安琪拉,草丛三婊之一,最强中单(钟馗不服)!哦,不对,串场了,我是**,目前在--公司做--系统开发。面试官: 看你简历上写熟悉Java集合,HashMap用过的吧?我: 用过的。(还是熟悉的味道)面试官: 那你跟我讲讲HashMap的内部数据结构?我: 目前我用的是JDK1.8版本的,内部使用数组 + 链表 / 红黑树;我: 方转载 2020-12-09 01:16:38 · 159 阅读 · 0 评论 -
Java/Android常用数据结构总结
本文主要针对开发中常用的数据结构做个总结,主要还是源码原理相关的内容,尤其是面试需要复习的同学可以多研究一下。线性表ArrayList、LinkedListArrayList基于动态数组实现的,初始化的时候没有指定大小的话,默认容量是10,添加元素的时候会判断是否需要对数组扩容,每次扩容大小为1.5倍,扩容是通过数组的拷贝实现的,这是一个非常耗性能的操作,所以如果可以确定大概的数据量,可以直接指定list大小。由于list是基于数组实现的,数组的特点是在堆内存中用连续的内存空间来存储,所以访问转载 2020-12-09 01:12:50 · 412 阅读 · 0 评论 -
为什么systemServer进程与zygote进程的通信是使用socket而不是binder?
Android Framework层学习——为什么SystemServer进程与Zygote进程通讯采用Socket而不是Binder一些讨论:init进程:init是所有linux程序的起点,是Zygote的父进程。解析init.rc孵化出Zygote进程。Zygote进程:Zygote是所有Java进程的父进程,所有的App进程都是由Zygote进程fork生成的。SystemServer进程:System Server是Zygote孵化的第一个进程。SystemServer负.转载 2020-12-07 01:32:45 · 1642 阅读 · 0 评论 -
为什么 Activity.finish() 之后 10s 才 onDestroy ?
没有及时回调的 onStop/onDestroy交流群里碰到一个很有意思的问题,调用 Activity.finish() 之后 10s 才回调 onDestroy() 。 由此产生了一些不可控问题,例如在 onDestroy() 中释放资源不及时,赋值状态异常等等。我之前倒没有遇到过类似的问题,但是 AOSP 总是我们最好的老师。从 Activity.finish() 开始撸了一遍流程,找到了问题的答案。在读源码之前,我们先来复现一下 10s onDestroy 的场景。写一个最简单的 FirstA转载 2020-12-01 00:59:57 · 1293 阅读 · 0 评论