暂时未有相关云产品技术能力~
暂无个人介绍
一、概念 单例模式是运用最广泛的设计模式之一,在应用这个模式时,单例模式的类必须保证只有一个实例存在。多用于整个程序只需要有一个实例,通常很消耗资源的类,比如线程池,缓存,网络请求,IO操作,访问数据库等。由于类比较耗资源,所以没必要让它构造多个实例,这种就是单例模式比较好的使用场景。
介绍 之前一直使用IMEI作为唯一标识符,缺点就是需要权限: Android 10以前,需要READ_PHONE_STATE权限 Android 10限制,需要READ_PRIVILEGED_PHONE_STATE权限 国内因为各大应用获取权限过多,所以对这里不是很重视,但是如果需要发布到国外如 Google Play 等。那么这些权限将给你带来麻烦,他们对隐私很看重,有些人不在乎,但是有一部分人看到你获取这么敏感的权限会直接卸载,更严重的他们会直接举报。所以权限方面如果发布国外就需要注意了。 那么我们能不能在不使用权限的情况下获取到设备的唯一标识符?
一、概述 1.1 描述 上文介绍到了SQLite Api,今天咱们介绍一下 Room ( Android Jetpack 重要成员之一 )。 Room 持久性库在 SQLite 之上提供了一个抽象层,以允许流畅的数据库访问,同时利用 SQLite 的全部功能。特别是,Room 提供以下好处: SQL 查询的编译时验证。 方便的注释,最大限度地减少重复和容易出错的样板代码。 简化的数据库迁移路径。 由于这些考虑,我们强烈建议您使用 Room 而不是直接使用 SQLite API。
一、DataStore 介绍 DataStore 是 Android Jetpack 中的一个组件,它是一个数据存储的解决方案,跟 SharedPreferences 一样,采用key-value形式存储。 DataStore 保证原子性,一致性,隔离性,持久性。尤其是,它解决了 SharedPreferences API 的设计缺陷。 Jetpack DataStore 是经过改进的新版数据存储解决方案,旨在取代 SharedPreferences,让应用能够以异步、事务方式存储数据。
一、SharedPreferences 不同于文件的存储方式,如果要保存的键值集合相对较小,则应使用SharedReferences API。SharedReferences对象指向一个包含键值对的文件,并提供简单的读写方法。 本文从SharedReferences开始逐步引入Preference、MMKV。
一、回顾 2021 二、展望2022
一、数据存储概念 Android系统提供了提供了多种保存应用数据的选项: 文件存储: 应用程序专属文件存储: 内部存储(保存其他应用不应访问的敏感信息) 共享文件存储:存储你的应用打算与其他应用共享的文件,包括媒体、文档和其他文件。 Preferences:默认情况下,Preferences 使用 SharedPreferences 来保存值。 数据库:使用 Room 持久性库将结构化数据存储在私有数据库中。 瞬时数据:是指那些存储在内存当中,有可能会因为程序关闭或其他原因导致内存被回收而丢失的数据。
一、HashMap的诞生 1.1 数组 数组:一片物理上连续的大小确定的储存空间。 好处:根据下标快速的查找和修改里面的内容。 缺点:大小确定,无法修改。添加新的元素或者删除元素比较麻烦。
2个月的时间总算把 Kotlin 的基础知识写完了,下面咱们看看具体内容:
一、Kotlin调用Java 1.1 互操作性与可空性 1.2 类型映射 1.3 属性访问 二、Java调用Kotlin 2.1 @JvmName 2.2 @JvmField 2.3 @JvmStatic 2.4 @JvmOverloads 2.4.1 未使用@JvmOverloads注解 2.4.2 使用@JvmOverloads注解 2.5 @Throws 2.6 函数类型操作
一、函数式编程概念 1.1 面向函数编程(FOP) 在函数式编程(FP)中,一切皆是函数。FP是关于不变性和函数组合的一种编程范式。 函数式语言提倡在有限的几种关键数据结构(如list、set、map)上,运用函数的组合(高阶函数)操作,自底向上地来构建世界。Kotlin支持多种编程范式,所以你可以混用面向对象编程和函数式编程范式来解决手头的问题。
一、介绍 Kotlin 可以对一个类的属性和函数进行扩展,且不需要继承或使用 Decorator 模式。 扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响。
一、泛型使用 泛型,即 "参数化类型",将类型参数化,可以用在类,接口,函数上。 与 Java 一样,Kotlin 也提供泛型,为类型安全提供保证,消除类型强转的烦恼。
标准函数 标准函数是指Standard.kt文件中定义的函数,任何Kotlin代码都可以自由的调用所有标准函数,标准函数有很多我们这里主要学习下几个常用的标准函数。
前言 toByte():字节():字节 toShort(): 短():短 toInt(): 整数():整数 toLong(): 长():长 toFloat(): 浮动():浮动 toDouble(): 双倍():双 toChar(): 字符():字符
一、集合 Kotlin中的集合用于在一个单元中存储一组相关对象。通过使用集合,可以存储,检索操作和聚合数据,也可以作为值参传给函数。 Kotlin中大致分为两种不同集合的形式。它们是: 只读集合(不变) 可变集合
在Java中,定义一个变量可以默认不赋值,因为Java的系统会给我们默认赋一个默认值,并且Java可定义一个赋值为null的变量,这样在使用这个变量的时候都会去显示判断该变量是否为null。这使得在Java中我们司空见惯的空指针异常NullPointerException,带给了我们很多麻烦。
五、字符串比较 六、字符串查找 七、字符串验证 八、大杂烩
一、字符串创建 1.1 字符串属性 1.2 字符串函数 二、字符串截取 三、字符串分割 四、字符串替换
目录 一、抽象类 二、嵌套类(内部类) 三、单例类 3.1 object 关键字 3.2 对象声明 3.3 对象表达式 3.4 伴生对象 四、接口 4.1 接口定义 4.2 默认实现 4.3 小结
三、数据类 3.1 创建数据类 3.2 toString、equals和hashCode的个性化实现 3.3 ==符号 3.4 copy() 函数 3.5 解构声明 四、 继承(extend) 4.1 Any 超类 4.2 继承类 4.3 函数重写 4.4 属性重写 4.5 类型检测(is)
目录 一、枚举类 1.1 创建枚举类 1.2 获取枚举相关信息 1.3 枚举类添加属性 1.4 定义函数 1.5 以泛型的方式访问枚举类中的常量 1.6 代数数据类型(ADT) 二、密封类(sealed class) 2.1 创建密封类 2.2 使用
1.1 前言 Kotlin 是一门面向对象的开发语言。也有着面向对象语言的特性。而面向对象的三大特性即封装、继承、多态,这是每一门面向对象语言都具有的特性。
函数 函数(function)和方法(method)这两个概念经常被混淆,他们到底有什么关联和区别?其实,它俩没有什么区别只是不同语言叫法不一样,在Java中普遍叫方法。而在Kotlin中普遍叫函数。重点是:函数(function)和方法(method)是同一个东西,别搞错了。
目录 函数 函数头 实践 函数参数 实践 Unit函数 Nothing类型 实践 反引号中的函数名 使用空格和特殊字符对函数命名 实践 Kotlin和Java互操作
程序的逻辑控制 程序的执行语句主要分为三种: 顺序语句:一条接着一条顺序执行下去,程序代码默认就是顺序语句。 条件语句:if 和 when 循环语句:for循环 和 while循环
变量 var 关键字 val 关键字 内置数据类型(常用) Kotlin的引用类型 类型推断 延迟初始化lateinit 使用lateinit关键字 添加islnitialized检查 惰性初始化by lazy 正常执行 String 模板 自动补全(输出)
目录 Andorid Studio 运行 main 函数报错: Gradle构建问题 New Project问题 运行成功 IntelliJ IDEA 其他问题 kotlin-gradle-plugin Failed to find Build Tools revision 31.0.0 解决方案1:移除buildToolsVersion版本 解决方案2:降低buildToolsVersion
为什么要打牢基础,再实战? Kotlin 反编译 Java 控件 Kotlin Java 变量 Kotlin Java 关联控件和点击事件 Kotlin Java 函数 Kotlin Java
TCP的三次握手四次挥手 TCP的三次握手和四次挥手不管是我们自己使用还是面试都是需要掌握的,本文先将原理,然后以三国为例讲个小栗子帮助理解。
本文介绍了组件化、组件分层、解决了组件的独立调试、集成调试、页面跳转、组件通信等。 其实会了这些后你基本可以搭建自己的组件化项目了。其实最大的问题还是分组分层、组件划分。这个就需要根据你的实际情况来设置。
目录 一、组件化 1.1 为什么使用组件化 1.2 模块化与组件化 1.2.1 模块 1.2.2 组件 1.3 组件化的优势 1.4 组件化需要解决的问题 二、组件分层 2.1 基础组件 2.2 common组件(lib_common) 2.3 功能组件 2.4 业务组件 2.5 主工程(app) 2.6 完成后项目 三、组件单独调试 3.1 创建组件(收藏) 3.2 动态配置组件的工程类型 3.2.1 build.gradle(module) 3.2.2 设置gradle.properties 3.2.3 动态配制插件(build.gradle)
前言 泛化:可以用T代表任意类型,所以许多重要的类,比如集合框架,都已经成为泛型化的了,这带来了很多好处。 类型安全:使用泛型可以使编译器知道变量的类型限制,进而可以在更高程度上验证类型假设。如果不用泛型,则必须使用强制类型转换,而强制类型转换不安全,在运行期可能发生ClassCast Exception异常,如果使用泛型,则会在编译期就能发现该错误。 消除强制类型转换:泛型可以消除源代码中的许多强制类型转换,这样可以使代码更加可读,并减少出错的机会。
🔥 为什么学 Kotlin Java用的挺好,为什么要学Kotlin?这是我之前的想法,但是越往后,这个想法慢慢的变淡。为什么?往下看,楸~
🔥 介绍 本文通过OkHttp+Retrofit+Rxjava+Hilt实现一个网络请求框。
🔥 应用场景 🔥 源码 💥 Toast.setGravity() 💥 Toast.isSystemRenderedTextToast() 🔥 Toast 提供的方法 💥 Toast.setView() 源码 🔥 Snackbar 💥 代码实现 💥 效果 💥 工具类
🔥 低版本适配 💥 SplashScreen 库 💥 使用 SplashScreen 库 🌀 导入库 🌀 设置主题 🌀 设置AndroidManifest.xml 🌀 Activity 中设置 SplashScreen 🌀 运行效果 🌀 小结 🔥 Android 5.0 - Android 12的兼容 💥 不进行处理,Android12 默认启动短暂的启动画面。 💥 在使用 SplashScreen 库的基础上修改 🌀 主题修改 🌀 Activity修改 运行效果
🔥 Android 12 新功能-启动画面 Android 12 添加了 SplashScreen API ,它可为所有应用启用新的应用启动动画。应用可以通过多种方式来定制启动画面,以彰显其独有的品牌个性。 这包括启动时的进入应用运动、显示应用图标的启动画面,以及向应用本身的过渡。 默认情况下,使用启动图标。
目录 💥 判断是否为空 变量.null+Enter 💥 判断是否非空 变量.notnull+Enter 变量.nn+Enter(简单版) 💥 本身for循环 变量.for+Enter 💥 变量for循环 变量.fori+Enter 💥 变量倒序for循环 变量.forr+Enter 💥 加括号 变量.arg+Enter 💥 if判断 判断语句.if+Enter 💥 快速定义变量 变量.var+Enter
🔥 AIDL AIDL 全称 Android Interface Definition Language (Android 接口定义语言),允许你定义客户端和服务都同意的编程接口,以便使用进程间通信 (IPC) 相互通信。在Android上,一个进程不能正常访问另一个进程的内存,因此 Android 使用 AIDL 为你处理。
🔥 什么是序列化 由于存在于内存中的对象都是暂时的,无法长期驻存,为了把对象的状态保持下来,这时需要把对象写入到磁盘或者其他介质中,这个过程就叫做序列化。 🔥 为什么序列化 永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中)。 对象在网络中传递。 对象在IPC间传递。
🔥 绑定服务(Bound Services)概述 绑定服务是client-server接口中的服务器。它允许组件(例如活动)绑定到服务、发送请求、接收响应和执行进程间通信(IPC)。 绑定服务通常仅在它为另一个应用程序组件提供服务时才存在,并且不会无限期地在后台运行。
问题描述: Manifest合并失败:当组件定义了 < intent-filter> 时,针对 Android 12 及更高版本的应用需要为 "android:exported" 指定显式值(android:exported="true")。 以前加上intent-filter的话,exported就默认是true。Android 12之后开始强制大家声明exported属性。
之前了解到进程与多进程,涉及多进程不可避免的遇到了进程间通信,说到进程间通信,Binder 成了一道绕不过的坎。接下来咱们逐一了解。
Android 12 高斯模糊 新功能:更易用的模糊、彩色滤镜等特效 。 新的 API 让你能更轻松地将常见图形效果应用到视图和渲染结构上。 使用 RenderEffect 将模糊、色彩滤镜等效果应用于 RenderNode 或 View。 使用新的 Window.setBackgroundBlurRadius() API 为窗口背景创建雾面玻璃效果, 使用 blurBehindRadius 来模糊窗口后面的所有内容。 咱们一个一个玩。
Android的布局管理器本身就是个UI组件,所有的布局管理器都是ViewGroup的子类,而ViewGroup是View的子类,所以布局管理器可以当成普通的UI组件使用,也可以作为容器类使用,可以调用多个重载addView()向布局管理器中添加组件,并且布局管理器可以互相嵌套,当然不推荐过多的嵌套 (如果要兼容低端机型,最好不要超过5层)。
背景 用户希望应用能够快速打开。启动时间过长的应用不能满足这个期望,并且可能会令用户失望。轻则鄙视你,重则直接卸载你的应用。 用户不会在乎你的项目是不是过大,里面是不是有很多初始化的逻辑。他只在乎你-慢了。 所以咱们这篇文章有两个目的: 启动速度提升(用户眼中的大神就是你) 优化代码逻辑和规范(别让自己成为继任者中的XX) 今天咱们就来了解一下应用启动内部机制和启动速度优化。
小结 实现Callable和实现Runnable类似,但是功能更强大,具体表现在: • 可以在任务结束后提供一个返回值,Runnable不行。 • call方法可以抛出异常,Runnable的run方法不行。 • 可以通过运行Callable得到的Fulture对象监听目标线程调用call方法的结果,得到返回值,(fulture.get(),调用后会阻塞,直到获取到返回值)。
1、概念 1.1 进程 1.2 线程 1.3 进程和线程的区别 2、Android中的进程 2.1 进程 2.2 进程的等级(生命周期) 2.2.1 前台进程(Foreground process) 2.2.2 可见进程(Visible process) 2.2.3 服务进程(Service process) 2.2.4 缓存进程(Cached process) 2.3 多进程 2.3.1 多进程产生多个Application 2.4 进程间通信
9、ActivityTaskSupervisor.class 9.1 startSpecificActivity() 9.2 进程已启动 9.2.1 realStartActivityLocked() 9.2.2 ClientLifecycleManager.scheduleTransaction() 9.2.3 ClientTransaction.schedule() 9.2.4 ApplicationThread.scheduleTransaction() 9.2.5 ClientTransactionHandler.scheduleTransaction()