[转]
由于Android的开源性,在开始的几年呈现出了百家齐放的盛况,层出不穷的API和以及官方的API各自大放异彩,在丰富了android生态的同时也带来了一个很严重的问题,即android 的碎片化和规范化的问题。碎片化主要集中于国内的各大手机厂商的多种屏幕尺寸、多种手机分辨率、多种机型的多样性上,而规范化则是集中于开发生态上面,由于Google官方的弱约束,很多时候大家都随心所欲以业务驱动技术去进行开发,导致没有一个很好的开发整体框架。基于此,Google官方在2018年发布了一系列辅助开发Android开发者的实用工具,合成JetPack。
一、什么是JetPack?
根据官方介绍,JetPack是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种Android版本和设备中一致运行的代码,让开发者可将精力集中于真正重要的编码工作。下面是官方关于Jetpack的描述图
1. 基础组件` `(1) AppCompat:使得支持较低的 Android 版本。从以前继承 Activity 到现在继承AppCompatActivity 就是属于这一部分` `(2) Android KTX:Kotlin 的扩展支持库` `(3) Multidex:多 dex 文件支持` `(4) Test:测试支持库 2. 架构组件` `(1) Data Binding:MVVM 的一种实践` `(2) Lifecycles:管理你的 Activity 和 Fragment 生命周期` `(3) LiveData:通过观察者模式感知数据变化,类比 RxJava` `(4) Navigation:处理 Fragment 导航相关逻辑` `(5) Paging:分页数据加载方案` `(6) Room:官方 ORM 库` `(7) ViewModel:通过数据驱动 V 视图发生改变` `(8) WorkManager:管理后台任务 3. 行为组件` `(1) DownloadManager:管理下载任务` `(2) Media App:多媒体播放和一些向后兼容的API。主要包含 MediaPlayer 和 ExoPlayer` `(3) Notifications:提供向后兼容的通知 API,支持 Wear 和 Auto` `(4) Permissions:权限管理,这个应该都接触过。用于检查和请求应用权限` `(5) Settings:Preference 相关 API。基本每个应用都会用到` `(6) Share Action:提供分享操作。这块在国内使用的不多,都是自己封装或者采用第三方方案` `(7) Slices:可以让应用通过外部(其他 APP)显示 APP 界面(通过设备自带的搜索,语音助手等) 4. 界面组件` `(1) Animations and Transitions:动画,界面转场等` `(2) Auto:针对车辆的标准化界面和模式` `(3) Emoji:表情符号相关` `(4) Fragment:基础概念` `(5) Layout:基础概念` `(6) Palette-Colors:调色板` `(7) TV:Android TV 开发相关` `(8) Wear:可穿戴设备(目前主要是手表)开发相关
二、JetPack到底值不值得我们去应用?
说实话,这个问题仁者见仁智者见智,因为没有什么东西是绝对的好或者不好,看你自己的需求而定,就像MVC、MVP、MVVM框架一样,没有说哪种模式一定最好,很多时候是要根据实际情况来定。所以,同等道理,Jetpack到底要不要用,怎么用看开发需求,但是对于我们开发者来说,掌握它却是必不可少的,只有完全的掌握它,知道了它的优点和缺点才能更好的做出理性的判断在实际的开发者到底要不要用它。
三、进入正题——Jetpack组件之一Navigation
1.什么是Navigation
Navigation是一个可简化的Android导航的库和插件,换句话说,Navigation是用来管理Fragment的切换的,并且是通过可视化的方式来进行管理的。
2.Navigation的优缺点
优点
-
处理Fragment的切换
-
默认情况下正确处理Fragment的前进和后退
-
为过渡和动画提供标准化的资源
-
可以绑定Toolbar/BottomNavigationView/ActionBar等
-
数据传递时提供类型安全性(使用SafeArgs)
-
ViewModel支持
缺点
-
fragment切换后底层会调用replace方法导致会被不断销毁,无法保存上一次的状态
3.Navigation的使用
Navigation的使用相对来说比较简答,分为以下几步: (1)引入依赖
(2)创建多个要调配的Fragment
(3)在res下面创建navigation文件夹,并创建navigation文件
(4)在主Activity里面的XML文件里面引入指定的Fragment
基本上大体步骤就那么几步,现在我们就一个一个来看。
步骤一:引入依赖
dependencies {
// Java引入
implementation "androidx.navigation:navigation-fragment:2.2.2"
implementation "androidx.navigation:navigation-ui:2.2.2"
// kotlin引入
implementation 'androidx.navigation:navigation-fragment-ktx:2.2.2'
im