自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(177)
  • 收藏
  • 关注

原创 Android 分区存储

在 Android 11(API 30)及更高的版本中,如果申请了 MANAGE_EXTERNAL_STORAGE 权限,通常不需要再显示申请 WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE 权限,因为 MANAGE_EXTERNAL_STORAGE 权限已经允许应用全面的访问共享存储空间(包括读写权限)。从 Android 10 开始,对共享存储的读写权限变得更加严格,开发者可以选择是否使用分区存储,Android 11 中强制使用了分区存储。

2024-07-02 14:25:26 1351 1

原创 算法题 — 接雨水

输入:height = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]输出:6解释:上面是由数组 [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1] 表示的高度图,在这种情况袭,可以接住 6 个单位雨水(蓝色部分表示雨水)。

2024-06-28 17:05:13 584

原创 Apk 加固

apk 加固是一种通过技术手段增强 apk 安全性的过程,旨在防止应用程序被反编译、篡改或盗取用户敏感信息。加固 apk 的主要方法包括静态加固和动态加固:除了上述技术手段,apk 加固还包括使用数字签名来保证应用程序的完整性和真实性,防止未经授权的人发布修改后的 apk 文件。此外还有一些专业的加固平台和工具,如腾讯云的微加固、App 加固和安全管家等,提供了一站式应用安全加固服务,包括代码加密、资源混淆、反调试等功能,帮助开发者提升应用程序的安全性。apk 加固

2024-06-25 17:35:43 428

原创 Kotlin 中该如何安全地处理可空类型?

直接通过 if 判断。

2024-06-25 10:07:39 437

原创 Kotlin 中的数据类型有隐式转换吗?

【代码】Kotlin 中的数据类型有隐式转换吗?

2024-06-25 10:06:24 593

原创 Kotlin 中的解构

这里需要注意的是,不能定义无限数量的 componetN 函数,标准库只允许使用此语法来访问一个对象的前 5 个元素。要在解构声明中初始化每个变量,将调用名为 componentN 的函数,其中,N 是声明中变量的位置。在 Kotlin 中,解构可以用于多种数据类型,例如,列表(List)、数组(Array)、对象等。下面是 Kotlin 解构的一些示例。

2024-06-24 10:42:00 731

原创 Kotlin 中的可见修饰符

Java 和 Kotlin 中的可见修饰符:比较:

2024-06-21 16:00:27 303

原创 Kotlin 中的 infix 关键字(中缀函数)

也就是说,has 函数和 contains 函数的功能世纪上是一摸一样的,只是它多了一个 infix 关键字,从而拥有了 infix 函数的语法糖功能。但是 infix 函数允许我们将函数调用的小数点、括号等计算机相关的语法去掉,从而使用一种更接近英语的语法来编写程序,使得代码看起来更具有可读性。也就是说, A to B 这样的语法结构实际上得到是一个包含 A、B 数据的 Pair 对象,而 mapOf 函数实际上接收的正式一个 Pair 类型的可变参数列表,这样我们就将这种神奇的语法结构完全解密了。

2024-06-21 15:31:21 987

原创 Kotlin 中的内联函数

内联函数:消除 Lambda 带来的运行时开销。举例来说:在上面的代码中调用了 num1AndNum2() 函数,并通过 Lambda 表达式指定对传入的两个整型参数进行求和。这段代码在 Kotlin 中非常好理解,因为这是高阶函数最基本的用法。但是,Kotlin 代码最终还是要编译成 Java 字节码的,但是 Java 中没有高阶函数的概念。将上述的 Kotlin 代码转换成 Java 代码:在注释 1 中可以看到 num1AndNum2 函数的第三个参数变成了一个 Function2 接口,这是一种

2024-06-21 10:54:53 1341

原创 算法题 — 可可喜欢吃香蕉(二分查找法)

每个小时,可可都会选择一堆香蕉,并吃掉 speed 根。如果这堆香蕉少于 K 根,可可就会吃掉这堆里所有的香蕉,然后,在这一小时内不会吃更多的香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。输入:piles = [30, 11, 23, 4, 20],h = 5,输出:30。输入:piles = [30, 11, 23, 4, 20],h = 6,输出:23。输入:piles = [3, 6, 7, 11],h = 8,输出:4。可可想要在警卫回来之前吃掉所有的香蕉。

2024-06-07 17:14:34 256

原创 算法题 — 二分查找高效判定子序列

用指针 i,j 分别指向数组 s,t,一个个的匹配子序列。时间复杂度为 O(N)。

2024-05-27 15:54:51 407

原创 算法题 — 合并两个有序数组

初始化 nums1 和 nums2 的元素数量分别为 m 和 n。假设 nums1 的空间大小等于 m + n,这样它就能有足够的空间保存来自 nums2 的元素。两个有数整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

2024-05-24 17:53:36 466

原创 抽象类和接口的区别

继承性:一个类只能单继承;但是一个类可以实现多个接口;访问修饰符,抽象类中的方法可以是私有的,接口中的方法都是公共的;变量:抽象类中的变量可以是任意类型的,接口中的变量只能是 public static final 类型的;静态代码块:抽象类中可以有静态代码块,接口中不能有静态代码块;方法:抽象类中可以有构造方法,用于子类实例化时调用;接口不能有构造方法;抽象类中可以有静态方法,接口中不能有静态方法;抽象类中可以有抽象方法和具体方法,接口只能有抽象方法(默认是 public,不能有访问修饰

2024-05-23 10:48:11 281

原创 算法题 — 子数组最大平均数

给一个整数数组,找出平均数最大且长度为 k 的下标连续的子数组,并输出子数组最大平均数。最大平均数 (12-5-6+50)/4 = 51/4 = 12.75。输入:[1, 12, -5, -6, 50, 3],k = 4。

2024-05-14 14:34:29 202

原创 Activity 的生命周期

从 Activity A 跳转到 Activity B,如果 B 是窗口样式(android:theme=“@style/Theme.AppCompat.Dialog”)

2024-04-18 10:37:30 302 1

原创 Activity 的状态有哪些?

运行状态(Active/Running):一个新的 Activity 启动入栈后,显示在屏幕前端,处于栈的最顶端,此时 Activity 可见并且可以和用户进行交互;暂停状态(Paused):当 Activity 被一个新的非全屏状态的 Activity 或者一个透明的 Activity 覆盖,此时的 Activity 仍然可见,但是已经失去了焦点无法和用户进行交互;停止状态(Stopped):当一个 Activity 被另一个 Activity 完全覆盖,此时的 Activity 不可见,当系统内存

2024-04-17 14:39:14 369 1

原创 Application 能不能启动 Activity

能,但是需要设置 Flag 为 FLAG_ACTIVITY_NEW_TASK,即以栈内单例的模式启动 Activity,startActivity(intent: Intent, FLAG_ACTIVITY_NEW_TASK)。崩溃信息中提到了需要用 FLAG_ACTIVITY_NEW_TASK 的 Flag(SingleTask,栈内单例模式,栈内只有一个 Activity 实例)。从源码中可以看出,如果启动模式不是 Intent.FLAG_ACTIVITY_NEW_TASK 会抛出异常。

2024-04-17 14:37:42 622

原创 算法题 — 环形链表

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达该节点,则链表中存在环。如果链表中存在环,则返回 true,否则,返回 false。给定一个链表,判断链表中是否有环。

2024-04-07 16:20:55 181

原创 算法题 — 排列硬币

总共有 n 枚硬币,将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。n 是一个非负整数,并且在 32 位有符号整型的范围内。给定一个数字 n,找出可形成完整阶梯行的总行数。

2024-04-02 17:18:05 219

原创 Kotlin 中的构造方法

在 Java 中,一个类可以声明一个或多个构造方法。 Kotlin 也是类似的,只是做出了一点修改:区分主构造方法(通常是主要而简洁的初始化类的方法,并且在类体外部声明)和从构造方法(在类体内部声明)。同样也允许在初始化语法块中添加额外的初始化逻辑。声明一个简单的类:通常来讲,类的所有声明都在花括号中。那么,这个类为什么没有花括号,而只是在括号中声明了属性?其中被括号包裹起来的语句块就叫主构造方法。它主要有两个目的:表明构造方法的参数,以及定义使用这些参数初始化的属性。将其转换成 Java 代码:下面是

2024-04-01 17:06:31 1513

原创 Kotlin 中的类和构造方法

对象是什么?任何可以描述的事物都可以看作对象。我们以鸟为例,来分析它的组成:对象是由状态和行为组成的,我们可以通过它描述一个事物。 下面就是用 Kotlin 来抽象一个 Bird 类:在 Kotlin 中我们仍然可以使用熟悉的 class 结构体来声明一个类。但是,Kotlin 中的类和 Java 中的类也有很多不同,将 Kotlin 代码反编译成 Java 版本:可以看出主要存在以下不同:下面我们继续来看看 Kotlin 和 Java 中接口的差异。以下是 Java 8 版本的接口:Java 8 引

2024-03-27 17:35:04 1310

原创 Kotlin 中的惰性集合(序列)

这是因为 Java 8 的流和 Kotlin 中的序列一样,也是惰性求值的,这就意味着 Java 8 的流也是存在中间操作和末端操作的,所以必须通过上面的一系列转换才行。而序列不一样,序列在执行链式操作时,会将所有的操作都引用在一个元素上,也就是说,第 1 个元素执行完所有的操作之后,第 2 个元素在去执行所有的操作,以此类推。我们知道序列是惰性求值的,所以上面创建的序列是不会把所有的自然数都列举出来的,只有在我们调用一个末端操作的时候,才去列举我们所需要的列表。数列,比如自然数数列就是一个无限的数列。

2024-03-22 16:19:49 1024

原创 算法题 — 斐波那契数列

斐波那契数列:每一位的值等于它前两位数字之和。求取斐波那契数列第 N 位的值。

2024-03-21 17:04:32 239

原创 Java 中的 void 和 Kotlin 的 Unit

Java 在语言层设计一个 Void 类。java.lang.Void 类类似于 java.lang.Integer,Integer 是为了对基本类型 int 的实例进行装箱操作。Void 的设计则是为了对应 void。由于 void 表示没有返回值,所以,Void 并不能具有实例,它继承自 Object。

2024-03-19 11:23:56 1437

原创 算法题 — 两数之和(有序数组)

给定一个生序排序的整数数组 numbers,从数组中找出两个数满足相加之和等于目标数 target。假设每个输入只对应唯一的答案,而且不可以重复使用相同的元素。返回两数的下标值,以数组的形式返回。

2024-03-18 17:27:42 359

原创 算法题 — 两数之和(无序数组)

给定一个整数数组 numbers,从数组中找出两个数满足相加之和等于目标数 target。假设每个输入只对应唯一的答案,而且不可以重复使用相同的元素。返回两数的下标值,以数组的形式返回。

2024-03-11 14:18:17 406

原创 Kotlin 中的数据类

数据类必须拥有一个构造方法,该方法至少包含一个参数,一个没有数据的数据类是没有任何用处的;与普通的类不同,数据类构造方法的参数强制使用 val 或者 var 进行声明;data class 之前不能用 abstract、open、sealed 或者 inner 进行修饰;Kotlin 1.1 之前的版本,数据类只允许实现接口,之后的版本既可以实现接口也可以继承类;

2024-03-06 15:44:01 745

原创 算法题 — 三个数的最大乘机

整型数组 nums,在数组中找出由三个数字组成的最大乘机,并输出这个乘积。

2024-03-04 09:59:10 571

原创 算法题 — x 的平方根,二分查找、牛顿迭代

在不使用 sqrt(x) 函数的情况下,得到 x 的平方根的整数部分。重点考察:二分法、牛顿迭代。

2024-02-26 16:19:52 467

原创 Kotlin 中 List 和 MutableList 的区别

【代码】Kotlin 中 List 和 MutableList 的区别。

2024-02-22 15:51:58 1318

原创 Kotlin 中注解 @JvmOverloads 的作用

JvmOverloads 注解的作用就是:在有默认参数值的方法加上 @JvmOverloads 注解,则 Kotlin 就会暴露多个重载方法。例如,没有加注解,默认参数没有起到任何作用。

2024-02-22 10:29:59 865

原创 算法题 —— 素数个数统计

素数:只能被 1 和自身整除的自然数,0、1 除外。统计 n 以内的素数个数。输入:100,输出:25。

2024-02-19 10:46:00 418

原创 Android 中的卡顿优化

市面上绝大多数的 Android 设备的屏幕刷新率是 60Hz,也就是大概 16ms 刷新一次屏幕,假如花了 24ms 来绘制这一帧,就会出现掉帧的现象,在用户看来就是界面不流畅,卡顿。UI线程阻塞:UI线程是主线程,很多性能卡顿的问题是由于我们在主线程中做了大量的耗时操作引起的,比如 IO 操作、网络请求、SQL 操作、列表刷新等。数据处理不当:当处理大量数据时,未使用合适的数据结构和算法,或将耗时的数据处理操作放在主线程中,会导致应用卡顿;卡顿的本质原因是错过了展示的时间。

2024-02-01 14:50:00 682

原创 算法题 — 链表反转

将单链表的链接顺序反转过来使用两种方式解题。

2024-01-26 14:06:41 1216

原创 算法题 — 寻找数组的中心下标

给定一个整数数组 nums,请编写一个能够返回数组“中心下标”的方法。注意:中心下标可能出现数组的两端。

2024-01-26 12:12:37 434

原创 算法题 — 删除排序数组中的重复项

nums[j],i 就继续递增,之后把 nums[j] 赋值给 nums[i](注意,此时的 i 是递增后的 i)。如果 nums[i] = num[j],j 就继续递增以跳过重复项。= nums[j]。注:不能使用额外的数组空间,必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。,原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。有序数组可以放两个指针 i 和 j,其中,i 是慢指针,j 是快指针。输入:[0, 1, 2, 2, 3, 3, 4]

2024-01-26 10:18:54 427

原创 Android 渲染机制

理想的情况是帧率(GPU)和刷新频率(屏幕)相等,每绘制一帧,屏幕就显示一帧。View tree 生成的最后一步就是把根节点送到 ViewRootImpl#setView 中,之后就会进入渲染流程,入口方法是 ViewRootImpl#requestLayout,之后是 ViewRootImpl#scheduleTraversals,最后调用的是 ViewRootImpl#performTraversals,View tree 的渲染流程全都在这里,也就是常说的 measure、layout、draw。

2024-01-23 11:05:32 2168

原创 APK 瘦身

APK 瘦身的主要原因是考虑应用的下载转化率和留存率,应用太大了,用户可能就不下载了。再者,因为手机空间问题,用户有可能会卸载一些占用空间比较大的应用,所以,应用的大小也会影响留存率。

2024-01-04 10:11:26 958

原创 Instrumentation 是什么?和 ActivityThread 是什么关系?

Instrumentation 可以理解为应用进程管家,ActivityThread 要执行创建或暂停某个 Activity 的操作时,都需要通过 Instrumentation 来进行具体的操作,即回调 Activity 的生命周期。每一个应用程序只有一个 Instrumentation 对象,每个 Activity 内部都持有该对象的引用。

2023-11-24 15:38:49 355

原创 为什么 Intent 不能传递大数据

Intent 携带信息的大小受 Binder 限制。数据以 Parcel 对象的形式存放在 Binder 传递缓存中。Binder 传递缓存有个限定的大小,通常是 1Mb。但同一个进程中所有的传输共享缓存空间,多个地方在进行传输时,即使它们各自传说的数据不超过大小显示。TrasnsactionTooLargeException 异常也可能会被抛出。因此,在使用 Intent 传递数据时,1Mb 并不是安全上限。因为 Binder 中可能正在处理其他的传输工作。不同的机型和系统版本,这个上限值也可能会不同。

2023-11-17 15:05:06 580

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除