【Android】“你好,世界”的混凝土
唤醒颜值🎆
初恋配置💗
- 迁移至Jetpack和AndroidX
- 开启MultiDex
vectorDrawables.useSupportLibrary = true- Timber日志工具 V.S. Logcat
- debug-db调试工具 V.S. App Inspection
- 基类封装
即,创建一个普通的BaseActivity类,并将其定为所有活动类的父类
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Timber.tag("BaseAcitivity").d(this.getClass().getSimpleName());
}
}
视图注入🔘
https://developer.android.com/topic/libraries/data-binding?hl=zh-cn
写findViewById(xxx)写得头大?类型强转?空指针?布局太多,记不住id?
不如试试ActivityXBinding.xxx。
约束布局🆓
线性布局虽然可以用来设计优雅规整、基于权重的适应性界面,但是,构建渲染层次过于复杂的布局结构会导致系统加载缓慢。
约束布局:基准(Baseline)、重心偏移(Bias)、比率(Ratio)、连锁(Chain)。
命名空间🫥
XML代码区有一处常常因为开发工具自动补全而被忽视的细节——命名空间(xmlns, XML Namespaces)。例如,对于同一个属性android:src,当冠以tools命名空间tools:src,则不会委托安卓核心框架编译,仅用于设计预览。
NULL⚠️
on a null object reference 可以说是新手本手最容易犯的错误之一了。尤其是在并发编程的背景下,程序状态就像是“薛定谔的猫”。
所以,在调用对象方法前,请务必判断该对象是否为NULL以及是否为缺省零值。
生命周期观察员♻️
理解并使用生命周期的重要性自不必多言:一方面,动画渲染、后台线程、配置更改、进程终结,甚至不少系统错误、数据异常都与其有关;另一方面,在性能有限的情况下,无论是系统自动还是编程人工,都希望把资源优先掉配给最活跃最紧急的事务。
例如,我们希望某一个APP,在处于前台可见状态时(onStart),统计时长,渲染动画,播放音乐,调用手机摄像头;当APP处于后台不可见状态时(onStop),它便停止计时,停止渲染,停止播放,不再获取摄像头数据。
依赖Activity类回调函数中控制其他对象生命周期的方式,不符合面向对象的编程思想,也会增加出错风险和维护成本。
2017年,谷歌 I/O开发者大会首次提出:Lifecycle类、LifecycleOwner和LifecycleObserver接口。
简单来说,生命周期感知型组件(LifecycleObserver)可以观察Activity或Fragment状态,“自主地”调整行为。这与传统“命令式”的思维模式正好相反,可以降低耦合(Coupling),使OOP变得更加“纯粹”。
View💡Model
配置更改(例如旋转屏幕)时,UI数据可能丢失,是因为界面被系统自动销毁重绘(和销毁整个程序不同),同时,界面类的成员变量也被回收。一个符合直觉的解决方法是,将数据的所有权和界面交互逻辑分离开;如此,系统在回收Activity类中的对数据类的“引用”,并不会影响数据类本身。
软件架构的设计哲学:关注点分离、数据驱动界面、单一数据源和单向数据流。
当ViewModel中存在一个LiveData容器,可以指定当前数据的观察者(Observer),即每当LiveData中存放的数据发生变化时,观察者可以全自动地执行操作,例如,改变UI界面中的数据。相比起定时检测更新和通知,观察者模式,如同一个有主观能动性的血肉之躯,具有强大生命力和无比优越性。甚至,可以设置“双观察者模式”,即ViewModel可以观察Activity的生命周期变化,而Activity可以观察ViewModel中的数据变化。
蒋炎岩:不用讲设计模式,编就对了,你自然而然会需要它们的

浙公网安备 33010602011771号