- 博客(321)
- 收藏
- 关注

原创 程序员装机必备软件
这里记录我安装好系统之后必须要安装的一些软件官方地址。JavaSE JDK8:https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.htmlAndroid Studio:https://developer.android.google.cn/studioIntelliJ IDEA:https://www.jetbrains.com/idea/Everything:https://www.voidtools.
2021-04-22 11:07:13
906

原创 广州图书馆
写篇博客记录一下广州图书馆吧!今年的某一天第一次去广州图书馆,里面是真的宽广、干净又安静,图书很多,我想要的书几乎都有,可以说,你平时在广州购书中心想要买的书,在图书馆绝大多数都有,所以,为什么要花钱去买呢!而且图书馆里的书很多都是很新的,我以前天真的以为图书馆的书都是很旧的,我错了!广州图书馆里面环境真的很好,坐位超级多的,生怕你没地方做似的,可能是疫情期间,进馆需要预约,所以我看到坐位那么多,还没几个人做,不知道没疫情时没人数限制那时是不是坐位暴满的场面,就恨自己以前为什么不早点去图书馆逛逛,这样就
2021-02-03 15:47:16
943
4

原创 想学习的内容零散笔记
突然间发现,可以学的东西好多,自己好多东西不会,好落后了,Android已经出了好多好用又新的东西自己都没花时间去学,不是学不会,只是没去学。谷歌还是很做实事的,Android更新非常快,包括android系统和相应的api,文档也是越来越丰富(相比早期的简单文档),可以看出谷歌是一家做实事的公司,是一家好公司,做Android,不会错的,关键看自己的学习能力了。在这个互联网时代,手机、电脑很容易分人的心,经常不记得自己要干什么了,所以这里记录一下自己想学的东西,迷茫的时候就来翻翻这个日志,找点喜欢的东
2020-09-10 17:00:12
626

原创 一看就懂的i++和++i详解
我相信很多朋友可能之前已经百度过i++和++i的相关文章了,也做过不少的练习,觉得自己已经深刻掌握了它们之间的原理了,真的是这样的吗?来试试计算一下我下面提供的几道练习,你就会发现你又不会了!
2020-05-09 22:10:35
53460
155
原创 Kotlin带接收者的Lambda介绍和应用(封装DialogFragment)
方法的调用封装到了方法里面,这样重复的代码就只写一次,不用每次都写了。这里,对于 “确定” 和 “取消” 按钮也是很常用的,而且不管你是点了确定还是取消,点击之后对话框都会自动取消,所以上面代码中的。从对比上来看,长得差不多,带接收者就是把括号中的参数移到括号前面,并加了一个 “.” ,带。参数大多数情况下都是用不到的,但是每次都要写也很麻烦,而且函数名。这样做是可以的,但是真的很麻烦,能不能像。又是可以省略不写的,基于这个特点,我们不能给带接收者的。这里面有一些代码是每次都一模一样的,所以还可以优化,
2025-05-05 23:31:04
1019
原创 使用TortoiseGit进行文件比较
当你同步时,Git会检查 “我的文件” 与 “基础文件” 的差异,提交时就是把差异提交上去,同时也会检查 "远端文件"中是否有更新的提交,如果有,则会让你先拉取远端文件,拉取后,你的电脑就会有 “基础文件”、“我的文件”、“远端文件”,三种文件同时存在了,Git 会把 “我的文件” 和 “远端文件” 也进行差异比较且会合并差异合成一个文件,如果有冲突还会要你解决冲突,解决了之后才能提交推送到远端。所以,如果我们要比较两个没有版本控制的文本文件,一般选基础文件和我的文件进行比较即可。
2025-04-28 09:29:16
270
原创 Android协程
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) lifecycleScope.launch { launch(Dispatchers.Def
2025-04-14 15:32:57
217
原创 Kotlin协程入门
前言现在还在学习阶段,无法写的详细,先写一些自己需要记的东西。InteliiJ开发环境这里,我们使用免费的IntelliJ IDEA 2021.3.3 Community版本。创建一个项目,设置如下:创建后,项目结果如下:可以看到,自动生成了一个Kotlin文件,可以直接点击main函数左侧的绿色三角形以运行main函数。join()函数fun main() = runBlocking { val job = GlobalScope.launch { delay(
2025-04-14 15:32:08
1049
1
原创 kotlin的takeIf使用
用于判断指定对象是否满足条件,满足就返回该对象自身,不满足返回null。因为可以返回对象自身,所以可以用作链式调用,以简化代码,又因。然后有个需求是判断一个女性是否达到法定结婚年龄,如果达到了的话就打印一个消息到控制台。可能返回空,所以常常和。
2025-04-11 16:08:56
310
原创 Gradle软件下载的镜像
腾讯云镜像:https://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-bin.zip。华为云镜像:https://repo.huaweicloud.com/gradle/gradle-8.11.1-bin.zip。阿里云镜像:https://mirrors.aliyun.com/gradle/gradle-8.11.1-bin.zip。今天(2025/3/28)试了阿里云镜像无法访问,另外两个正常。使用国内镜像源(推荐)。
2025-03-28 23:44:35
1117
原创 阿里云云效 Maven
官方插件(如 org.jetbrains.kotlin.android)社区插件(如 com.github.spotbugs、io.spring.dependency-management)gradle的官方插件通常不会托管到或google()。包含几乎所有 非 google() 系的 Java 库(当然也包含kotlin)。仅包含 Google 官方发布的库。
2025-03-28 03:13:02
830
原创 使用Apifox动态生成请求参数
假如“自定义脚本” 在上面,如果我们在自定义脚本中想读取替换后的变量,则会读取不到,因为自定义脚本运行时,变量替换的脚本还没有运行。比如,我要调试一个登录请求,使用Apifox来进行调试,登录请求需要一个密码,这个密码需要进行AES加密后才能发送出去,我希望在Apifox中我填入明文密码,然后Apifox帮我进行AES加密后再发送出去。如上图,可以看到响应体中的密码就是加密后的密码了,后面再调试时,我们密码随便换,只需要填入明文密码,工具会自动帮我们加密。参数移除,然后添加经过加密后的参数。
2025-02-27 18:30:20
1269
原创 查询网络类型以及请求特定网络和绑定到特定网络以及监听网络变化
绑定指定的网络,确实是可以的,比如我想绑定我的App就用移动网络,即使连了wifi也走移动的网络,不走wifi,经实验确实是OK的,wifi明明连接了,但是还是可以走移动的网络进行通信。这里我们只监听wifi网络的变化,如果蜂窝网络发生变化我们就不知道,如果我只想知道当前默认网络的变化,默认网络即当前正在使用的网络,比如你当前有蜂窝网络,同时也连着WIFI,如果你的应用正在使用WIFI网络来进行网络传输,则WIFI网络为默认网络,不论当前默认是什么网络,想要监听它的变化可以使用。中只包含了wifi网络。
2024-12-26 11:12:36
1193
原创 设置首选网络类型以及调用Android框架层的隐藏API
而有的手机甚至连关闭5G的功能开关都没有,也没有首选网络类型的设置界面,这很不方便,比如有时候测试,我就希望使用4G网络,但是手机上没有设置可以去进行修改,怎么办?这个首选网络类型的设置,一般都会有一个类型最全的,即包含移动/联通/电信,且包含5G/4G/3G/2G的选项,且这个选项一般排在最前面,这样的选项用英文描述为“Global”,有全面的/全球的意思,意思就是你用这个选项,你插什么卡都能用,比如联通/电信/移动,而且不管你是4G、3G还是2G都能用。在新一点的版本手机中,还会有5G的选项。
2024-12-25 08:58:44
1660
原创 Android串口开发中的计算校验码
串口开发中,数据是7个字节的,计算校验码就是把中间的5个字节相加(不要头和尾),得到的校验码用作7个字节中的最后一个字节,所以5个字节相加的和最多只能是1个字节的大小,但是相加的结果很可能大于1个字节,所以如果使用int类型来保存相加结果的话,就需要转换为int,但是不能直接转,直接强制转换类型可能结果会不对,首先需要把结果。,这样就只保留了int中的最后一个字节了,且不存在负数问题了,这样再转换为。更好的做法是在保存结果的时候直接使用。来保存,这样就不需要。
2024-12-18 17:59:23
230
原创 Android获取sim卡频段信息
公司一些Android设备,在交给客户使用时,需要使用sim卡网络,但是有时候网络不好,要给客户证据说明是网络问题,一个办法是网络测速,还有就是获取一下频段信息,根据这个信息可以和中国移动沟通问题来源,比如在某些地方,移动只部署了一两个频段,而有的频段速度快,有的频段速度慢,所以可以通过频段信息判断网络问题。
2024-12-18 10:00:56
823
原创 java中整型的大端和小端
验证一个 int 变量在栈内存中是大端还是小端存储,需要通过一些间接方式,因为 Java 不允许直接操作内存地址。比如在Java中声明了一个 int变量,这个变量在栈内存中分配内存地址,那当int值保存到栈内存中时是用大端还是小端?在读写多字节值以及为此字节缓冲区创建视图时使用该字节顺序。这个不用猜,直接看JDK文档即可,比如,使用。我们可以通过 JNI 编写一个本地方法来直接读取栈内存中保存的 int 变量的字节序。在 Java 中,int 类型变量在栈内存中的存储方式(大端或小端)是由。
2024-12-06 11:07:31
712
原创 String IP和Int IP的互相转换
android中,wifiManager.connectionInfo.ipAddress 可以获取到wifi的ip地址,但这是一个int值,如何转换为常见的如192.168.1.129这种形式,以及这种形式如何转换回int值的形式。这里ip分为4段,每一段的值都是0 ~ 255,这正好是1个无符号字节就能表示的,所以ip的值用4个字节就可以保存,4个字节刚好又和int的大小相同。转换为字符串格式: 使用 InetAddress 是更可靠的方式,但手动方式也适用于这种简单情况。方法 2: 手动转换。
2024-12-05 15:28:02
705
原创 Kotlin中泛型的协变
如上代码,List是一个协变类型,所以泛型Shape可以接收Circle,这是没问题的,因为List是只读的,那么List中的元素就只可能是Circle类型,不会发生改变。如上代码,第一行赋值语句是OK的,第二行赋值语句在编辑器上直接就报错了。如上代码,在编辑器中是直接报错的,因为MutableList不是只读的,它可以增、删除 、改,比如。如上代码,如果非协变类型可以子类给父类,这将导致异常,所以在编辑器中这种赋值时会直接报错。只读集合类型是协变的,相反,可变集合不是协变的。协变不协变有什么用?
2024-11-15 16:35:27
490
原创 HandlerThread的使用
在处理事件时是在主线程上运行的,为了预防阻塞主线程,我们就需要另外再开启子线程来处理。方法是运行在子线程中的,当我们在登录时,立马就点击注销,此时注销代码不会马上被执行,因为登录操作需要5秒钟时间,它阻塞了线程,当登录操作结束后,注销的代码就可以马上得到执行了。方法的区别在于后者会等待处理完所有先前在任务队列中的任务再结束循环,比如,我们连续点击两次登录按钮,然后立马点击结束线程按钮,如果是。函数之后,再往消息队列中新添加的消息将不会被执行,比如按了结束线程按钮后,再按登录按钮,则登录操作不会被运行。
2024-11-06 14:43:51
668
原创 Looper.loop()的阻塞机制
这些系统调用允许线程在文件描述符(通常是消息队列的读端)上等待事件的发生,从而在有新消息时将线程唤醒。当没有任务时,线程会挂起等待新任务,一旦新任务到来,线程会被唤醒继续处理。没有消息可处理时,它会让线程进入等待状态,避免无意义的资源消耗。当没有新消息时,这个方法会阻塞当前线程,使线程进入等待状态;当有新消息到来时,它会被唤醒。中,当消息队列为空时,线程会被挂起,进入等待状态;当有新消息加入时,线程会被唤醒,继续处理消息。当有新消息时,通过底层的。是一个无限循环,当没有新消息时,它是如何挂起的?
2024-11-06 10:30:51
668
原创 处理器用handler表示还是用processor表示比较好?
在计算机硬件中,比如 CPU、GPU 或其他专门的处理单元,通常用 “processor” 表示。在开发中,编写代码时经常会用到处理器,如果是自己创建处理器,那这个类名中的处理器单词用哪个?:当强调一个“处理器”在数据流或系统架构中的角色,且它负责较大任务或持续的数据处理流程时。:当它是用于事件响应或执行单一、细粒度的操作时。特别是瞬时的、具体的事件或消息处理。:如果是在数据处理流水线或流式处理场景中,例如处理一系列数据或事件的步骤,使用。通常用于较小、具体的处理逻辑,而不是完整的任务。
2024-11-06 09:50:09
430
原创 获取带字母的iccid
可以看到,在没卡的情况下,它的列表依旧会返回一个数据,获取的ID为E,可能是表示Error吧,所以,当获取到iccid后,要判断它的长度是否大于等20位,如果不是则是无效的。,好像也只有这个作用了。另外,在Github上找相关实现的时候了解到一个情况,国外的sim卡的。,在我的小米11 pro (Android 14版本)中,双卡分别返回id为1和2。可以看到,在实体卡片上,它把最后一位数字用字母给隐藏起来,实际上它是一个数字。(sim卡序列号),不论这个卡是否带字母都可以获取到,非常的简单,只需要。
2024-10-30 10:54:45
1135
原创 Kotlin中$符号的转义
等,但是在原始字符串中(即三引号括起来的)没有转义字符的说法,所以在原始字符串中没办法表示一个制表符,也没办法表示一个回车换行,但是它支持你直接按回车来输入回车换行,在原始字符串中反斜杠也会当成普通字符处理,所以用来写正则表达式就比较方便,因为正则中用到反斜杠的地方就不需要做转义处理了。符号后面字符串对应的变量,所以编译就会报错。符号没有得到转义,那么它此时就用于字符串插值,但是我们又没有变量。后面的字符符合变量命规则,所以会被识别为变量,所以此时的。如上代码,在编译器中会直接报错,因为。
2024-09-18 16:10:42
539
原创 安装WMware和Ubuntu并使用xShell连接
到目前为止都是一路按回车,在上图中,显示了Ubuntu系统的ip为192.168.124.16,和Windows电脑是同网段的,所以可以在Widnows中ping通这个ip,也可以Ubuntu中ping通Windows电脑的ip。如上图,此时才是真正的开始安装Ubuntu系统,之前的那些都是进行一些配置设置。如上图,这个界面中的任何软件都不需要安装,光标定位到Done按回车。如上图,这一步需要按箭头下把光标定位到 “Done”,然后按回车。如上图,输入许可证密钥,自己网上找,输入后点击“输入”按钮。
2024-08-27 23:09:20
1500
原创 判断是否连接了wifi(坑、坑、坑)
如上方法,当wifi是连接的情况下,它就像是个粘性广播,一调用register函数就会立马收到回调,但是如果wifi是未连接的情况下,调用register函数时不会收到回调,所以这点不是很好,感觉像是Android官方Bug,你推荐我们用这种方式,但是当wifi未连接时,调用register函数确实收不到回调通知。所以,如果要监听wifi连接、断开的事件,可以使用这个注册回调的方式,如果要主动获取,则还是使用前一种方式,或者使用判断是否有ip的方式。是 sim卡的,并不是 wifi的。
2024-07-19 19:06:34
17814
原创 Android音频焦点
在某些情况下,多个音频流可以同时播放,但只有一个是用户真正会听的(专注于),而另一个在后台播放。一个例子是,在播放音乐时,会播报行车路线,而音乐的音量会降低(又称为闪避)。函数的作用:当一个应用程序请求音频焦点时,系统会通知其他正在播放音频的应用程序让出音频焦点。根据请求的类型和当前的音频焦点状态,其他应用程序可能会降低音量、暂停播放或完全停止播放音频。注:上面音频焦点API使用的是新出的API,在API 26才出的,也有过时的API可用,但是不推荐。,此时播放器应该暂停,通话结束后,调用。
2024-05-29 17:02:28
735
1
原创 Android11热点启动和关闭
Android官方关于在的类中有一套系统 API 可以控制热点的开和关,代码如下:对于和stopSoftAp这些API都被@SystemApi注解所标注,所以我们无法直接调用,只能通过反射来调用,而且这些API需要一个权限,这个权限需要系统签名的应用才可以使用,权限如下:builder忘记哪个API是30才出的了,所以做了一个版本上的判断,Android R为Android 11版本。对于启动热点,可用中的,或者中,其中,的只负责启动或关闭热点,对于热点名称密码等的一些配置要用的函数。
2024-05-23 09:04:54
2545
原创 Android内存不足的监测
是 Android 中的一个接口,用于接收内存相关的回调。它主要用于检测应用的内存使用情况,并在系统内存不足时释放不必要的资源。实现这个接口可以帮助应用在内存紧张时更好地管理资源。接口,应用可以在不同的内存紧张级别下做出响应,释放不必要的资源,从而改善应用的性能和用户体验。以下是一个 Kotlin 示例代码,展示如何在。
2024-05-14 17:39:32
751
原创 一个长期后台运行的服务
这个权限在Android 9.0的时候才出的,所以,如果目标版本低于9.0版本的话,可以不用声明前台服务权限,而且前台服务在很早的版本就已经有了,但那时不需要权限的。
2024-05-14 17:09:09
383
原创 宽动态设置
一般来说,如果拍摄场景中存在较大的亮度差异,比如同时有强光和阴影部分,那么较高的宽动态范围设置会更合适,因为它可以帮助摄像头在不同亮度条件下保留更多细节。但是,如果拍摄场景中的亮度差异不是很大,也可以选择较低的宽动态范围。摄像头的宽动态范围(Wide Dynamic Range,简称WDR)通常表示它能够同时捕捉到高光和阴影细节的能力。可以进行一些测试,调整不同的宽动态范围设置,并观察拍摄效果,以确定最适合当前场景的设置。公司的一款摄像头的宽动态范围为1-100,设置多少合适?
2024-05-08 09:19:53
792
原创 音频播放&录音&回声消除
如果录到的声音即听不清自己话说也听不清播放的声音,则你再把这个声音做回声消除,肯定也消不好,因为原始音频就已经很差了,回声消除肯定也无法把音频变清晰的!音乐类型的声音大小范围为0 ~ 15,而通话类型为1 ~ 7,所以音乐类型的声音大小在调整时可以比较细腻,过渡比较平滑,比如从小最按到最大需要按15次音量加,而通话类型的话,从最小按到最大只需要按6次,所以它的过渡是没这么平滑的,所以相当的音量值,它们代表的声音大小是不一样的,这也是为什么通话类型的音量大小1比音乐类型大小1的声音要大声的原因。
2024-04-26 16:47:51
1846
原创 Cannot access ‘androidx.activity.FullyDrawnReporterOwner‘
本来原来一直都好好的,不知道哪天起新建的就报错了,经过排查,发现把。
2024-04-15 10:53:06
860
原创 信号值解读
是一种表示功率的单位,用于测量无线传输网络中信号的强度,它表示以毫瓦为基准的功率值的对数比。请注意,这些值是一般性的指导,实际的信号强度受到许多因素的影响,包括但不限于距离基站的远近、障碍物的阻挡、信号干扰等。-60 dBm 表示非常强的信号,-120 dBm 表示非常弱的信号。但是需要注意的是,这些值的具体范围和意义可能会因为不同的通信技术、设备和环境而有所不同,因此在实际应用中,需要根据具体的情况进行解释和判断。-50 dBm 表示非常强的信号,-100 dBm 表示非常弱的信号。的值越大,信号越好。
2024-04-12 16:16:09
4616
原创 手机重启手app没了
是一个在 Android 设备上执行的命令,它用于将文件系统中的缓冲数据写入到磁盘中。在 Android 中,文件系统通常使用缓冲机制来提高性能,但是这也意味着数据不会立即写入到磁盘上,而是在系统认为合适的时候进行写入。发现公司有些Android球机设备,安装了一些app,重启后app没了,还有公司的一些Android手机,原来是没问题的,不知道哪天起,只要重启,新安装的软件就会没了,很神奇。后来发现,在安装app后可以执行。命令可以强制将所有缓冲数据立即写入磁盘,以确保数据的持久性和一致性。
2024-04-12 09:38:14
1376
sokit-1.3-win32-chs(中文版)
2023-02-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人