| 关键词: nbsp Android 一个 Gradle 结构 activity 同时 Fragment 文件 Fragments |
从 Futurice 公司Android开发者中学到的经验。 遵循以下准则,避免重复发明轮子。若您对开发iOS或Windows Phone 有兴趣, 请看 iOS Good Practices 和 Windows client Good Practices 这两篇文章。 摘要
Android SDK将你的 Android SDK 放在你的home目录或其他应用程序无关的位置。 当安装有些包含SDK的IDE的时候,可能会将SDK放在IDE同一目录下,当你需要升级(或重新安装)IDE或更换的IDE时,会非常麻烦。 此外,若果你的IDE是在普通用户,不是在root下运行,还要避免吧SDK放到一下需要sudo权限的系统级别目录下。 构建系统你的默认编译环境应该是 Gradle . Ant 有很多**,也很冗余。使用Gradle,完成以下工作很方便:
同时,Android Gradle插件作为新标准的构建系统正在被Google积极的开发。 工程结构有两种流行的结构:老的Ant & Eclipse ADT 工程结构,和新的Gradle & Android Studio 工程结构,你应该选择新的工程结构,如果你的工程还在使用老的结构,考虑放弃吧,将工程移植到新的结构。 老的结构: old-structure ├─ assets ├─ libs ├─ res ├─ src │ └─ com/futurice/project ├─ AndroidManifest.xml ├─ build.gradle ├─ project.properties └─ proguard-rules.pro 新的结构 new-structure
├─ library-foobar
├─ app
│ ├─ libs
│ ├─ src
│ │ ├─ androidTest
│ │ │ └─ java
│ │ │ └─ com/futurice/project
│ │ └─ main
│ │ ├─ java
│ │ │ └─ com/futurice/project
│ │ ├─ res
│ │ └─ AndroidManifest.xml
│ ├─ build.gradle
│ └─ proguard-rules.pro
├─ build.gradle
└─ settings.gradle主要的区别在于,新的结构明确的分开了’source sets’ ( 你可以做到,例如,添加源组‘paid’和‘free’在src中,这将成为您的应用程序的付费和免费的两种模式的源代码。 你的项目引用第三方项目库时(例如,library-foobar),拥有一个**包名 然后 Gradle 配置常用结构参考 Google’s guide on Gradle for Android 小任务除了(shell, Python, Perl, etc)这些脚本语言,你也可以使用Gradle 制作任务。 更多信息请参考 Gradle’s documentation 。 密码在做版本release时你app的 不要做这个 . 这会出现在版本控制中。 signingConfigs {
release {
storeFile file("myapp.keystore")
storePassword "password123"
keyAlias "thekey"
keyPassword "password789"
}
}而是,建立一个不加入版本控制系统的 KEYSTORE_PASSWORD=password123 KEY_PASSWORD=password789 那个文件是gradle自动引入的,你可以在 signingConfigs {
release {
try {
storeFile file("myapp.keystore")
storePassword KEYSTORE_PASSWORD
keyAlias "thekey"
keyPassword KEY_PASSWORD
}
catch (ex) {
throw new InvalidUserDataException("You should define KEYSTORE_PASSWORD and KEY_PASSWORD in gradle.properties.")
}
}
}使用 Maven 依赖方案代替使用导入jar包方案如果在你的项目中你明确使用率 jar文件,那么它们可能成为永久的版本,如 这个问题Maven很好的解决了,这在Android Gradle构建中也是推荐的方法。你可 以指定版本的一个范围,如 dependencies {
compile 'com.netflix.rxjava:rxjava-core:0.19.+'
compile 'com.netflix.rxjava:rxjava-android:0.19.+'
compile 'com.fasterxml.jackson.core:jackson-databind:2.4.+'
compile 'com.fasterxml.jackson.core:jackson-core:2.4.+'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.4.+'
compile 'com.squareup.okhttp:okhttp:2.0.+'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.+'
}IDEs and text editorsIDE集成开发环境和文本编辑器无论使用什么编辑器,一定要构建一个良好的工程结构编辑器每个人都有自己的 选择,让你的编辑器根据工程结构和构建系统运作,那是你自己的责任。 当下首推 Android Studio ,因为他是由谷歌开发,最接近Gradle,默认使用最新的工程结构,已经到beta阶段 (目前已经有release 1.0了),它就是为Android开发定制的。 你也可以使用 Eclipse ADT ,但是你需要对它进行配置,因为它使用了旧的工程结构 和Ant作为构建系统。你甚至可以使用纯文版编辑器如Vim,Sublime Text,或者Emacs。如果那样的话,你需要使用Gardle和 不适合你,你只是使用命令行构建工程,或迁移到Android Studio中来吧。 无论你使用何种开发工具,只要确保Gradle和新的项目结构保持官方的方式构建应用程序,避免你的编辑器配置文件加入到版本控制。例如,避免加入Ant 特别如果你改变Ant的配置,不要忘记保持 类库Jackson 是一个将java对象转换成JSON与JSON转化java类的类库。 Gson 是解决这个问题的流行方案,然而我们发现Jackson更高效,因为它支持替代的方法处理JSON:流、内存树模型,和传统JSON-POJO数据绑定。不过,请记住, Jsonkson库比起GSON更大,所以根据你的情况选择,你可能选择GSON来避免APP 65k个方法**。其它选择: Json-smart and Boon JSON 网络请求,缓存,图片执行请求后端服务器,有几种交互的解决方案,你应该考虑实现你自己的网络客户端。使用 Volley 或 Retrofit 。Volley 同时提供图片缓存类。若果你选择使用Retrofit,那么考虑使用Picasso 来加载图片和缓存,同时使用 OkHttp 作为高效的网络请求。Retrofit,Picasso和OkHttp都是有同一家公司开发(注: 是由 Square 公司开发),所以它们能很好的在一起运行。 OkHttp 同样可以和Volley在一起使用 Volley . RxJava是函数式反应性的一个类库,换句话说,能处理异步的事件。 这是一个强大的和有前途的模式,同时也可能会造成混淆,因为它是如此的不同。 我们建议在使用这个库架构整个应用程序之前要谨慎考虑。 有一些项目是使用RxJava完成的,如果你需要帮助可以跟这些人取得联系: Timo Tuominen, Olli Salonen, Andre Medeiros, Mark Voit, Antti Lammi, Vera Izrailit, Juha Ristolainen. 我们也写了一些博客: [3] , [4] . 如若你之前有使用过Rx的经历,开始从API响应应用它。 另外,从简单的UI事件处理开始运用,如单击事件或在搜索栏输入事件。 若对你的Rx技术有信心,同时想要将它应用到你的整体架构中,那么请在复杂的部分写好Javadocs文档。 请记住其他不熟悉RxJava的开发人员,可能会非常难理解整个项目。 尽你的的全力帮助他们理解你的代码和Rx。 Retrolambda 是一个在Android和预JDK8平台上的使用Lambda表达式语法的Java类库。 它有助于保持你代码的紧凑性和可读性,特别当你使用如RxJava函数风格编程时。 使用它时先安装JDK8,在Android Studio工程结构对话框中把它设置成为SDK路径,同时设置 然后在工程根目录下配置 build.gradle: dependencies {
classpath 'me.tatarka:gradle-retrolambda:2.4.+'
}同时在每个module 的build.gradle中添加 apply plugin: 'retrolambda'
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
retrolambda {
jdk System.getenv("JAVA8_HOME")
oldJdk System.getenv("JAVA7_HOME")
javaVersion JavaVersion.VERSION_1_7
}Android Studio 提供Java8 lambdas表带是代码提示支持。如果你对lambdas不熟悉,只需参照以下开始学习吧:
当心dex方法数**,同时避免使用过多的类库Android apps,当打包成一个dex文件时,有一个65535个应用方法强硬** [1] [2] [3] 。 当你突破65k**之后你会看到一个致命错误。因此,使用一个正常范围的类库文件,同时使用 dex-method-counts 工具来决定哪些类库可以再65k**之下使用,特别的避免使用Guava类库,因为它包含超过13k个方法。 Activities and FragmentsFragments 应该作为你实现UI界面默认选择。你可以重复使用Fragments用户接口来 组合成你的应用。我们强烈推荐使用Fragments而不是activity来呈现UI界面,理由如下:
很不幸,我们不建议广泛的使用嵌套的 fragments ,因为 有时会引起 matryoshka bugs 。我们只有当它有意义(例如,在水平滑动的ViewPager在 像屏幕一样fragment中)或者他的确是一个明智的选择的时候才广泛的使用fragment。 在一个架构级别,你的APP应该有一个**的activity来包含绝大部分业务相关的fragment。你也可能还有一些辅助的activity ,这些辅助的activity与主activity 通信很简单**在这两种方法
Java 包结构Android 应用程序在架构上大致是Java中的 Model-View-Controller 结构。 在Android 中 Fragment和Activity通常上是控制器类(http://www.informit.com/articles/article.aspx?p=2126865). 换句话说,他们是用户接口的部分,同样也是Views视图的部分。 正是因为如此,才很难严格的将fragments (或者 activities) 严格的划分成 控制器controlloers还是视图 views。 最还是将它们放在自己单独的 若果你规划有2到3个以上的activity,那么还是同样新建一个 然而,这种架构可以看做是另一种形式的MVC, 包含要被解析API响应的JSON数据,来填充的POJO的 和一个 适配器Adapter是在数据和视图之间。然而他们通常需要通过 所以你可以将 一些控制器角色的类是应用程序级别的,同时是接近系统的。 这些类放在 一些繁杂的数据处理类,比如说”DateUtils”,放在 与后端交互负责网络处理类,放在 总而言之,以最接近用户而不是最接近后端去安排他们。 com.futurice.project ├─ network ├─ models ├─ managers ├─ utils ├─ fragments └─ views ├─ adapters ├─ actionbar ├─ widgets └─ notifications 资源文件 Resources
组织布局文件若果你不确定如何排版一个布局文件,遵循一下规则可能会有帮助。
|
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|