温习Android基础知识——《第一行代码(第三版)》读书笔记 Chapter 14 高级技巧
第十四章:继续进阶,你还应该掌握的高级技巧
由于本章多为用法,我只总结了一些理论知识——各个组件的用途
目录
全局获取Context的技巧
Android为我们提供了一个Application类,每当应用程序启动的时候,系统就会自动将该类初始化,我们就可以定制自己的Application类,以便于管理程序内一些全局的状态信息,如Context
class MyApplication : Application(){
companion object{
lateinit var context : Context
}
override fun onCreate(){
super.onCreate()
context = applicationContext
}
}
注意,一般来说是不能将Context设置成静态变量的,这会导致Activity无法正常销毁,从而引起内存泄漏。但这里我们获取的不是Activity或Service中的Context,而是Application中的Context,它全局只会存在一份实例,而且在整个应用程序的生命周期内都不会被回收,因此不存在内存泄漏的风险。
使用Intent传递对象
Serializable 序列化
Serializable 表示将一个对象转换成可存储或可传输的状态,实现起来很简单,只需让传递的类实现Serializable接口即可。
Serializable的工作原理是将一个对象序列化为可存储或可传输的状态,传递给另外一个Activity后再将其反序列化成一个新的对象。
注意,这里对象只是存储数据相同,实际上并不是同一个对象。
特点:实现简单,但由于会对整个对象序列化,效率较差
Parcelable 包裹化
Parcelable的实现原理是将完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型。
即,将要保存的对象拆解,到目的地后再组装起来。
要点是读取顺序要和写出顺序保持一致。
在Kotlin中,如果传递的数据都封装在对象的主构造函数中,还可以直接使用@Parcelable注解,而不再一一实现方法。
特点:实现较为复杂,但效率较高
定制自己的Log
设置一个单例类,对Log进行封装,设置level变量,控制该变量以达到阻止日志打印的目的
调试Android程序
传统调试——添加断点
使用Attach Debugger to Android Process
正常运行程序,进行到要开始调试的位置,点击按钮,选择进程调试
深色模式
深色模式既可以让用户眼部在夜间使用时更加舒适,还可以剑神电量消耗,延长手机续航。
ForceDark
通过指定styles中的android:forceDarkAllowed属性为true实现深色模式,简单粗暴,效果不好
DayNight主题
通过指定styles中parent的属性为DayNight模式,以达到深浅模式自动转换的功能。简单粗暴,效果一般。
主题差异性编程
针对整个APP手动适配,效率很低,效果很好。
建议:
应该坚持颜色硬编码,更多的使用根据当前主题能够自动切换颜色的主题属性。
判断当前是否是深色主题
fun isDarkTheme(context :Context) : Boolean{
val flag = context.resources.configuration.uiMode and
Configuration.UI_MODE_NIGHT_MASK
return flag == Configuration.UI_MODE_NIGHT_YES
}
本文地址:https://blog.csdn.net/qq_45254908/article/details/107572202