android系统架构 开发有什么好的架构么

(点击上方公众号,可快速关注)英文:Saúl Molinero译者:伯乐在线 - Popo网址:/82051/本文是介绍有关如何搭建一个可扩展、维护和测试的Android环境系列教程的第一篇。在这一系列中我会涉及到一些Android开发者会用到的模式和库。应用场景我将基于一个简单的电影分类项目作为示例。在这个项目中,分类信息可以用视图(Views)展示出来。影片信息可通过叫做themoviedb的公共API获取,你可以在Apiary中查阅相关说明文档。这个项目是基于MVP(Model View Presenter)模式进行设计的,以及一些Material Design指南中的实现,如传输(transitions)、结构、动画、色彩等……所有的代码都可以从Github上获得,所以请随便查看。另外这里还有一个视频(注:需翻墙)演示。架构:架构设计采用MVP模式,它由MVC模式演变而来。此模式是将应用层中的业务逻辑抽象出来,这在Android中十分重要。因为Android本身的框架将这一层与数据层耦合在了一起,一个明显的例子就是Adapter或者CursorLoader。这种架构的方便之处在于,视图的变化无需涉及业务逻辑层和数据层的修改。可在领域内方便地进行复用,或者在不同的数据源间进行切换(如数据库或REST API)。总览架构可分为三个主要层次:展现层模型(数据)层领域层展现层展现层负责显示图形界面并且为它提供数据。模型(数据)层模型层负责提供信息(数据),它不需要知道领域层和展现层,它只是单纯地实现与数据库的连接和接口(与REST API或者其它任何存储方式)。在这一层中也实现应用的实体,如影片、类别等类。领域层领域层与展现层完全分开,是单独存在的,它只于应用程序的业务逻辑相关。实现领域层与数据层作为单独的Java模块存在,展现层则表现为Android应用程序模块。此外还有一个公共模块用于共享库和工具类。领域模块领域模块承载了用例和它们的实现,即应用程序的业务逻辑。这个模块是完全独立于Android框架的。它依赖于模型模块和公共模块。一个用例可能是指获取各种类型影片的总排名、查看哪一类影片被请求得最多等。用例可能需要获得信息并对其进行计算,这些信息是由模型(Model)提供的。dependencies {
compile project (':common')
compile project (':model')}模型模块模型模块负责管理信息、选择、保存、删除等等。在第一个版本中我仅仅管理一些与影片信息API相关的内容。另外它也实现了实体,如TvMovie —— 表示一部影片。这个模块只与公共模块相依赖,引用的库是用来管理请求API的。这里我使用了Square的Retrofit,我会在以后的文章中再讨论Retrofit的。dependencies {
compile project(':common')
compile 'com.squareup.retrofit:retrofit:1.9.0'}表现模块就是Android应用程序本身,包括资源、assets、逻辑等等……它通过运行用例的方式与领域模块进行交互,例如获得某一时间的影片列表、请求一个影片数据等。这个模块中有展现与视图。每个Activity、Fragment、Dialog都实现一个MVPView接口,它定义了在视图上用于显示、隐藏和“画”出信息的操作。例如视图PopularMoviesView,定义了显示当前影片列表的操作,它被MoviesActivity所实现。public interface PopularMoviesView extends MVPView {
void showMovies (List&TvMovie& movieList);
void showLoading ();
void hideLoading ();
void showError (String error);
void hideError ();}MVP模式指出视图应尽可能地简单,它的行为应该由展现器(presenter)来决定。public class MoviesActivity extends ActionBarActivity implements
PopularMoviesView, ... {
private PopularShowsPresenter popularShowsP
private RecyclerView popularMoviesR
private ProgressBar loadingProgressB
private MoviesAdapter moviesA
private TextView errorTextV
protected void onCreate(Bundle savedInstanceState) {
popularShowsPresenter = new PopularShowsPresenterImpl(this);
popularShowsPresenter.onCreate();
protected void onStop() {
super.onStop();
popularShowsPresenter.onStop();
public Context getContext() {
public void showMovies(List&TvMovie& movieList) {
moviesAdapter = new MoviesAdapter(movieList);
popularMoviesRecycler.setAdapter(moviesAdapter);
public void showLoading() {
loadingProgressBar.setVisibility(View.VISIBLE);
public void hideLoading() {
loadingProgressBar.setVisibility(View.GONE);
public void showError(String error) {
errorTextView.setVisibility(View.VISIBLE);
errorTextView.setText(error);
public void hideError() {
errorTextView.setVisibility(View.GONE);
...}用例将被展现器执行,它们将接收应答并且管理视图的行为。public class PopularShowsPresenterImpl implements PopularShowsPresenter {
private final PopularMoviesView popularMoviesV
public PopularShowsPresenterImpl(PopularMoviesView popularMoviesView) {
this.popularMoviesView = popularMoviesV
public void onCreate() {
popularMoviesView.showLoading();
Usecase getPopularShows = new GetMoviesUsecaseController(GetMoviesUsecase.TV_MOVIES);
getPopularShows.execute();
public void onStop() {
public void onPopularMoviesReceived(PopularMoviesApiResponse popularMovies) {
popularMoviesView.hideLoading();
popularMoviesView.showMovies(popularMovies.getResults());
}}通信在这个项目中我选择了一个消息总线系统(Message Bus system),这个系统对广播事件或者建立组件间的通信非常有用(尤其是对后者)。基本上说,事件就是由总线被发送出来,然后由感兴趣的类订阅并接收处理该事件。使用这个系统会极大地降低模块间的耦合。实现系统总线,我使用Square的Otto库。我定义了两个总线,分别用于用例与REST API的通信,以及发送事件给展现层。REST_BUS将使用后台线程处理事件,而UI_BUS则使用默认线程(即主线程)来发送事件。public class BusProvider {
private static final Bus REST_BUS = new Bus(ThreadEnforcer.ANY);
private static final Bus UI_BUS = new Bus();
private BusProvider() {};
public static Bus getRestBusInstance() {
return REST_BUS;
public static Bus getUIBusInstance () {
return UI_BUS;
}}这个类被公共模块所管理,因为所用模块都通过访问它来与总线交互。dependencies {
compile 'com.squareup:otto:1.3.5'}最后,考虑下面的示例,用户打开应用程序然后最流行的影片就被展现出来了。当Android视图中的onCreate方法被调用时,展现器在UI_BUS上订阅所需接收的事件。当onStop被调用时取消订阅。然后,展现器运行GetMovieUseCase用例。
public void onCreate() {
BusProvider.getUIBusInstance().register(this);
Usecase getPopularShows = new GetMoviesUsecaseController(GetMoviesUsecase.TV_MOVIES);
getPopularShows.execute();
public void onStop() {
BusProvider.getUIBusInstance().unregister(this);
}}接收事件时,展现器必须实现一个方法——它带有与传递过来的事件所相同的数据类型参数,并且必须使用标注@Subscribe。
@Subscribe
public void onPopularMoviesReceived(PopularMoviesApiResponse popularMovies) {
popularMoviesView.hideLoading();
popularMoviesView.showMovies(popularMovies.getResults());
}资源:Architecting Android…The clean way? - Fernando CejasEffective Android UI - Pedro Vicente Gómez SanchezReactive programming and message buses for mobile - Csaba PalfiThe clean architecture - Uncle BobMVP Android - Antonio Leiva安卓应用频道微信号:AndroidPD打造东半球最好的 安卓技术 微信号--------------------------------------商务合作QQ:投稿网址:安卓应用频道(androidpd) 
 文章为作者独立观点,不代表微头条立场
的最新文章
看到很多人提问非科班该如何学习编程,其实科班也基本靠自学。有句话叫“师傅领进门修行靠个人”,再厉害的老师能教你的东西都是很有限的,真正的修行还是要靠自己。线程是程序员进阶的一道重要门槛。对于移动开发者来说,“将耗时的任务放到子线程去执行,以保证UI线程的流畅性”是线程编程的第一金科玉律,但这条铁则往往也是UI线程不怎么流畅的主因。Android的体系架构鼓励组件重用,今天我将分享一些关于Android架构和开发库信息,供开发者创建下一个杀手级应用使用。准备好了吗?请继续下面的阅读!自己android开发也有些年头了,每每回想起作为初学者的时候自己写的代码,自己会有种喷自己的冲动,代码写的太渣了。因此想着自己要总结下以前代码中的不合理的地方,希望能给初学者一些帮助。我希望这是一个系列的文章。React Native允许我们运用React和 Relay提供的声明式的编程模型,写JavaScript来构建我们的 iOS 和 Android 的应用。这样的做法使得我们的代码更精简,更容易理解和阅读,这些代码还可以在多个平台共享。最近一直在想着能否有一种更好的方案解决:Android中Activity与Fragment之间通信的问题,能让Fragment的复用性高,性能还有好(不用反射),代码好维护,不需要为每对Activity和Fragment之间定义接口而发愁。7.自定义view中 如果onMeasure方法 没有对wrap_content 做处理 会发生什么?为什么Android View绘制13问13答本文主要是根据核心思想的实践,实践原理是通过CustomRootLayout布局变化,来获知是否是键盘引起的真正的布局变化,进而处理到接下来PanelLayout的onMersure中。下面我们就来逐一实现这些目标。首先要对MyFragment类进行完全保留可以使用keep关键字,keep后声在上一篇文章当中,我们学习了Android程序反编译方面的知识,包括反编译代码、反编译资源、以及重新打包等内容。通过这些内容我们也能看出来,其实我们的程序并没有那么的安全。之前一直有犹豫过要不要写这篇文章,毕竟去反编译人家的程序并不是什么值得骄傲的事情。不过单纯从技术角度上来讲,掌握反编译功能确实是一项非常有用的技能,可能平常不太会用得到,但是一旦真的需要用到的了,而你却不会的话,那就非常头疼了。此文面向开发者,开发主管,总监,CEO等。IssueRegistry提供需要被检测的Issue列表public class MTIssueRegistAndroid Lint是Google提供给Android开发者的静态代码检查工具。使用Lint对Android工程代码进行扫描和检查,可以发现代码潜在的问题,提醒程序员及早修正。做Android久了,就会踩很多坑,被坑的多了就有经验了,闲暇之余整理了部分,现挑选一些重要或者偏门的“小”经验做个记录。三层架构中,数据层和业务层都已经做过了简单的分享,最后,就剩下展示层了。本篇就给各位分享下我在展示层设计方面的一些经验心得。业务层其实并不复杂,但是大部分开发人员对其职责并没有理解清楚,从而使其沦落为一个数据中转站。我之前分享过的Android项目重构之路系列中提到的核心层,其实就是这里所讲的业务层。一个App,从根本上来说,就是对数据的处理,包括数据从哪里来、数据如何组织、数据怎么展示,从职责上划分就是:数据管理、数据加工、数据展示。相对应的也就有了三层架构:数据层、业务层、展示层。本文就先讲讲数据层的设计。当你做架构设计时,必然会面临技术选型的抉择,不同的技术方案,架构也可能完全不同。有哪些技术选型需要做决策呢?比如,App是纯原生开发,还是Web App,抑或Hybrid App?本文根据我的一些经验对某些方面做点总结分享。过去一年多,我仗着自己年轻的身体,对计算机的热情,在工作上多使用蛮力,仿佛一个使用朴素算法实现的程序,吭哧吭哧跑个不停。一开始,朴素算法还能在指定的工作时间内完成任务;老外的书,讲了很详细,第一遍阅读的时候感觉有些吃力。做了一些项目回头看,确实收获很大。欢迎阅读《安卓开发的小技巧》系列的第三篇!界面是 Android 应用中直接影响用户体验最关键的部分。如果代码实现得不好,界面容易发生卡顿且导致应用占用大量内存。(点击上方公众号,可快速关注)来源:solidot链接:http://www.solidot.org/sto(点击上方公众号,可快速关注)来源:How my sister n my girlfriend learne(点击上方公众号,可快速关注)来源:Charlie译文:伯乐在线 - Jyy链接:http://androi(点击上方公众号,可快速关注)来源:Keegan小钢链接:http://keeganlee.me/post/最近在项目中需要使用一种高效数据序列化的工具。碰巧在几篇文章中都提到了 FlatBuffers 这个库。特别是 Android 性能优化典范第四季1中两个对比图,让我对它产生浓厚的兴趣。有思路我们在回顾下ConfirmDialogFragment中onAttach的方法的关键代码:
@Ov内存泄露是在Android开发中尤其要重视的一个问题,对开发人员开说,这是一个很容易犯也很常见的错误。曾经我也是一个原教旨主义者,认为除了基于原生Android外的安卓机都是异端。这些年里,写过Android App代码也做过Android App的产品经理,历尽洗礼,终于恢复了理智的光环,要重新思考一下什么才是真正的Android。Material Design 是Google在2014年开发者大会上首次提出的设计语言(风格)。其设计初衷旨在为手机、平板、台式机和可能的“其他平台”提供一致、广泛的视觉与交互。Android 事件分发机制源码和实例解析在项目开发中,我们或多或少都会用到数据库。在Android中,我们一般使用SQLite,因为Android在android.database.sqlite包封装了很多SQLite操作的API。Android系统是运行在Java虚拟机上的,作为嵌入式设备,内存往往非常有限,了解Android的垃圾回收机制,可以有效的防止内存泄露问题或者OOM问题。本文作为入门文章,将浅显的讨论垃圾回收与内存泄露的原理。从事互联网有几年时间,接触到的技术人员大多有以下问题:
① 木讷、没礼貌;
② 合作做事情不喜欢汇报进度;
③ 不回QQ,回的话就重现第1点以下内容来自多个开源项目的整理和自己的项目积累……上一篇文章我们使用第三种方法来实现延迟加载。不过上一篇写的比较简单,只是讲解了如何去实现,这一篇就来讲一下为何要这么做,以及这么做后面的原理。其中会涉及到一些 Android 中的比较重要的类。在 Android 开发中。应用启动速度是一个非常重要的点,应用启动优化也是一个非常重要的过程。对于应用启动优化。其实核心思想就是在启动过程中少做事情。具体实践的时候怎么弄,无非就下面几种。由前Google工程师创办的Jide Technology发布了alpha版的 Remix OS 2.0 。(点击上方公众号,可快速关注)来源:infoQ译文:伯乐在线 - 小谢
链接:http://www.infandroidpd分享安卓应用相关内容,包括:安卓应用开发、设计和推广。热门文章最新文章androidpd分享安卓应用相关内容,包括:安卓应用开发、设计和推广。内容字号:
段落设置:
字体设置:
精准搜索请尝试:
x86架构手机跑安卓好吗?
来源:电脑王作者:R.F.责编:悠悠
华硕低价位手机ZenFone一推出就掀起市场话题,许多人也对ZenFone所采用的Intel Atom处理器有所意见,深怕其相容性问题无法正确执行应用程式App,这究竟是怎么回事呢?
Intel近几年一直很想进军手机或是平板的移动市场,特别是采用操作系统这一块大饼(忘了MeeGo吧!),所采取的战术便是尽量将低Atom系列处理器的功耗,使其符合手机长时间待机的要求,实际使用第一世代的产品即为Atom Z24x0系列,而Asus ZenFone则是采用第二世代的产品,Atom Z25x0系列。相较于前代,Z25x0变成双核心四处理器,GPU的部分则是从PowerVR SGX540大幅升级至PowerVR SGX544MP2。
ARM在手机上奠定基础
Android起初发展之际,并没有限定在何种平台上执行,只不过在当时的时空环境背景因素下,第一台市售Android手机HTC Dream(G1)采用了Qualcomm MSM7201A,这是款ARMv6指令集的产品。
之后的情形大家都晓得了,ARM开始如日中天,绝大部分Android手机皆采用相容ARM指令集的应用处理器(少数为MIPS指令集),苹果的和系列产品更是全程采用。在这后PC时代,Intel于移动设备市场的影响力实在不大,过去还有XScale这个产品线可在PDA上占有一席之地,甚至它的高效能吸引了不少人指定购买,但之后Intel把XScale卖给了Marvell,也就没有适合手机使用的处理器了。
Atom被抓来打ARM
在2011年9月时,Intel和Google共同发表声明,两者将一同最佳化未来Android版本在x86系统上的表现;也就是说,原本用在netbook和UMPC上的Atom处理器,现在也要进军手机市场了。
不过针对半路杀出的Intel x86架构,市场上已经有许多应用程式针对ARM最佳化,若是像采用MIPS架构的Android装置一样,程式相容性不佳的话,大概也就能直接判断Atom出师未捷身先死,所以Intel制作了Binary Translation这个转体中介转议层,用以相容ARM最佳化的程式。
▲如果Android程式以Java写成并丢入Dalvik虚拟机执行,在使用Intel Atom的Android手机中执行绝大部分没有问题。
x86架构如何相容ARM程式
要了解Binary Translation的原理,首先要了解Android程序是如何运作的。起先Android程序皆使用Eclipse开发环境和Android SDK,以Java语言写成,经过封装转换成Bytecode后丢入Android装置中,1个称为Dalvik的虚拟机器中执行。
不过稍微了解程序运作的人都知道,虚拟机虽然能够带来跨平台、不限硬件规格执行的好处,但同时也会因为虚拟机器的转换,降低执行效率。因此后来Andriod除了SDK(Software Development Kit)以外,也推出NDK(Native Development Kit),让开发人员能够绕过Dalvik转译造成的效能损失,同时又能够使用Java以外的程序语言撰写(如C/C++)。
由于程式经过NDK转译之后,出来的东西是硬件能够直接执行的机器码,执行效率较高,但同时带来了相容性的问题――编译给ARM处理器的机器码一定跟编译给x86处理器的不一样,这就导致Intel的Atom处理器无法正常执行部分程序(通常是3D游戏,因为这些程式对于效能要求较高)。如果Intel放弃掉这些程序,想必消费者绝对无法接受,于是便有了Binary Translation这个中介转译层,可把ARM的机器码转给x86执行。
▲Intel Binary Translator用来转换那些使用ARM NDK的应用程式,让他们能够在Intel Atom上正确执行。
ARM本身也有相容性问题
有了Binary Translation的关系,所以Intel Atom能够执行已对ARM处理器编译的程序,但是效能会比在ARM处理器执行时略为下降,同时此Binary Translation也并非100%完全相容,偶尔也会有无法执行或是执行到一半跳出的情况。
但也别以为ARM本身不会出现相容性问题,因为ARM采用授权方式,因此各家处理器的GPU部分并不相同,例如Qualcomm使用自家的Adreno、NVIDIA使用GeForce ULP、Samsung使用ARM的Mali或是PowerVR的SGX,由于GPU对于规格的支援度不同(如材质压缩格式),导致各方也必须为不同的应用处理器推出不同的版本,这现象在3D游戏中特别严重。
开发商态度才是关键
目前Android市场上还是以ARM处理器的手机为大宗,如果开发商无力支持各平台,当然会以市占最大的装置作为考量,以便在最小成本中谋取最大利益,有而外的经费才去针对不同的硬件调整程序码。
但相较于应用程式相容性,小编其实比较在意Intel Atom的续航力,目前市面上采用Intel Atom的手机都还在Z24x0和Z25x0的规格,就笔者的测试经验来说,续航力普遍都比采用ARM处理器的手机短。
▲以Asus ZenFone 5(版本号码ASUS_T00F_TW_user_.3.2.935705)为例,笔者只有遇到Basemark X 1.1无法正确执行而已。微信搜索“IT之家”关注抢6s大礼!下载IT之家客户端()也可参与评论抽楼层大奖!
软媒旗下软件:||||||||
IT之家,软媒旗下科技门户网站 - 爱科技,爱这里。
Copyright (C) , All Rights Reserved.
版权所有 鲁ICP备号Android 开发有什么好的架构么_百度知道
Android 开发有什么好的架构么
提问者采纳
如何抽象,如何接口,尽量将代码写的漂亮些,如何实现可扩展。移动终端单打独斗的特点也许也注定了代码比起架构更注重完整性和功能性。当时去github疯狂的寻找开源工程读源码,例如架构。低门槛和低要求导致了J2EE程序猿可能要5年才开始考虑的东西移动开发者甚至1年后就开始感到迷茫,但不过多苛求 Android开发。所以现在对这点看的挺淡的。不才的本人与题主相仿,也是在毕业写Android几年后开始从如何实现转而思考怎么更好的实现,但大多找到的也只是“写的很漂亮的代码”而已,或者说移动终端开发的入门易就不可避免的精通难
Android|HTML5|iOS培训名师面授
主营:Android培训、HTML5培训、iOS培训
其他类似问题
为您推荐:
其他1条回答
主要有以下模块:
(1) JSON,图像等的异步下载;
(2) 网络请求的排序(scheduling)
(3) 网络请求的优先级处理
(5) 多级别取消请求
(6) 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)2、android-async-http
主要有以下模块:
(1) 在匿名回调中处理请求结果
(2) 在UI线程外进行http请求
(3) 文件断点上传
(4) 智能重试
(5) 默认gzip压缩
(6) 支持解析成Json格式
(7) 可将Cookies持久化到SharedPreferences 3、Afinal框架
主要有四大模块:
(1) 数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。
(2) 注解模块:android中的ioc框架,完全注解方式就可以进行UI绑定和事件绑定。无需findViewById和setClickListener等。
(3) 网络模...
android的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 android 开发架构 mvc 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信