① 如何构建android MVVM 应用框架
我们先来看看什么是MVVM,然后再一步一步来设计整个MVVM框架。
MVC、MVP、MVVM
首先,我们先大致了解下Android开发中常见的模式。
MVC
View:XML布局文件。
Model:实体模型(数据的获取、存储、数据状态变化)。
Controllor:对应于Activity,处理数据、业务和UI。
从上面这个结构来看,Android本身的设计还是符合MVC架构的,但是Android中纯粹作为View的XML视图功能太弱,我们大量处理View的逻辑只能写在Activity中,这样Activity就充当了View和Controller两个角色,直接导致Activity中的代码大爆炸。相信大多数Android开发者都遇到过一个Acitivty数以千行的代码情况吧!所以,更贴切的说法是,这个MVC结构最终其实只是一个Model-View(Activity:View&Controller)的结构。
MVP
View:对应于Activity和XML,负责View的绘制以及与用户的交互。
Model:依然是实体模型。
Presenter:负责完成View与Model间的交互和业务逻辑。
前面我们说,Activity充当了View和Controller两个角色,MVP就能很好地解决这个问题,其核心理念是通过一个抽象的View接口(不是真正的View层)将Presenter与真正的View层进行解耦。Persenter持有该View接口,对该接口进行操作,而不是直接操作View层。这样就可以把视图操作和业务逻辑解耦,从而让Activity成为真正的View层。
但MVP也存在一些弊端:
Presenter(以下简称P)层与View(以下简称V)层是通过接口进行交互的,接口粒度不好控制。粒度太小,就会存在大量接口的情况,使代码太过碎版化;粒度太大,解耦效果不好。同时对于UI的输入和数据的变化,需要手动调用V层或者P层相关的接口,相对来说缺乏自动性、监听性。如果数据的变化能自动响应到UI、UI的输入能自动更新到数据,那该多好!
MVP是以UI为驱动的模型,更新UI都需要保证能获取到控件的引用,同时更新UI的时候要考虑当前是否是UI线程,也要考虑Activity的生命周期(是否已经销毁等)。
MVP是以UI和事件为驱动的传统模型,数据都是被动地通过UI控件做展示,但是由于数据的时变性,我们更希望数据能转被动为主动,希望数据能更有活性,由数据来驱动UI。
V层与P层还是有一定的耦合度。一旦V层某个UI元素更改,那么对应的接口就必须得改,数据如何映射到UI上、事件监听接口这些都需要转变,牵一发而动全身。如果这一层也能解耦就更好了。
复杂的业务同时也可能会导致P层太大,代码臃肿的问题依然不能解决。
MVVM
View:对应于Activity和XML,负责View的绘制以及与用户交互。
Model:实体模型。
ViewModel:负责完成View与Model间的交互,负责业务逻辑。
MVVM的目标和思想与MVP类似,利用数据绑定(Data Binding)、依赖属性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一个更加灵活高效的架构。
数据驱动
在常规的开发模式中,数据变化需要更新UI的时候,需要先获取UI控件的引用,然后再更新UI。获取用户的输入和操作也需要通过UI控件的引用。在MVVM中,这些都是通过数据驱动来自动完成的,数据变化后会自动更新UI,UI的改变也能自动反馈到数据层,数据成为主导因素。这样MVVM层在业务逻辑处理中只要关心数据,不需要直接和UI打交道,在业务处理过程中简单方便很多。
低耦合度
MVVM模式中,数据是独立于UI的。
数据和业务逻辑处于一个独立的ViewModel中,ViewModel只需要关注数据和业务逻辑,不需要和UI或者控件打交道。UI想怎么处理数据都由UI自己决定,ViewModel不涉及任何和UI相关的事,也不持有UI控件的引用。即便是控件改变了(比如:TextView换成EditText),ViewModel也几乎不需要更改任何代码。它非常完美的解耦了View层和ViewModel,解决了上面我们所说的MVP的痛点。
更新UI
在MVVM中,数据发生变化后,我们在工作线程直接修改(在数据是线程安全的情况下)ViewModel的数据即可,不用再考虑要切到主线程更新UI了,这些事情相关框架都帮我们做了。
团队协作
MVVM的分工是非常明显的,由于View和ViewModel之间是松散耦合的:一个是处理业务和数据、一个是专门的UI处理。所以,完全由两个人分工来做,一个做UI(XML和Activity)一个写ViewModel,效率更高。
可复用性
一个ViewModel可以复用到多个View中。同样的一份数据,可以提供给不同的UI去做展示。对于版本迭代中频繁的UI改动,更新或新增一套View即可。如果想在UI上做A/B Testing,那MVVM是你不二选择。
单元测试
有些同学一看到单元测试,可能脑袋都大。是啊,写成一团浆糊的代码怎么可能做单元测试?如果你们以代码太烂无法写单元测试而逃避,那可真是不好的消息了。这时候,你需要MVVM来拯救。
我们前面说过了,ViewModel层做的事是数据处理和业务逻辑,View层中关注的是UI,两者完全没有依赖。不管是UI的单元测试还是业务逻辑的单元测试,都是低耦合的。在MVVM中数据是直接绑定到UI控件上的(部分数据是可以直接反映出UI上的内容),那么我们就可以直接通过修改绑定的数据源来间接做一些Android UI上的测试。
通过上面的简述以及模式的对比,我们可以发现MVVM的优势还是非常明显的。虽然目前Android开发中可能真正在使用MVVM的很少,但是值得我们去做一些探讨和调研。
如何构建MVVM应用框架
如何分工
构建MVVM框架首先要具体了解各个模块的分工。接下来我们来讲解View、ViewModel、Model它们各自的职责所在。
View
View层做的就是和UI相关的工作,我们只在XML、Activity和Fragment写View层的代码,View层不做和业务相关的事,也就是我们在Activity不写业务逻辑和业务数据相关的代码,更新UI通过数据绑定实现,尽量在ViewModel里面做(更新绑定的数据源即可),Activity要做的事就是初始化一些控件(如控件的颜色,添加RecyclerView的分割线),View层可以提供更新UI的接口(但是我们更倾向所有的UI元素都是通过数据来驱动更改UI),View层可以处理事件(但是我们更希望UI事件通过Command来绑定)。 简单地说:View层不做任何业务逻辑、不涉及操作数据、不处理数据,UI和数据严格的分开。
ViewModel
ViewModel层做的事情刚好和View层相反,ViewModel只做和业务逻辑和业务数据相关的事,不做任何和UI相关的事情,ViewModel 层不会持有任何控件的引用,更不会在ViewModel中通过UI控件的引用去做更新UI的事情。ViewModel就是专注于业务的逻辑处理,做的事情也都只是对数据的操作(这些数据绑定在相应的控件上会自动去更改UI)。同时DataBinding框架已经支持双向绑定,让我们可以通过双向绑定获取View层反馈给ViewModel层的数据,并对这些数据上进行操作。关于对UI控件事件的处理,我们也希望能把这些事件处理绑定到控件上,并把这些事件的处理统一化,为此我们通过BindingAdapter对一些常用的事件做了封装,把一个个事件封装成一个个Command,对于每个事件我们用一个ReplyCommand 去处理就行了,ReplyCommand 会把你可能需要的数据带给你,这使得我们在Vie,具体见 MVVM Light Toolkit 使用指南的 Command 部分 。再强调一遍:ViewModel 不做和UI相关的事。
Model
Model层最大的特点是被赋予了数据获取的职责,与我们平常Model层只定义实体对象的行为截然不同。实例中,数据的获取、存储、数据状态变化都是Model层的任务。Model包括实体模型(Bean)、Retrofit的Service ,获取网络数据接口,本地存储(增删改查)接口,数据变化监听等。Model提供数据获取接口供ViewModel调用,经数据转换和操作并最终映射绑定到View层某个UI元素的属性上。
如何协作
关于协作,我们先来看下面的一张图:
上图反应了MVVM框架中各个模块的联系和数据流的走向,我们从每个模块一一拆分来看。那么我们重点就是下面的三个协作。
ViewModel与View的协作 。
ViewModel与Model的协作 。
ViewModel与ViewModel的协作 。
ViewModel与View的协作
图2中ViewModel和View是通过绑定的方式连接在一起的,绑定分成两种:一种是数据绑定,一种是命令绑定。数据的绑定DataBinding已经提供好了,简单地定义一些ObservableField就能把数据和控件绑定在一起了(如TextView的text属性),但是DataBinding框架提供的不够全面,比如说如何让一个URL绑定到一个ImageView,让这个ImageView能自动去加载url指定的图片,如何把数据源和布局模板绑定到一个ListView,让ListView可以不需要去写Adapter和ViewHolder相关的东西?这些就需要我们做一些工作和简单的封装。MVVM Light Toolkit 已经帮我们做了一部分的工作,关于事件绑定也是一样,MVVM Light Toolkit 做了简单的封装,对于每个事件我们用一个ReplyCommand去处理就行了,ReplyCommand 会把可能需要的数据带给你,这样我们处理事件的时候也只关心处理数据就行了.
由 图 1 中ViewModel的模块中我们可以看出ViewModel类下面一般包含下面5个部分:
Context (上下文)
Model (数据源 Java Bean)
Data Field (数据绑定)
Command (命令绑定)
Child ViewModel (子ViewModel)
我们先来看下示例代码,然后再一一讲解5个部分是干嘛用的:
//context
private Activity context;
//model(数据源 Java Bean)
private NewsService.News news;
private TopNewsService.News topNews;
//数据绑定,绑定到UI的字段(data field)
public final ObservableField<String> imageUrl = new ObservableField<>();
public final ObservableField<String> html = new ObservableField<>();
public final ObservableField<String> title = new ObservableField<>();
// 一个变量包含了所有关于View Style 相关的字段
public final ViewStyle viewStyle = new ViewStyle();
//命令绑定(command)
public final ReplyCommand onRefreshCommand = new ReplyCommand<>(() -> {
})
public final ReplyCommand<Integer> onLoadMoreCommand = new ReplyCommand<>((itemCount) -> {
});
//Child ViewModel
public final ObservableList<NewItemViewModel> itemViewModel = new ObservableArrayList<>();
/** * ViewStyle 关于控件的一些属性和业务数据无关的Style 可以做一个包裹,这样代码比较美观,
ViewModel 页面也不会有太多太杂的字段。 **/
public static class ViewStyle {
public final ObservableBoolean isRefreshing = new ObservableBoolean(true);
public final ObservableBoolean progressRefreshing = new ObservableBoolean(true);
}
Context
Context是干嘛用的呢,为什么每个ViewModel都最好需要持了一个Context的引用呢?ViewModel不处理和UI相关的事也不操作控件,更不更新UI,那为什么要有Context呢?原因
Model是什么呢?其实就是数据源,可以简单理解是我们用JSON转过来的Bean。ViewModel要把数据映射到UI中可能需要大量对Model的数据拷贝和操作,拿Model的字段去生成对应的ObservableField然后绑定到UI(我们不会直接拿Model的数据去做绑定展示),这里是有必要在一个ViewModel保留原始的Model引用,这对于我们是非常有用的,因为可能用户的某些操作和输入需要我们去改变数据源,可能我们需要把一个Bean在列表页点击后传给详情页,可能我们需要把这个Model当做表单提交到服务器。这些都需要我们的ViewModel持有相应的Model(数据源)。
Data Field(数据绑定)
Data Field就是需要绑定到控件上的ObservableField字段,这是ViewModel的必需品,这个没有什么好说。但是这边有一个建议:
这些字段是可以稍微做一下分类和包裹的。比如说可能一些字段是绑定到控件的一些Style属性上(如长度、颜色、大小),对于这类针对View Style的的字段可以声明一个ViewStyle类包裹起来,这样整个代码逻辑会更清晰一些,不然ViewModel里面可能字段泛滥,不易管理和阅读性较差。而对于其他一些字段,比如说title、imageUrl、name这些属于数据源类型的字段,这些字段也叫数据字段,是和业务数据和逻辑息息相关的,这些字段可以放在一块。
Command(命令绑定)
Command(命令绑定)简言之就是对事件的处理(下拉刷新、加载更多、点击、滑动等事件处理)。我们之前处理事件是拿到UI控件的引用,然后设置Listener,这些Listener其实就是Command。但是考虑到在一个ViewModel写各种Listener并不美观,可能实现一个Listener就需要实现多个方法,但是我们可能只想要其中一个有用的方法实现就好了。更重要一点是实现一个Listener可能需要写一些UI逻辑才能最终获取我们想要的。简单举个例子,比如你想要监听ListView滑到最底部然后触发加载更多的事件,这时候就要在ViewModel里面写一个OnScrollListener,然后在里面的onScroll方法中做计算,计算什么时候ListView滑动底部了。其实ViewModel的工作并不想去处理这些事件,它专注做的应该是业务逻辑和数据处理,如果有一个东西不需要你自己去计算是否滑到底部,而是在滑动底部自动触发一个Command,同时把当前列表的总共的item数量返回给你,方便你通过 page=itemCount/LIMIT+1去计算出应该请求服务器哪一页的数据那该多好啊。MVVM Light Toolkit 帮你实现了这一点:
public final ReplyCommand<Integer> onLoadMoreCommand = new ReplyCommand<>((itemCount) -> {
int page=itemCount/LIMIT+1;
loadData(page.LIMIT)
});
接着在XML布局文件中通过bind:onLoadMoreCommand绑定上去就行了。
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
bind:onLoadMoreCommand="@{viewModel.loadMoreCommand}"/>
x
当然Command并不是必须的,你完全可以依照自己的习惯和喜好在ViewModel写Listener,不过使用Command可以使ViewModel更简洁易读。你也可以自己定义更多的、其他功能的Command,那么ViewModel的事件处理都是托管ReplyCommand 来处理,这样的代码看起来会比较美观和清晰。Command只是对UI事件的一层隔离UI层的封装,在事件触发时把ViewModel层可能需要的数据传给ViewModel层,对事件的处理做了统一化,是否使用的话,还是看你个人喜好了。
Child ViewModel(子ViewModel)
子ViewModel的概念就是在ViewModel里面嵌套其他的ViewModel,这种场景还是很常见的。比如说你一个Activity里面有两个Fragment,ViewModel是以业务划分的,两个Fragment做的业务不一样,自然是由两个ViewModel来处理,这时候Activity对应的ViewModel里面可能包含了两个Fragment各自的ViewModel,这就是嵌套的子ViewModel。还有另外一种就是对于AdapterView,如ListView RecyclerView、ViewPager等。
//Child ViewModelpublic final
ObservableList<ItemViewModel> itemViewModel = new ObservableArrayList<>();
它们的每个Item其实就对应于一个ViewModel,然后在当前的ViewModel通过ObservableList 持有引用(如上述代码),这也是很常见的嵌套的子ViewModel。我们其实还建议,如果一个页面业务非常复杂,不要把所有逻辑都写在一个ViewModel,可以把页面做业务划分,把不同的业务放到不同的ViewModel,然后整合到一个总的ViewModel,这样做起来可以使我们的代码业务清晰、简短意赅,也方便后人的维护。
总的来说,ViewModel和View之前仅仅只有绑定的关系,View层需要的属性和事件处理都是在XML里面绑定好了,ViewModel层不会去操作UI,只是根据业务要求处理数据,这些数据自动映射到View层控件的属性上。关于ViewModel类中包含哪些模块和字段,这个需要开发者自己去衡量,我们建议ViewModel不要引入太多的成员变量,成员变量最好只有上面的提到的5种(context、model……),能不引入其他类型的变量就尽量不要引进来,太多的成员变量对于整个代码结构破坏很大,后面维护的人要时刻关心成员变量什么时候被初始化、什么时候被清掉、什么时候被赋值或者改变,一个细节不小心可能就出现潜在的Bug。太多不清晰定义的成员变量又没有注释的代码是很难维护的。
另外,我们会把UI控件的属性和事件都通过XML(如bind:text=@{...})绑定。如果一个业务逻辑要弹一个Dialog,但是你又不想在ViewModel里面做弹窗的事(ViewModel不希望做UI相关的事)或者说改变ActionBar上面的图标的颜色,改变ActionBar按钮是否可点击,这些都不是写在XML里面(都是用Java代码初始化的),如何对这些控件的属性做绑定呢?我们先来看下代码:
public class MainViewModel implements ViewModel {
....
//true的时候弹出Dialog,false的时候关掉dialog
public final ObservableBoolean isShowDialog = new ObservableBoolean();
....
.....
}
// 在View层做一个对isShowDialog改变的监听
public class MainActivity extends RxBasePmsActivity {
private MainViewModel mainViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
.....
mainViewModel.isShowDialog.addOnPropertyChangedCallback(new android.databinding.Observable.OnPropertyChangedCallback() {
@Override
public void onPropertyChanged(android.databinding.Observable sender, int propertyId) {
if (mainViewModel.isShowDialog.get()) {
dialog.show();
} else {
dialog.dismiss();
}
}
});
}
...
}
简单地说你可以对任意的ObservableField做监听,然后根据数据的变化做相应UI的改变,业务层ViewModel只要根据业务处理数据就行,以数据来驱动UI。
② 什么是android的框架开发
android应用开发框架是 Application Framework. 其系统架构由5部分组成,分别是:Linux Kernel、Android Runtime、Libraries、Application Framework、Applications。第二部分将详细介绍这5个部分。下面自底向上分析各层。 Android架构 1、Linux Kernel Android基于Linux 2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。 如果你学过计算机网络知道OSI/RM,就会知道分层的好处就是使用下层提供的服务而为上层提供统一的服务,屏蔽本层及以下层的差异,当本层及以下层发生了变化不会影响到上层。也就是说各层各尽其职,各层提供固定的SAP(Service Access Point),专业点可以说是高内聚、低耦合。 如果你只是做应用开发,就不需要深入了解Linux Kernel层。 2、Android Runtime Android包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己的进程中。Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是.dex,dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。 大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。两种架构各有优劣,一般而言,基于栈的机器需要更多指令,而基于寄存器的机器指令更大。dx 是一套工具,可以将 Java .class 转换成 .dex 格式。一个dex文件通常会有多个.class。由于dex有时必须进行最佳化,会使文件大小增加1-4倍,以ODEX结尾。 Dalvik虚拟机依赖于Linux 内核提供基本功能,如线程和底层内存管理。 3、Libraries Android包含一个C/C++库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application framework)暴露给开发者。下面列出一些核心库: 系统C库--标准C系统库(libc)的BSD衍生,调整为基于嵌入式Linux设备 媒体库--基于PacketVideo的OpenCORE。这些库支持播放和录制许多流行的音频和视频格式,以及静态图像文件,包括MPEG4、 H.264、 MP3、 AAC、 AMR、JPG、 PNG 界面管理--管理访问显示子系统和无缝组合多个应用程序的二维和三维图形层 LibWebCore--新式的Web浏览器引擎,驱动Android 浏览器和内嵌的web视图 SGL--基本的2D图形引擎 3D库--基于OpenGL ES 1.0 APIs的实现。库使用硬件3D加速或包含高度优化的3D软件光栅 FreeType --位图和矢量字体渲染 SQLite --所有应用程序都可以使用的强大而轻量级的关系数据库引擎 4、Application Framework 通过提供开放的开发平台,Android使开发者能够编制极其丰富和新颖的应用程序。开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知等等,很多很多。 开发者可以完全使用核心应用程序所使用的框架APIs。应用程序的体系结构旨在简化组件的重用,任何应用程序都能发布他的功能且任何其他应用程序可以使用这些功能(需要服从框架执行的安全限制)。这一机制允许用户替换组件。 所有的应用程序其实是一组服务和系统,包括: 视图(View)--丰富的、可扩展的视图集合,可用于构建一个应用程序。包括包括列表、网格、文本框、按钮,甚至是内嵌的网页浏览器 内容提供者(Content Providers)--使应用程序能访问其他应用程序(如通讯录)的数据,或共享自己的数据 资源管理器(Resource Manager)--提供访问非代码资源,如本地化字符串、图形和布局文件 通知管理器(Notification Manager)--使所有的应用程序能够在状态栏显示自定义警告 活动管理器(Activity Manager)--管理应用程序生命周期,提供通用的导航回退功能 5、Applications Android装配一个核心应用程序集合,包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人和其他设置。所有应用程序都是用Java编程语言写的。更加丰富的应用程序有待我们去开发! 从上面我们知道Android的架构是分层的,非常清晰,分工很明确。Android本身是一套软件堆迭(Software Stack),或称为“软件迭层架构”,迭层主要分成三层:操作系统、中间件、应用程序。从上面我们也看到了开源的力量,一个个熟悉的开源软件在这里贡献了自己的一份力量。
③ 在Android开发过程中搭建一个自己的应用框架有几个步骤
Android应用开发的框架步骤:
1. 项目工程搭建
在搭建工程结构的时候可以尽量抽取一些共用的东西,例如,数据库操作、base、task、事件观察者、通用的工具类、UI公共组件等等,这些东西应该表现在代码结构中。
5.数据库的处理
在处理数据库的时候采用ContentProvider的方式。
6.图片的处理
对图片处理的软件很多,只要把基本的一些开源框架原理搞清楚就可以了。
注意:在android开发项目中,首先要考虑的是这个项目或者说这个产品的核心功能。比如,图片处理和展示类app,更多考虑对大量图片的处理,防止OOM等等。
④ android开发框架有哪些
Android开发框架主要包括以下几个:
一、Android官方SDK框架
Android官方SDK框架是Android开发的基础,提供了Android系统的基础组件和开发API。它包括视图系统、资源系统、内容提供者、位置服务等模块,使开发者能够利用Android系统提供的各种功能进行应用开发。
二、MVC框架(Model-View-Controller)
MVC是一种常用的软件设计模式,在Android开发中也有着广泛的应用。MVC框架将应用程序分为三个基本组成部分:模型(Model)、视图(View)和控制器(Controller)。这种分离的方式有助于代码的模块化,提高代码的可维护性和可重用性。
三、MVVM框架(Model-View-ViewModel)
MVVM框架是MVC框架的一种改进,它引入了ViewModel层,使得视图与业务逻辑之间通过ViewModel进行交互。这提高了代码的清晰性和可测试性。在Android开发中,常见的MVVM框架实现有Data Binding和LiveData等。
四、Clean Architecture框架
Clean Architecture框架强调代码的层次性和模块化。它将应用分为多个层次,如数据层、领域层、UI层等,每层之间通过明确的接口进行交互。这种设计使得代码更加清晰,易于维护和扩展。
五、Kotlin Android Extensions框架
Kotlin Android Extensions是Kotlin语言在Android开发中的一项特性,它简化了视图与代码之间的交互。通过Kotlin的扩展属性,开发者可以直接访问UI组件,减少了大量繁琐的代码。此外,Kotlin的null安全特性也减少了空指针异常的风险。
⑤ android ui妗嗘灦链夊摢浜
Android UI妗嗘灦涓昏佸寘𨰾浠ヤ笅鍑犱釜閮ㄥ垎锛
1. Android铡熺敓UI妗嗘灦
Android绯荤粺镊甯︾殑UI妗嗘灦鏄寮鍙戠殑锘虹锛屽畠鍖呮嫭浜嗕竴绯诲垪镄刄I缁勪欢锛屽侫ctivity銆丗ragment銆乂iew銆乂iewGroup绛夈傝繖浜涚粍浠朵负寮鍙戣呮彁渚涗简鏋勫缓鐢ㄦ埛鐣岄溃镄勫熀纭宸ュ叿锛屼緥濡傚竷灞銆佹带浠躲佽彍鍗曞拰瀵硅瘽妗嗙瓑銆
2. Material Design妗嗘灦
Material Design鏄疓oogle鎺ㄥ嚭镄勮捐¤瑷妗嗘灦锛屽畠锘轰簬绾歌川瑙︽劅镄刄I璁捐°傚湪Android寮鍙戜腑锛孧aterial Design鎻愪緵浜嗕竴绯诲垪镄刄I缁勪欢鍜岃捐¤勮寖锛屾棬鍦ㄥ府锷╁紑鍙戣呭垱寤虹编瑙伞佺幇浠e寲镄勭敤鎴风晫闱銆傝繖涓妗嗘灦寮鸿皟锷ㄧ敾鍜岃繃娓℃晥鏋滐纴鎻愬崌鍙嬫棭绁ョ敤鎴蜂綋楠屻
3. 绗涓夋柟UI妗嗘灦鍜屽簱
闄や简Android铡熷ソ鎼忕敓鍜孧aterial Design锛岃缮链夎稿氭祦琛岀殑绗涓夋柟UI妗嗘灦鍜屽簱鍙渚涗娇鐢ㄣ备緥濡傦纴React Native鍙浠ョ敤浜庢瀯寤洪珮镐ц兘镄勫师鐢熺晫闱锛汧lutter鎻愪緵浜呜法骞冲彴镄勫紑鍙戣兘锷涳纴鍙浠ユ瀯寤虹编瑙备笖鍝嶅簲杩呴熺殑鐢ㄦ埛鐣岄溃锛汮etpack Compose鏄疉ndroid Jetpack镄勪竴镌佸厗閮ㄥ垎锛屾彁渚涗简涓绉嶆洿澹版槑寮忕殑UI缂栫▼鏂瑰纺銆傝繖浜涙嗘灦鍜屽簱涓哄紑鍙戣呮彁渚涗简镟村氶夋嫨鍜岀伒娲绘с
4. 镊瀹氢箟UI妗嗘灦
寮鍙戣呬篃鍙浠ユ牴鎹椤圭洰镄勯渶姹傦纴镊琛屽垱寤哄畾鍒剁殑UI妗嗘灦銆傝繖阃氩父娑夊强瀵瑰师鐢熺粍浠剁殑镓╁𪾢鍜屽畾鍒讹纴鎴栨槸鐩存帴浣跨敤寮婧愮粍浠跺簱𨱒ュ疄鐜扮壒瀹氱殑鐢ㄦ埛鐣岄溃闇姹伞傞氲繃镊瀹氢箟UI妗嗘灦锛屽彲浠ュ疄鐜版洿涓轰釜镐у寲鍜屽垱鏂扮殑鐢ㄦ埛鐣岄溃璁捐°
Android UI妗嗘灦娑电洊浜嗗师鐢熸嗘灦銆丮aterial Design瑙勮寖銆佺涓夋柟搴扑互鍙婅嚜瀹氢箟妗嗘灦绛夊氢釜灞傞溃銆傚紑鍙戣呭彲浠ユ牴鎹椤圭洰镄勯渶姹傚拰锲㈤槦镄勬妧鑳介夋嫨阃傚悎镄勬嗘灦𨱒ユ瀯寤虹敤鎴风晫闱銆傞殢镌鎶链镄勪笉鏂鍙戝𪾢锛孉ndroid UI妗嗘灦涔熷湪涓嶆柇镟存柊鍜屾紨杩涳纴涓哄紑鍙戣呮彁渚涙洿澶氶夋嫨鍜屽彲鑳芥с
⑥ Android镓嬫満搴旂敤寮鍙戜竴鑸閲囩敤浠涔堟嗘灦_瀹夊崜妗嗘灦鏄浠涔
android搴旂敤寮鍙戞嗘灦鏄疉pplicationFramework.鍏剁郴缁熸灦鏋勭敱5閮ㄥ垎缁勬垚锛屽垎鍒鏄锛歀inuxKernel銆丄ndroidRuntime銆丩ibraries銆丄pplicationFramework銆併傜浜岄儴鍒嗗皢璇︾粏浠嬬粛杩5涓閮ㄥ垎銆备笅闱㈣嚜搴曞悜涓婂垎鏋愬悇灞伞
Android鏋舵瀯
1銆丩inuxKernelAndroid
锘轰簬Linux2.6鎻愪緵镙稿绩绯荤粺链嶅姟锛屼緥濡傦细瀹夊叏銆佸唴瀛樼$悊銆佽繘绋嬬$悊銆佺绣缁滃爢镙堛侀┍锷ㄦā鍨嬨侺inux
Kernel涔熶綔涓虹‖浠跺拰杞浠朵箣闂寸殑鎶借薄灞傦纴瀹冮殣钘忓叿浣撶‖浠剁粏鑺傝屼负涓婂眰鎻愪緵缁熶竴镄勬湇锷°
濡傛灉浣犲﹁繃璁$畻链虹绣缁灭煡阆揙SI/RM锛屽氨浼氱煡阆揿垎灞傜殑濂藉勫氨鏄浣跨敤涓嫔眰鎻愪緵镄勬湇锷¤屼负涓婂眰鎻愪緵缁熶竴镄勬湇锷★纴灞忚斀链灞傚强浠ヤ笅灞傜殑宸寮傦纴褰撴湰灞傚强浠ヤ笅灞傚彂鐢
浜嗗彉鍖栦笉浼氩奖鍝嶅埌涓婂眰銆备篃灏辨槸璇村悇灞傚悇灏藉叾镵岋纴钖勫眰鎻愪緵锲哄畾镄凷AP锛圫erviceAessPoint锛夛纴涓扑笟镣瑰彲浠ヨ存槸楂桦唴镵氥佷绠钥﹀悎銆
濡傛灉浣犲彧鏄锅氩簲鐢ㄥ紑鍙戯纴灏变笉闇瑕佹繁鍏ヤ简瑙LinuxKernel灞伞
2銆丄ndroidRuntimeAndroid
鍖呭惈涓涓镙稿绩搴撶殑闆嗗悎锛屾彁渚涘ぇ閮ㄥ垎鍦↗ava缂栫▼璇瑷镙稿绩绫诲簱涓鍙鐢ㄧ殑锷熻兘銆傛疮涓涓狝ndroid搴旂敤绋嫔簭鏄疍alvik铏氭嫙链轰腑镄勫疄渚嬶纴杩愯屽湪浠栦滑镊宸
镄勮繘绋嬩腑銆侱alvik铏氭嫙链鸿捐℃垚锛屽湪涓涓璁惧囧彲浠ラ珮鏁埚湴杩愯屽氢釜铏氭嫙链恒侱alvik铏氭嫙链哄彲镓ц屾枃浠舵牸寮忔槸.dex锛宒ex镙煎纺鏄涓扑负Dalvik
璁捐$殑涓绉嶅帇缂╂牸寮忥纴阃傚悎鍐呭瓨鍜屽勭悊鍣ㄩ熷害链夐檺镄勭郴缁熴
澶у氭暟铏氭嫙链哄寘𨰾琂VM閮芥槸锘轰簬镙堢殑锛岃娈alvik铏氭嫙链哄垯鏄锘轰簬瀵勫瓨鍣ㄧ殑銆备袱绉嶆灦鏋勫悇链変紭锷o纴涓鑸钥岃█锛屽熀浜庢爤镄勬満鍣ㄩ渶瑕佹洿澶氭寚浠わ纴钥屽熀浜庡瘎瀛桦櫒镄勬満
鍣ㄦ寚浠ゆ洿澶с俤x鏄涓濂楀伐鍏凤纴鍙浠ュ皢Java.class杞鎹㈡垚.dex
镙煎纺銆备竴涓猟ex鏂囦欢阃氩父浼氭湁澶氢釜.class銆傜敱浜巇ex链夋椂蹇呴’杩涜屾渶浣冲寲锛屼细浣挎枃浠跺ぇ灏忓炲姞1-4鍊嶏纴浠ODEX缁揿熬銆
Dalvik铏氭嫙链轰緷璧栦簬Linux鍐呮牳鎻愪緵锘烘湰锷熻兘锛屽傜嚎绋嫔拰搴曞眰鍐呭瓨绠$悊銆
3銆丩ibrariesAndroid
鍖呭惈涓涓狢/C搴撶殑闆嗗悎锛屼緵Android绯荤粺镄勫悇涓缁勪欢浣跨敤銆傝繖浜涘姛鑳介氲繃Android镄勫簲鐢ㄧ▼搴忔嗘灦锛坅pplication
framework锛夋毚闇茬粰寮鍙戣呫备笅闱㈠垪鍑轰竴浜涙牳蹇冨簱锛氱郴缁烠搴--镙囧嗳C绯荤粺搴掳纸libc锛夌殑BSD琛岖敓锛岃皟鏁翠负锘轰簬宓屽叆寮廘inux璁惧
濯掍綋搴--锘轰簬PacketVideo镄凮penCORE銆傝繖浜涘簱鏀鎸佹挱鏀惧拰褰曞埗璁稿氭祦琛岀殑阔抽戝拰瑙嗛戞牸寮忥纴浠ュ强闱欐佸浘镀忔枃浠讹纴鍖呮嫭MPEG4銆
H.264銆丮P3銆丄AC銆丄MR銆丣PG銆丳NG鐣岄溃绠$悊--绠$悊璁块梾鏄剧ず瀛愮郴缁熷拰镞犵绅缁勫悎澶氢釜搴旂敤绋嫔簭镄勪簩缁村拰涓夌淮锲惧舰灞
LibWebCore--鏂板纺镄刉eb娴忚埚櫒寮曟搸,椹卞姩Android娴忚埚櫒鍜屽唴宓岀殑web瑙嗗浘SGL--锘烘湰镄2D锲惧舰寮曟搸
3D搴--锘轰簬OpenGLES1.0APIs镄勫疄鐜般傚簱浣跨敤纭浠3D锷犻熸垨鍖呭惈楂桦害浼桦寲镄3D杞浠跺厜镙匜reeType
--浣嶅浘鍜岀煝閲忓瓧浣撴覆镆揝QLite--镓链夊簲鐢ㄧ▼搴忛兘鍙浠ヤ娇鐢ㄧ殑寮哄ぇ钥岃交閲忕骇镄勫叧绯绘暟鎹搴揿紩镎
4銆丄pplicationFramework
阃氲繃鎻愪緵寮鏀剧殑寮鍙戝钩鍙帮纴Android浣垮紑鍙戣呰兘澶熺紪鍒舵瀬鍏朵赴瀵屽拰鏂伴栫殑搴旂敤绋嫔簭銆傚紑鍙戣呭彲浠ヨ嚜鐢卞湴鍒╃敤璁惧囩‖浠朵紭锷裤佽块梾浣岖疆淇℃伅銆佽繍琛屽悗鍙版湇锷°佽剧疆闂归挓銆佸悜鐘舵佹爮娣诲姞阃氱煡绛夌瓑锛屽緢澶氩緢澶氥傚紑鍙戣呭彲浠ュ畬鍏ㄤ娇鐢ㄦ牳蹇冨簲鐢ㄧ▼搴忔墍浣跨敤镄勬嗘灦APIs銆傚簲鐢ㄧ▼搴忕殑浣撶郴缁撴瀯镞ㄥ湪绠鍖栫粍浠剁殑閲岖敤锛屼换浣曞簲鐢ㄧ▼搴忛兘鑳藉彂甯冧粬镄勫姛鑳戒笖浠讳綍鍏朵粬搴旂敤绋嫔簭鍙浠ヤ娇鐢ㄨ繖浜涘姛鑳斤纸闇瑕佹湇浠庢嗘灦镓ц岀殑瀹夊叏闄愬埗锛夈傝繖涓链哄埗鍏佽哥敤鎴锋浛鎹㈢粍浠躲傛墍链夌殑搴旂敤绋嫔簭鍏跺疄鏄涓缁勬湇锷″拰绯荤粺锛屽寘𨰾锛氲嗗浘锛圴iew锛--涓板瘜镄勚佸彲镓╁𪾢镄勮嗗浘闆嗗悎锛屽彲鐢ㄤ簬鏋勫缓涓涓搴旂敤绋嫔簭銆傚寘𨰾鍖呮嫭鍒楄〃銆佺绣镙笺佹枃链妗嗐佹寜阍锛岀敋镊虫槸鍐呭祵镄勭绣椤垫祻瑙埚櫒鍐呭规彁渚涜咃纸ContentProviders锛--浣垮簲鐢ㄧ▼搴忚兘璁块梾鍏朵粬搴旂敤绋嫔簭锛埚傞氲褰曪级镄勬暟鎹锛屾垨鍏变韩镊宸辩殑鏁版嵁璧勬簮绠$悊鍣锛圧esourceManager锛--鎻愪緵璁块梾闱炰唬镰佽祫婧愶纴濡傛湰鍦板寲瀛楃︿覆銆佸浘褰㈠拰甯冨眬鏂囦欢阃氱煡绠$悊鍣锛圡anager锛--浣挎墍链夌殑搴旂敤绋嫔簭鑳藉熷湪鐘舵佹爮鏄剧ず镊瀹氢箟璀﹀憡娲诲姩绠$悊鍣锛圆ctivityManager锛--绠$悊搴旂敤绋嫔簭鐢熷懡锻ㄦ湡,鎻愪緵阃氱敤镄勫艰埅锲为锷熻兘
5銆丄ndroid瑁呴厤涓涓镙稿绩搴旂敤绋嫔簭闆嗗悎锛屽寘𨰾鐢靛瓙闾浠跺㈡埛绔銆丼MS绋嫔簭銆佹棩铡嗐佸湴锲俱佹祻瑙埚櫒銆佽仈绯讳汉鍜屽叾浠栬剧疆銆傛墍链夊簲鐢ㄧ▼搴忛兘鏄鐢↗ava缂栫▼璇瑷鍐欑殑銆傛洿锷犱赴瀵岀殑搴旂敤绋嫔簭链夊緟鎴戜滑铡诲紑鍙戯紒浠庝笂闱㈡垜浠鐭ラ亾Android镄勬灦鏋勬槸鍒嗗眰镄勶纴闱炲父娓呮榈锛屽垎宸ュ緢鏄庣‘銆侫ndroid链韬鏄涓濂楄蒋浠跺爢杩(Softwaretack)锛屾垨绉颁负銆岃蒋浠惰凯灞傛灦鏋勚嶏纴杩灞备富瑕佸垎鎴愪笁灞傦细镎崭綔绯荤粺銆佷腑闂翠欢銆佸簲鐢ㄧ▼搴忋备粠涓婇溃鎴戜滑涔熺湅鍒颁简寮婧愮殑锷涢噺锛屼竴涓涓镡熸倝镄勫紑婧愯蒋浠跺湪杩欓噷璐$尞浜呜嚜宸辩殑涓浠藉姏閲忋
⑦ 细谈在 Android 开发中 MVVM 与 AOP 的框架设计
MVVM可以被视为MVP的升级,其核心是ViewModel,它整合了View的数据模型和Presenter的功能,通过Data Binding实现View与ViewModel之间的交互,增强了数据的双向绑定,降低了视图与控制层的耦合性,从而实现更加清晰的职责分离。实际开发中,并不需要纠结是否采用MVC、MVP或MVVM,重要的是实现模型与视图的解耦,提升代码的可维护性和可测试性。
MVVM模式从MVP进一步发展而来,解决了MVP模式中Presenter直接操作View接口的问题,通过Data Binding实现数据的直接绑定,避免了重复的showData等操作,使得代码更加简洁优雅。MVVM模式强调Model、View和ViewModel之间的分离,而共同的目标是实现用户交互和数据变更通知的高效处理。
在软件架构设计中,Controller和Presenter负责逻辑代码的管理,根据Presenter和View对逻辑代码的分担程度,形成了被动View和监督Controller两种模式。ViewModel则作为Model与View之间的桥梁,将Model和View解耦,使得应用的模块化更加清晰,避免了不相关的代码混杂在一起。
在实际开发中,开发者通常会结合多种模式,以满足不同场景的需求。例如,Model、View和ViewModel之间的数据传输可能会采用更灵活的方式,以减少不必要的性能开销。通过将核心关注点与横切关注点分离,开发者能够更加专注于业务逻辑的实现,同时保证代码的可重用性和可维护性。
AOP(面向切面编程)作为OOP(面向对象编程)的补充和完善,提供了一种灵活的方式来处理横切关注点,如日志、安全性、异常处理等。通过将这些通用的代码封装为“Aspect”(方面),开发者可以在不修改核心业务逻辑的前提下,增强系统的功能和性能,提高代码的复用性和可维护性。
在Android开发中,通过采用MVVM架构和AOP技术,开发者可以构建更加模块化、可扩展和易于维护的应用。通过合理的架构设计,将应用的逻辑和功能分层,能够有效提高开发效率,同时确保应用在不断变化的市场需求面前具有良好的适应性。
总结而言,MVVM与AOP的框架设计是现代Android应用开发中的关键组成部分,通过将应用逻辑与界面展示分离,以及利用AOP技术处理横切关注点,开发者能够构建出更加健壮、可维护且易于扩展的应用。掌握这些技术对于提升开发者的职业技能和应对复杂项目挑战具有重要意义。