Android 车载应用开发与分析 (3)- HMI 构建 MVVM 架构(Java版)
## 前言
在大多数车载系统应用架构中,一个完整的应用往往会包含三层:
* **HMI**
Human Machine Interface,显示UI信息,进行人机交互。
* **Service**
在系统后台进行数据处理,监控数据状态。
* **SDK**
根据业务逻辑`Service`对外暴露的通信接口,其他模块通过它来完成IPC通信。
当然并不是所有的应用都需要`Service`,只有不能长久的驻留在内存中,且需要监控系统数据和行为的应用才需要`Service`。
举个例子,系统的**OTA**需要一个`Service`在IVI的后台监控云服务或SOA接口的消息,然后完成升级包的下载等。也需要一个`HMI`显示升级的Release Note、确认用户是否同意升级等,这个HMI往往会被归纳在系统设置中。`Service`与`HMI`之间的IPC通信,则需要暴露一个`SDK`来完成,这个其他模块的`HMI`也可以通过这个`SDK`完成与`Service`的IPC通信。
反例则是,**Launcher** 可以长久的驻留在内存,所以它也就不需要`Service`和`SDK`。
**本篇文章主要讲解,如在HMI层中构建一个适合车载系统应用的MVVM架构。本文涉及的源码:https://github.com/linux-link/CarMvvmArch**
## MVVM 架构分层逻辑
**MVVM** 架构的原理以及与MVC&MVP的区别,网上已经有很多相关的优秀文章,这里就不再赘述,本篇文章将聚焦如何车载应用中利用Jetpack组件将 **MVVM** 架构真正落地实现。
![图-1 MVVM架构图](https://upload-images.jianshu.io/upload_images/3146091-ce50fbed5e3c6c19?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
当前的Android应用的**MVVM**架构分层逻辑,都源自图-2 Android官方给出的指导建议,我们也同样基于这套逻辑来实现**MVVM**架构。
![图-2 Android官方推荐的APP架构设计图](https://upload-images.jianshu.io/upload_images/3146091-6f98cccafd230994?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
## 封装适合车载应用 MVVM 框架
**车载应用**相对于**手机应用**来说开发周期和复杂度都要小很多,所以我们封装的重点是**View**层,**ViewModel** 层和 **Model** 层的封装则会简单很多。
### 封装 Model 层
一般来说我们会把访问网络的工具类封装在Model层,但是车载系统应用的 **HMI** 层通常没有访问网络的功能,所以 **Model** 层我们直接留空即可。
```
public abstract class BaseRepository {
}
```
### 封装 ViewModel 层
**VideModel** 层的封装很简单,只需要将Model的实例传入,方便 **ViewModel** 的实现类调用即可。
**封装 ViewModel**
```
public abstract class BaseViewModel<M extends BaseRepository> extends ViewModel {
protected M mRepository;
public BaseViewModel(M repository) {
mRepository = repository;
}
public M getRepository() {
return mRepository;
}
}
```
**封装 AndroidViewModel**
```
public abstract class BaseAndroidViewModel<M extends BaseRepository> extends AndroidViewModel {
protected M mRepository;
public BaseAndroidViewModel(Application application, @Nullable M repository) {
super(application);
mRepository = repository;
}
public M getRepository() {
return mRepository;
}
}
```
### 封装 View 层
**在 View** 层中我们需要引入`Databinding`和`ViewModel`,并且定义出 **View** 的一些实现规范。
在实际使用中,并不是每一个界面都需要使用**MVVM**架构, 所以需要额外封装一个只引入`Databinding`的 **Frangment** 和 **Activity**
**基于 DataBinding 封装 Fragment**
```
public abstract class BaseBindingFragment<V extends ViewDataBinding> extends BaseFragment {
private static final String TAG = TAG_FWK + BaseBindingFragment.class.getSimpleName();
protected V mBinding;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
LogUtils.logV(TAG, "[onCreateView]");
if (getLayoutId() == 0) {
throw new RuntimeException("getLayout() must be not null");
}
mBinding = DataBindingUtil.inflate(inflater, getLayoutId(), container, false);
mBinding.setLifecycleOwner(this);
mBinding.executePendingBindings();
initView();
return mBinding.getRoot();
}
protected abstract void initView();
@LayoutRes
protected abstract int getLayoutId();
public V getBinding() {
return mBinding;
}
}
```
**在** **BindingFragment** **的基础上添加 ViewModel**
```
public abstract class BaseMvvmFragment<Vm extends BaseViewModel, V extends ViewDataBinding> extends BaseBindingFragment<V> {
protected Vm mViewModel;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
initViewModel();
View view = super.onCreateView(inflater, container, savedInstanceState);
initObservable(mViewModel);
if (getViewModelVariable() != 0) {
mBinding.setVariable(getViewModelVariable(), mViewModel);
}
return view;
}
@Override
public void onStart() {
super.onStart();
loadData(getViewModel());
}
private void initViewModel() {
Class<Vm> modelClass;
Type type = getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
modelClass = (Class<Vm>) ((ParameterizedType) type).getActualTypeArguments()[0];
} else {
modelClass = (Class<Vm>) BaseViewModel.class;
}
Object object = getViewModelOrFactory();
if (object instanceof ViewModel){
mViewModel = (Vm) object;
}else if (object instanceof ViewModelProvider.Factory){
mViewModel = new ViewModelProvider(this, (ViewModelProvider.Factory) object)
.get(modelClass);
}else {
mViewModel = new ViewModelProvider(this,
new ViewModelProvider.NewInstanceFactory()).get(modelClass);
}
}
protected abstract Object getViewModelOrFactory();
protected abstract int getViewModelVariable();
protected abstract void initObservable(Vm viewModel);
protected abstract void loadData(Vm viewModel);
protected Vm getViewModel() {
return mViewModel;
}
}
```
**基于 DataBinding 封装 Activity**
```
public abstract class BaseBindingActivity<V extends ViewDataBinding> extends BaseActivity {
protected V mBinding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getLayoutId() == 0) {
throw new RuntimeException("getLayout() must be not null");
}
mBinding = DataBindingUtil.setContentView(this, getLayoutId());
mBinding.setLifecycleOwner(this);
mBinding.executePendingBindings();
initView();
}
@LayoutRes
protected abstract int getLayoutId();
public V getBinding() {
return mBinding;
}
protected abstract void initView();
}
```
**在 BindingActivity 的基础上添加 ViewModel**
```
public abstract class BaseMvvmActivity<Vm extends BaseViewModel, V extends ViewDataBinding> extends BaseBindingActivity<V> {
protected Vm mViewModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
initViewModel();
super.onCreate(savedInstanceState);
if (getViewModelVariable() != 0) {
mBinding.setVariable(getViewModelVariable(), mViewModel);
}
mBinding.executePendingBindings();
initObservable(mViewModel);
}
@Override
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备、移动设备等 操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络与通信是一个非常广泛的领域,它涉及到计算机科学、电子工程、数学等多个学科的知识。 云计算与大数据:数据集、包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。
资源推荐
资源详情
资源评论
收起资源包目录
封装一个适合车载Android操作系统中使用的MVVM框架.zip (59个子文件)
cm
gradle.properties 1KB
gradle
wrapper
gradle-wrapper.jar 58KB
gradle-wrapper.properties 232B
car_hmi
src
main
java
com
mvvm
hmi
ipc
CarApp.java 232B
factory
AppInjection.java 1KB
AppViewModelFactory.java 1KB
model
HvacCallback.java 128B
HvacRepository.java 2KB
ui
HvacActivity.java 1013B
HvacViewModel.java 2KB
res
mipmap-xxhdpi
ic_launcher_round.webp 6KB
ic_launcher.webp 3KB
mipmap-hdpi
ic_launcher_round.webp 3KB
ic_launcher.webp 1KB
drawable-v24
ic_launcher_foreground.xml 2KB
mipmap-anydpi-v26
ic_launcher.xml 272B
ic_launcher_round.xml 272B
values-night
themes.xml 830B
mipmap-mdpi
ic_launcher_round.webp 2KB
ic_launcher.webp 982B
mipmap-xxxhdpi
ic_launcher_round.webp 8KB
ic_launcher.webp 4KB
mipmap-xhdpi
ic_launcher_round.webp 4KB
ic_launcher.webp 2KB
values
colors.xml 378B
strings.xml 72B
themes.xml 830B
layout
activity_hvac.xml 2KB
drawable
ic_launcher_background.xml 5KB
AndroidManifest.xml 801B
proguard-rules.pro 750B
libs
sdk.jar 23KB
build.gradle 1KB
.gitignore 6B
LICENSE 11KB
gradlew.bat 3KB
build.gradle 324B
settings.gradle 257B
gradlew 6KB
.gitignore 102B
README.md 40KB
lib_mvvm_fwk
src
main
java
com
mvvm
fwk
viewmodel
BaseViewModel.java 658B
BaseAndroidViewModel.java 819B
utils
eventbus
LiveDataBus.java 2KB
StickyLiveData.java 4KB
LogUtils.java 2KB
AppExecutors.java 5KB
model
BaseRepository.java 71B
ui
BaseMvvmFragment.java 2KB
BaseBindingActivity.java 924B
BaseActivity.java 2KB
BaseFragment.java 3KB
BaseBindingFragment.java 1KB
BaseMvvmActivity.java 2KB
AppGlobal.java 3KB
AndroidManifest.xml 149B
proguard-rules.pro 750B
build.gradle 1KB
.gitignore 6B
共 59 条
- 1
资源评论
妄北y
- 粉丝: 1w+
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功