Android(安卓)Jetpack 最佳开发姿势
在Android架构组件基础上,融入Kotlin 协程+retrofit,模拟网络,全面快速开发。
Navigation
NavController在 NavHost 中管理应用导航的对象,沿导航图中的特定路径导航至特定目标,或直接导航至特定目标。
首先,定义 layout/activity_main.xml
其次,定义 navigation/mobile_navigation.xml
Activity的添加,需要先在Project创建对应的Activity,即可在布局设计器处理。
...
最后,页面跳转,参数传递
val direction = HomeFragmentDirections.actionNavigationHomeToDetailActivity(plantId) view.findNavController().navigate(direction)
参数接收:
private val args: DetailActivityArgs by navArgs()
Databinding
在onCreateView()中直接使用控件,会报空指针异常,这个姿势 binding.tvNavigation 是可以的。
val binding = FragmentHomeBinding.inflate(inflater, container, false)binding.tvNavigation.setOnClickListener { navigateToDetailPage("1", it) }
布局文件中,字符串拼接,如跟ViewModel一起使用:
android:text='@{"Data From Network-> "+viewModel.response}'
ViewModel
以生命周期的方式存储和管理界面相关的数据。
Kotlin协程 viewModelScope, 如果 ViewModel 已清除,则在此范围内启动的协程都会自动取消。
private val homeViewModel: HomeViewModel by viewModels { InjectorUtils.provideHomeViewModelFactory(requireContext()) }viewModelScope.launch { ... }
LiveData
一种可观察的数据存储器类,具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。
var plantName = gardenPlantings.map { ... }
map 实现LiveData的转换
Room
创建应用数据的缓存, SQLite 的基础上提供了一个抽象层,充分利用 SQLite 的强大功能,更强健的数据库访问机制。
使用 Room 引用复杂数据,Room 提供了在基本类型和包装类型之间进行转换的功能,但不允许实体之间进行对象引用。
要为自定义类型添加此类支持,您需要提供一个 TypeConverter,它可以在自定义类与 Room 可以保留的已知类型之间来回转换。
class Converters {//TypeConverters ...}
将 @TypeConverters 注释添加到 AppDatabase 类中,以便 Room 可以使用您为该 AppDatabase 中的每个实体和 DAO 定义的转换器:
@Database(entities = table, version = 1, exportSchema = false)@TypeConverters(Converters::class)abstract class AppDatabase : RoomDatabase() { ...}
@Insertsuspend fun insertPlant(plant: Plant): Long
认为是协程suspend
WorkManager
使用 WorkManager API 可以轻松地调度即使在应用退出或设备重启时仍应运行的可延迟异步任务。
val workManagerConfiguration = Configuration.Builder() .setWorkerFactory(RefreshDataWork.Factory()) .build() WorkManager.initialize(appContext, workManagerConfiguration) val constraints = Constraints.Builder() .setRequiresCharging(true) .setRequiredNetworkType(NetworkType.CONNECTED) .build()val work = PeriodicWorkRequestBuilder(2, TimeUnit.HOURS) .setConstraints(constraints) .build()WorkManager.getInstance(appContext) .enqueueUniquePeriodicWork(RefreshDataWork::class.java.name, KEEP, work)
PeriodicWorkRequest 用于重复或重复工作,最小间隔应为15分钟。
OneTimeWorkRequest 一次性申请,不重复工作。
WorkManager按顺序执行,单例模式,app启动时执行一次。
代码Github的下载地址:
https://github.com/AlbertShen0211/Android-architecture-components
为了更好的理解代码,附图如下
更多相关文章
- 一句话锁定MySQL数据占用元凶
- android开发之ClipboardManager(剪贴板管理器)
- Android数据库更新并保留原来数据的实现
- Android系统源码数据库(mmssms.db)中几个表之间的关系.
- Android实现数据存储5种技术
- Android中数据库SQLite存储的基础知识
- Android两个Activity传递数据,onActivityResult获取结果时Intent
- android 数据持久化——I/O操作
- Android两个android两个activity之间相互传递数据