Android面试标准化开发库Jetpack简单介绍
Jetpack的构成
如图所见,Jetpack的构成分为四大部分:Architecture,Foundation,Behavior,UI
Architecture主要包括:
- Date Binding
- Lifecycles
- LiveData
- Navigation
- Paging
- Room
- ViewModel
- WorkManager
DataBinding
DataBinding解决了视图调用的一致性问题。
通过在布局中和可观察的数据进行绑定,在绑定的被观察的数据内容set之后,通知控件更新数据内容。
Lifecycles是什么 ?
Lifecycles主要解决生命周期管理的一致性问题。之前生命周期管理全部依赖手工维持,例如GpsManager需要在每个用到的Activity页面进行激活,解绑和叫停,Activity页面多了很容易引发问题。
Lifecycles通过模板方法和观察者模式,将生命周期管理的复杂操作,全部在LifeCycleOwner的基类中(例如视图控制器Activity的基类)进行封装,省去了开发者手工编写的麻烦。开发者可以直接在子类中调用getLifecycle().addObserver(GpsManager.getInstance())实现对于LIfeCycleOwner生命周期的感知。
LiveData是什么?
LiveData遵循唯一可信源分发状态的标准化开发理念,从而使在快速开发过程中 难以追溯,难以排查,不可预期的问题发生的概率降到最小。
唯一可信源是指生命周期独立于视图控制器的数据组件。通常是单例或者ViewModel,ViewModel姑且也算是单例,一种工厂模式实现的伪单例。
Navigation是什么?
Navigation是一个可简化Android导航的库和插件。Navigation可以用来管理Fragment的切换,并且可以通过可视化的方式看到App的交互流程。
Navigation的优点
- 官方标准处理Fragment的切换
- 默认情况下正确处理Fragment的前进和后退
- 为过渡和动画提供标准化资源
- 可实现和处理深层链接
- 可以绑定Toolbar,BottomNavigationView和ActionBar
- SafeArgs(Gradle插件)传递数据时候提供类型安全性
- ViewModel的支持
Paging
帮助开发者一次加载和显示小块数据。按需加载部分数据可减少网络带宽和系统资源的使用。
Room
Room持久性库在SQLite上提供了一个抽象层,帮助开发者更友好、流畅的访问SQLite数据库。
ViewModel
ViewModel的存在,主要为了解决状态管理、页面通信的问题。当视图控制器重建时候,对于轻量的状态,可以通过视图控制器基类的onSaveInstanceState通过序列化的方式完成存储和恢复。但是对于重量级的状态,例如网络请求返回的数据集合,可以通过生命周期比视图控制器长的ViewModel进行存储,从而得以直接从ViewModel恢复,而是不效率较低的序列化的方式。
WorkManager
即使应用程序退出或设备重新启动,也可以轻松地调度预期将要运行的可延迟异步任务。
Foundation主要包括:
- AppCompat
- Android KTX
- Multidex
- Test
AppCompat
提供了一系列以AppCompat开头的API,以便兼容低版本的Android开发。
Android KTX
Android KTX 是 Google 开源的一款旨在让 Android 上的 Kotlin 代码更简洁的扩展程序, 进而提高开发效率和使用体验。
使用实例:
1、字符串转URI
// Kotlin
val uri = Uri.parse(uriString)
// android KTX
val uri = uriString.toUri()
2、SharedPreferences
// kotlin
sharedPreferences.edit()
.putBoolean("key", value)
.apply()
// KTX
sharedPreferences.edit {
putBoolean("key", value)
}
3、View的preDraw监听
// kotlin
view.viewTreeObserver.addOnPreDrawListener(
object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
viewTreeObserver.removeOnPreDrawListener(this)
actionToBeTriggered()
return true
}
})
// KTX
view.doOnPreDraw {
actionToBeTriggered()
}
Multidex(Android5.0推出)
使用原因:在Android中一个Dex文件最多存储65536个方法,也就是一个short类型的范围。但随着应用方法数量的不断增加,当Dex文件突破65536方法数量时,打包时就会抛出异常,所以引入Multidex。
- 打包时,把一个应用分成多个dex,例:classes.dex、classes2.dex、classes3.dex…,加载的时候把这些dex都追加到DexPathList对应的数组中,这样就解决了方法数的限制。
- Andorid 5.0之后,ART虚拟机天然支持MultiDex。
- Andorid 5.0之前,系统只加载一个主dex,其它的dex采用MultiDex手段来加载。
使用方法:
1、minSdkVersion 为 21 或更高值
android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 26
multiDexEnabled true
}
...
}
2、minSdkVersion 为 20 或更低值
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 26
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.3'
}
定义Application代码相关(两种方法)
// 继承 MultiDexApplication
public class MyApplication extends MultiDexApplication { ... }
// 或者 在Application中添加 MultiDex.install(this);
public class MyApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
Test
用于单元和运行时界面测试的 Android 测试框架。
Behavior主要包括:
- DownloadManager
- Media&Playback
- Permissions
- Notifications
- Sharing
- Slices
DownloadManager
可处理长时间运行的HTTP下载,并在出现故障或在连接更改和系统重新启动后重试下载。
Media&Playback
用于媒体播放和路由(包括 Google Cast)的向后兼容 API。
Permissions
用于检查和请求应用权限的兼容性 API。
Notifications
提供向后兼容的通知 API,支持 Wear 和 Auto。
Sharing
提供适合应用操作栏的共享操作。
Slices
创建可在应用外部显示应用数据的灵活界面元素。
Slices是 Google Assistant 的延伸,谷歌希望使用者能过快速到达App里面的某个特点功能,举一例子就是,你对Google Assistant说你要回家,那么以前可能只会出现滴滴,Uber的选项,但是引进Slices之后会显示更加详细的数据列表,比如滴滴item下会出现到家多少距离,多少钱,是否立即打车等等。
UI主要包括:
- Animation&Transitation
- Auto,TV&Wear
- Emoji
- Fragment
- Layout
- Palette
Palette
Palette类似于调色板工具,根据传入的bitmap,提取出主体颜色,使得图片和颜色更加搭配,界面更协调。
Palette可以提取的颜色有如下几个:
- Vibrant (有活力的)
- Vibrant dark(有活力的 暗色)
- Vibrant light(有活力的 亮色)
- Muted (柔和的)
- Muted dark(柔和的 暗色)
- Muted light(柔和的 亮色)
创建Palette对象有四个方法,需要传入Bitmap对象,下面头两个是同步方法,后两个是异步方法
- generate(Bitmap bitmap)
- generate(Bitmap bitmap, int numColors)
- generateAsync(Bitmap bitmap, PaletteAsyncListener listener)
- generateAsync(Bitmap bitmap, int numColors, final PaletteAsyncListener listener)
得到Palette对象后,可以取到6个颜色对应的Swatch对象
- Palette.getVibrantSwatch()
- Palette.getDarkVibrantSwatch()
- Palette.getLightVibrantSwatch()
- Palette.getMutedSwatch()
- Palette.getDarkMutedSwatch()
- Palette.getLightMutedSwatch()
Swatch对象是Palette的一个内部类,对应有一下几个方法取得颜色值
- getPopulation(): 样本中的像素数量
- getRgb(): 颜色的RBG值
- getHsl(): 颜色的HSL值
- getBodyTextColor(): 主体文字的颜色值
- getTitleTextColor(): 标题文字的颜色值
本文地址:https://blog.csdn.net/nsacer/article/details/108528123