温习Android基础知识——《第一行代码(第三版)》读书笔记 Chapter 14 高级技巧

第十四章:继续进阶,你还应该掌握的高级技巧

由于本章多为用法,我只总结了一些理论知识——各个组件的用途

目录

  • 第十四章:继续进阶,你还应该掌握的高级技巧
    • 全局获取Context的技巧
    • 使用Intent传递对象
      • Serializable 序列化
      • Parcelable 包裹化
    • 定制自己的Log
    • 调试Android程序
      • 传统调试——添加断点
      • 使用Attach Debugger to Android Process
    • 深色模式
      • ForceDark
      • DayNight主题
      • 主题差异性编程
      • 建议:
      • 判断当前是否是深色主题

全局获取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
}

你可能感兴趣的:(安卓基础知识,android,安卓)