![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
android基础进阶
文章平均质量分 64
not coder
贪财好色,一身正气
展开
-
Android 全系统版本文件读写最佳适配,CV 即用(适配到 Android 14)
Android 12及以下系统,我们只需要声明READ_EXTERNAL_STORAGE权限即可。并且由于从Android 13开始这个权限就被废弃了,因此还要加上maxSdkVersion="32"才行。参考文献:郭神: https://blog.csdn.net/guolin_blog/article/details/137410229。Android 13新增了3个运行时权限,分别用于控制App对照片、视频、音频的访问。这是能够完美适配Android各个系统版本的本地读写权限的写法。原创 2024-08-14 11:16:36 · 203 阅读 · 0 评论 -
LiveData底层实现
提供了一个简单而强大的机制,使得数据在组件之间的通信变得更加容易和可靠。同时,它也遵循了生命周期的管理,避免了内存泄漏和不必要的数据更新。这样可以确保观察者能够接收到最新的数据,即使它们在数据变化之后才注册。使用了弱引用来引用观察者,这意味着如果观察者没有被其他引用持有,它将会被垃圾回收,避免了内存泄漏。是一个可观察的数据持有类,它可以在数据变化时通知注册的观察者。会确保通知观察者是在主线程执行的,以保证 UI 更新操作在主线程进行。的生命周期状态,并在相应的生命周期状态下决定是否分发数据更新通知。原创 2023-09-19 12:47:03 · 230 阅读 · 0 评论 -
基于ConstraintLayout的增强布局,专注于过渡动画实现的动画框架:MotionLayout
继承自,布局内容的写法就完全遵循ConstraintLayout,布局就交给了ConstraintLayout是一个动画框架,专注于实现过渡动画Android动画分类:View 动画API 1 加入帧动画补间动画属性动画API 11 加入调用方式:使用 ObjectAnimator 或 ValueAnimator 来对布局的属性进行动画处理也可以使用 View 的 animate() 方法来执行动画。这是一种更简洁的方式,但背后实际上也是在使用属性动画过渡动画API 18 加入。原创 2023-09-15 17:59:12 · 163 阅读 · 0 评论 -
View绘制流程的源码所得
子线程不是不能更新UI,而是谷歌工程师不让我们在子线程更新UI,是一种代码级别的约定,因为如果任意线程都能更新UI,那么系统工程师就需要做线程安全,每次更新UI都得执行加锁、解锁操作,浪费性能,还得考虑各种意外情况出于成本考虑,强制让开发者在主线程更新UI,能解决掉非常大的性能问题和巨量的工作,所以说不允许在子线程更新UI。原创 2023-09-12 22:50:15 · 207 阅读 · 0 评论 -
Android 小组件功能开发
Android小组件(App Widgets)是从Android 1.5(API级别 3)开始引入的特性。它们是一种用于在Android设备的桌面上显示简单信息和提供有限交互的功能组件。小组件允许开发者将应用的部分内容或功能以简洁的形式展示在设备的桌面上,而无需用户打开整个应用。用户可以通过长按桌面来添加、移动和删除小组件。自从Android 1.5引入小组件以来,它们一直是Android系统的一项重要特性,让用户更轻松地访问常用信息和快速执行操作。原创 2023-08-07 09:43:07 · 2546 阅读 · 0 评论 -
Unsupported Java. Your build is currently configured to use Java 17.0.6 and Gradle 6.8.3.
关键是知道发生了啥,精准的结果,然后才能知道可能的解决方案。原创 2023-06-01 16:43:23 · 27127 阅读 · 8 评论 -
Android 事件分发机制
这里的事件指的是 View 对手势的响应,这里的手势包含四种事件说明手指初次触摸屏幕时触发手指在屏幕滑动时触发,会多次触发ACTION_UP手指离开屏幕时触发事件被上层拦截时触发一次 ACTION_DOWN --> ACTION_UP 流程称为一次事件一次事件的消费 View 只有一个。原创 2023-05-24 02:58:42 · 440 阅读 · 0 评论 -
Android 历代版本主要变化
这里只站在开发者的角度,谈论一下 Android 5.0 之后的版本的主要变化。原创 2023-05-06 00:13:50 · 1666 阅读 · 0 评论 -
HashMap 的特点及其优缺点以及底层实现
Hash:散列Map:映射顾名思义,是以 key-value 的形式存储数据通过源码可知,他是一个类型为 key-value 形式的数组,key 的 hash(不仅仅是取hash这么简单,后续会讲)值决定了数据应该存放在数组的哪个下标里面,存放在数组里面的数据格式为链表,在 jdk1.8 中极其之后,数据格式引入了树型结构,会在一些特殊情况下发生链表与红黑树的相互转换。原创 2023-04-21 00:22:18 · 675 阅读 · 0 评论 -
集合存在的意义是什么
如果给你一堆数据,你如何保存呢?可以给每一个数据声明一个变量保存,数据量少的时候是可以的,多了就疯了,而且也不便于计算,还需要每一个开发者记住每一个数据的变量名称,说明这样是不可取的。那么使用数组呢?数组有一个致命的特点就是创建的时候需要指定其长度,并且在使用时长度不可改变,我们的数据量是根据现实时间及业务发展的,不可能是不变的,所以说我们需要一个拥有可变长度的容器来存储这些数据,那么,集合的概念就顺理成章了。原创 2023-04-20 15:15:36 · 126 阅读 · 0 评论 -
Java 线程安全(四)-- ReentrantLock
两个线程就有四种情况,两个线程随机进行操作的时候,哪些组合是被允许同时存在,哪些是不行的呢?,Java中还有别的方式来保证数据资源安全。之间的代码不会抛出异常,如果抛出异常,则。的时候,他就没必要加锁,加了锁性能就降低了。永远得不到执行,就会永远处于锁住的状态。来执行加锁和解锁来保证数据安全。...原创 2022-07-29 15:16:33 · 159 阅读 · 0 评论 -
Java 线程安全(三)锁的几种情况
读出一个数据,对这个数据进行运算操作,然后将此数据写回到数据库中,假如说在读出和写回期间,有人修改了这条数据,如果我们之间将结果写回的话,那么就肯定不准确了,只能再读出来再运算后写回去。我们判定这种情况不会经常出现,采用以上乐观的方式去处理这个问题,提高性能,这种情况我们称之为乐观并发控制。...原创 2022-07-29 14:14:53 · 178 阅读 · 0 评论 -
Java 线程安全(二)-- synchronized
方法可以很清楚的看到跟另外两个方法没有关系,我想在另外两个方法当中的一个被调用的时候,这个方法也能被同时调用,应该怎么做呢?不管跟当前方法中的变量有没有关系,都不能被调用了,为的就是防止出现以上加法和减法同时操作相同的变量时导致的数据不同步的问题。如代码所示,三个方法有可能同时被不同线程调用,尤其是加法和减法,同时被调用会导致数据同步异常。,创建标记的原因,因为只起到标记的作用,所以说用任何对象来标记都行,使用。方法的原因,首先是,刚刚已经说过这样做的好处了,那是如何实现的呢?方法被调用了,剩下的所有的。.原创 2022-07-29 11:44:17 · 125 阅读 · 0 评论 -
Java 线程安全(一)-- volatile
而在这里,主线程持有此变量,子线程在执行时候,将值拷贝了一份到自己的内存中,然后子线程并没有做值的修改,并不存在将值同步给主线程的过程,而此值的持有线程是主线程,主线程在更改完此值之后只会同步给自己,并不会同步给子线程,所以说子线程的值永远为最初拷贝走的值,永远为true,就永远不会停下来了。从代码来看,两个线程分别对同一个数进行一百万次从自增操作,无论谁最后执行完成,理论上来讲,总有一个线程打印出来的结果是两百万,但实际的运行效果,无论执行多少次都没有两百万的结果出来。到目前为止,线程安全除了加。....原创 2022-07-28 18:17:32 · 793 阅读 · 0 评论 -
Java 多线程的几种实现方式(三)-- Callable
那么现在就有一个问题,子现场是耗时操作的,他的返回值返回给谁用呢,主线程如何不阻塞的情况下拿到子线程的返回值呢?()去取值,这里的取值,是阻塞式的,能保证我们值的可靠性,这是Java在API层能做到的上限了。其中,future提供一种方法让主线程能够主动去询问后台线程是否执行完毕,他就是future.(callable)中,executor调用的不是。首先,executorService.(callable)而是。然后配合future.我们接下来解释这个问题。......原创 2022-07-27 17:43:13 · 549 阅读 · 0 评论 -
Java 多线程的几种实现方式(二)-- Executor
Executor给他一个Runnable,他就能自动很安全的帮你把这个线程执行完毕Executor是一种非常简单的线程池创建方式Executor并且有两种结束方式,shutDown()和shutDown会将当前正在执行的和排队中的线程执行完毕后结束,并且不允许有新的线程加入到待执行队列中Executor有五种创建线程的方式.........原创 2022-07-27 16:18:48 · 932 阅读 · 0 评论 -
Java 多线程的几种实现方式(一)
但在主流方式中,以上两种都不推荐使用,主要的原因是,线程的管理不方便,造成线程混乱等现象。原创 2022-07-27 15:46:51 · 506 阅读 · 0 评论 -
ConstraintLayout 几种复杂布局的实现
特殊的布局,layout_constrainedWidth原创 2022-07-18 17:05:35 · 265 阅读 · 0 评论 -
ConstraintLayout 简介
Android第六大布局,约束布局,一定程度替代了前五大布局。使用原则线性布局的效率还是值得肯定的,在不嵌套的前提下,如果用鲜血布局更简单还是推荐使用;完全代替相对布局。原创 2022-07-18 16:21:47 · 244 阅读 · 0 评论 -
Chronometer 倒计时控件,你搜到的用法可能全是错的
Chronometer 是 android 官方推出的计时控件,用法非常简单 <Chronometer android:id="@+id/tvCountTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#F原创 2022-02-17 18:13:28 · 3242 阅读 · 3 评论 -
Android 11 wifi adb 连接错误 “Unable to start pairing client.“
Android 11 开发者模式新增了无线调试模式,扔掉了之前比较鸡肋的先插线、再连接无线调试的方式具体的连接方式在此简要带过:确保手机、电脑处于同一 Wi-Fi 下 电脑上的 Android SDK 工具需要 ≥ 30.0.0 版本,使用命令:adb --version手机开发者选项中打开无线调试,选择使用配对码配对设备电脑端输入命令adb pair xx.x.xx.xxx:xxxxx以上的xx.xx为你弹窗内容的ip地址和端口如果不出意外就会连接成功,但是有时候会原创 2021-04-16 11:10:59 · 6787 阅读 · 0 评论 -
Jetpack 简介--看这里让你不再恐惧
Jetpack 是什么 Jetpack : 喷气背包 Jetpack 不是一个库,而是一些库的合集,更多的是Google的一个态度 为什么会有Jetpack 的存在 长久以来, Android 官方没有制定一个项目架构的规范,只要能够实现,代码怎么写随便.Android开发者基本都是被放养的.生态基本全靠自建,代表有Square全家桶,Glide,Google自己也肯定是出力的,只不过并没有明确Android开发的几个大方向. 比如Support lib 经常自己打自己脸.一会推这个A..原创 2020-09-22 20:24:49 · 1008 阅读 · 2 评论 -
系统总结Android OOM 产生原因及解决方案
名词解释OOM Out Of Memory 内存溢出理解如果不好理解,可以想象一下水溢出,向一个杯子里面持续加入水,当水杯空间不够用的时候,水就会溢出同理,android系统分配给app的运行内存就是一个水杯,当app开销内存超过分配当内存时,就会产生内存溢出产生当几种原因内存一次性开销过大内存持续性开销内存回收不及时内存无法回收导致内存泄漏进而导致内存溢出每种原因对应当实例...原创 2020-06-03 20:40:33 · 1648 阅读 · 1 评论 -
android也能添加布局更新动画,并且非常简单,再也不用羡慕ios了!
Android 提供了系统在您每次对布局做出更改后运行的预加载动画。您只需在布局中设置一个属性,告知 Android 系统为这些布局更改添加动画,系统就会为您执行系统默认动画。(既然是默认动画,那么支持自定义,关于自定义动画,我们换个姿势来讲。)先来个效果图(以下效果录制自android官网)实现方式在 Activity 的布局 XML 文件中,针对您要启用动画的布局,将 android:...原创 2020-03-31 16:10:22 · 269 阅读 · 0 评论 -
linux安装gradle环境编译android项目
下载gradle包wget https://services.gradle.org/distributions/gradle-5.4.1-all.zip下载android-sdkwget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz解释一下android-sdk的版本,不知道为什么android只提供到这个版本的S...原创 2020-03-24 16:49:43 · 1402 阅读 · 0 评论 -
Android五大存储
简介:这是Android中数据存储的5中方法的详细页面,介绍了和手机软件,Android Android中数据存储的5中方法有关的知识,Android数据存储Android提供了5种方式存储数据:--使用SharedPreferences存储数据;--文件存储数据;--SQLite数据库存储数据;--使用ContentProvider存储数据;--网络存储数据;先说原创 2016-12-19 14:24:50 · 239 阅读 · 0 评论 -
new 和 static 的理解
对于一个类中的方法和变量,我们无法保证当我们想使用它时他在内存当中一定是存在的,这个时候就要借助static将他存储到静态内存区域,以保证我们想使用的时候随时都能调到,哪怕这个类没有被执行到。比如某一个Activity还没有开始他的生命周期,就要调里面的参数或者方法。当然还有另外一种方法,就是实例化方法所在的对象,new。现在来看呢,首先是每次使用均需要实例化不太方便,然后就是在实际应用当中...原创 2017-03-08 10:59:57 · 828 阅读 · 0 评论 -
resources-debug-stripped.ap_' specified for property 'resourceFile' does not exist.
Error:A problem was found with the configuration of task ':app:packageDebug'.> File 'E:\AndroidStudioProject\lesutong\app\build\intermediates\res\resources-debug-stripped.ap_' specified for property原创 2017-03-01 16:37:00 · 643 阅读 · 0 评论 -
PullToRefreshListView的使用
以下亲测可行,希望能帮到你-----------------------------xml布局----------------------------xml version="1.0" encoding="utf-8"?>RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln原创 2016-10-12 15:01:11 · 228 阅读 · 0 评论 -
PullToRefreshScrollView的使用
布局文件ScrollView嵌套ListView,使用PullToRefresScrollView代替原本的ScrollView,自定义的ListView解决嵌套时高度计算问题xml version="1.0" encoding="utf-8"?>RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"原创 2016-10-12 14:27:42 · 381 阅读 · 0 评论 -
Android使用PullToRefresh
1:File-->New-->Import moudle-->选择下载的PulltoRefresh路径,找到其中的library-->next-->确定2:会报如图所示的错误3:打开gradle4:改变版本号,将moudle改成我们自己的版本号,try again5:File-->Project Structure点击app点击加号“+”选择3原创 2016-10-12 10:08:18 · 240 阅读 · 0 评论 -
PullToRefresh在Android6.0运行报错的问题
PullToRefreshWebView这个类会报错如图,讲所有报错改成Math类就ok或者将所有的.floor改成.double希望能帮到你原创 2016-10-11 20:23:27 · 389 阅读 · 0 评论 -
PullToRefreshListView刷新无法停止的问题
以下亲测可行,希望能帮到你-------------------------------------------注意------------------------------------关于刷新加载无法停止的问题可以看出在完成监听回调当中开了一个线程,无法停止是因为请求数据时间过短,我们让他睡眠一秒以上就可以实现停止动画--------------------------原创 2016-10-12 15:15:07 · 726 阅读 · 0 评论 -
ViewPager2添加自定义动画
此篇为ViewPager2的拓展篇,具体可查看ViewPager2的使用ViewPager2自定义动画的核心是使用PageTransformer来实现,他是ViewPager2中的一个接口原理要显示非默认屏幕滑动动画,请实现 ViewPager2.PageTransformer 接口并将其提供给 ViewPager2 对象。该接口只会公开一个方法 transformPage()。在屏幕切换的...原创 2020-03-13 17:36:12 · 3872 阅读 · 1 评论 -
不会ViewPager2的使用?来这照抄就能入门
简介1.0.0 的主要功能对之前的 ViewPager 实现的改进:RTL(从右向左)布局支持垂直方向支持可靠的 Fragment 支持(包括处理底层 Fragment 集合的更改)数据集更改动画(包括 DiffUtil 支持)从之前的 ViewPager 实现中轻松迁移(API 尽可能一致)。请参阅迁移指南和示例应用。截止本文发布时间止,viewpager2的最新版...原创 2020-03-13 16:12:03 · 1392 阅读 · 1 评论 -
app:transformClassesWithMultidexlistForDebug
是否遇到了以下问题,就是他:Error:FAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':app:transformClassesWithMultidexlistForDebug'.> com.android.build.api.transform.Transf...原创 2018-07-05 17:56:31 · 6294 阅读 · 1 评论 -
INSTALL_FAILED_ALREADY_EXISTS 应用权限冲突
Failure [INSTALL_FAILED_ALREADY_EXISTS: Attempt to re-install com.xxx.xxx 477 without first uninstalling.]在安装apk是时候安装不上,提示应用权限冲突原因:不同的apk使用了相同的自定义权限,注意,是自定义权限。一般出现在推送的自定义权限当中,比如极光 <permission ...原创 2020-02-21 11:20:55 · 8724 阅读 · 0 评论 -
Chain validation failed
Chain validation failedjavax.net.ssl.SSLHandshakeException:Chain validation failedtimestamp check failedCertificate expired at Wed Nov 20 20:00:00 GMT+08:00 2019 (compared to Mon N…当你遇到了类似以上的报错,先来...原创 2019-11-25 17:51:21 · 13161 阅读 · 5 评论 -
Android6.0动态权限看了那么多文章还是一头雾水?那是因为你没有看这篇
基本概念大家都知道我就一笔带过了Android 6.0是Android发展史上的一个分水岭,从这个系统开始无论是系统流畅度、运行速度、安全性、用户隐私保护、用户控制、动态授权等都得到了质的提升。其中意思保护就体现在动态权限获取上,也是从这个版本开始需要进行动态的用户权限获取既然说到权限获取,那就需要先知道为什么要获取权限google 将一些权限等级提升,归为危险权限,将这些权限是否授权给...原创 2019-09-26 19:08:33 · 165 阅读 · 0 评论 -
压制调用Android系统私有api系统警告弹窗 Detected problems with API compatibility
Android P 后谷歌限制了开发者调用非官方公开API 方法或接口,也就是说,你用反射直接调用源码就会有这样的提示弹窗出现,非 SDK 接口指的是 Android 系统内部使用、并未提供在 SDK 中的接口,开发者可能通过 Java 反射、JNI 等技术来调用这些接口。但是,这么做是很危险的:非 SDK 接口没有任何公开文档,必须查看源代码才能理解其行为逻辑。但是源码是JAVA写的,万物皆可...原创 2019-09-06 16:07:58 · 897 阅读 · 0 评论