眼角语言

制止WebView的客户端侧处理,并知道它大概引致内部存款和储蓄器泄漏

毫不忘了,欲望若不与实现欲望的能力相称,那就是百转千回的忿忿不平。不要让每种灰姑娘都做着公主的梦,那样当她在蒙满灰尘的地下室擦地时,只好想起亮闪闪的钻石和皇冠,未免也太残暴。

Resources 资源

命名 服从类型前缀惯例,像是 type_foo_bar.xml. Examples:
fragment_contact_details.xml, view_primary_button.xml,
activity_main.xml.

组织 layout XMLs. 假若你不明确什么格式化 layout XML,
以下惯例会具备帮衬:

  • 三个属性一行,4 空格缩进
  • android:id 总是作为首个属性
  • android:layout_**** 那类属性放在最上边
  • style 属性放在最上面
  • Tag closer /> 拥有自身的一行, 以使顺序清晰和添加属性别变化得简单
  • 与其使用硬编码 android:text, 不如考虑使用布置时属性 Designtime
    attributes

    ,其受 Android Studio支持.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <TextView
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="@string/name"
        style="@style/FancyText"
        />

    <include layout="@layout/reusable_part" />

</LinearLayout>

作为二个经历法则,android:layout_****应该在layout
XML中定义,同时其它的习性android:****应当放在style
XML中。那条法则会有不一样,但总体而言工作得很好。这一个想法是为了仅将layout
(positioning, margin, sizing)和content属性放在layout files中,而外观详情
(colors, padding, font) 放在 styles files中。

那个例外是:

  • android:id 鲜明应该置身 layout files 中
  • android:orientation 属性对于 LinearLayout 来说一般 放在 layout
    files 中更有意义
  • android:text 应该置身 layout files 中因为它定义了 content
  • 稍许情形下让 style 来定义 android:layout_width
    android:layout_height 常量会很有用,但暗许情况下它们应该出未来layout files 中

使用 styles. 差不多每1个连串都亟需体面地利用 style,因为对于 view
来说具有重复的外观是充足常见的事,看上边那一个事例:

<style name="ContentText">
    <item name="android:textSize">@dimen/font_normal</item>
    <item name="android:textColor">@color/basic_black</item>
</style>

该 style 被用于 TextViews:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/price"
    style="@style/ContentText"
    />

你很恐怕须求为buttons做一些同样的事,不要在此地停下。从宏观角度上提炼出一组相关联的、重复的android:****属性到一个集体的
style 中去。

把叁个大的 style 文件分割成五个
您不用拘泥于单个 styles.xml 文件。 Android SDK
协助任何不吻合这一命名规则的文件,关于文件名
styles什么魔法也尚未,起效果的是文件中的 XML tags <style>
。因而你能享有那样命名的style文件 styles.xml, styles_home.xml,
styles_item_details.xml, styles_forms.xml。 不像 resource
目录那样命名对创设系统具备意义, res/values
目录下的文件命名完全能够私下。
注:是的,你能够在strings.xml中放color能源,ResourceManager通过照射能够找到它。

colors.xml 是二个颜色调色板
你的colors.xml中毫无放别的东西,只要求映射颜色名到贰个XC90GBA值。不要为不相同档次的buttons定义宝马X3GBA值。

Don’t do this:

<resources>
    <color name="button_foreground">#FFFFFF</color>
    <color name="button_background">#2A91BD</color>
    <color name="comment_background_inactive">#5F5F5F</color>
    <color name="comment_background_active">#939393</color>
    <color name="comment_foreground">#FFFFFF</color>
    <color name="comment_foreground_important">#FF9D2F</color>
    ...
    <color name="comment_shadow">#323232</color>

你只是简短地行使重复RAV4GBA值来格式化,但那会使得在需求转移基础颜色的时候变得操作复杂。同时,那些概念与上下文紧密关联,像是”button”
or “comment”,它们应该放置于七个button style 中,而非colors.xml

Instead, do this:

<resources>

    <!-- grayscale -->
    <color name="white"     >#FFFFFF</color>
    <color name="gray_light">#DBDBDB</color>
    <color name="gray"      >#939393</color>
    <color name="gray_dark" >#5F5F5F</color>
    <color name="black"     >#323232</color>

    <!-- basic colors -->
    <color name="green">#27D34D</color>
    <color name="blue">#2A91BD</color>
    <color name="orange">#FF9D2F</color>
    <color name="red">#FF432F</color>

</resources>

向利用设计者询问调色板。命名无须全都以颜色名像是”green”, “blue”,
etc.那样的命名也是截然能够承受的:”brand_primary”, “brand_secondary”,
“brand_negative”。像这么格式化颜色会让改变和重定义颜色变得不难,还是能令人看出一共有微微种分歧的颜色被运用。平日对美好的UI设计来说,减弱所运用颜色的四种性是一件主要的事。

优良对待 dimens.xml ,正如对待
colors.xml.
您也应当定义典型的距离和字号大小的“调色板”,像对于情调的中央打算那样。1个好的
dimens 文件的例子像是那样:

<resources>

    <!-- font sizes -->
    <dimen name="font_larger">22sp</dimen>
    <dimen name="font_large">18sp</dimen>
    <dimen name="font_normal">15sp</dimen>
    <dimen name="font_small">12sp</dimen>

    <!-- typical spacing between two views -->
    <dimen name="spacing_huge">40dp</dimen>
    <dimen name="spacing_large">24dp</dimen>
    <dimen name="spacing_normal">14dp</dimen>
    <dimen name="spacing_small">10dp</dimen>
    <dimen name="spacing_tiny">4dp</dimen>

    <!-- typical sizes of views -->
    <dimen name="button_height_tall">60dp</dimen>
    <dimen name="button_height_normal">40dp</dimen>
    <dimen name="button_height_short">32dp</dimen>

</resources>

像一般相比较strings那样,你应有运用spacing_**** dimensions 来设置
layouting, margins 和
paddings,而不是运用硬编码值。这会拉动同样的观感,同时让集体和更改styles及layouts变得简单。

strings.xml

动用类似的命名空间来定名你的strings的keys,不要惧怕在四个或多个keys中再一次某贰个值。语言是很复杂的,所以命名空间是有须求的,它能用来提供上下文消息还有打破模糊。

Bad

<string name="network_error">Network error</string>
<string name="call_failed">Call failed</string>
<string name="map_failed">Map loading failed</string>

Good

<string name="error.message.network">Network error</string>
<string name="error.message.call">Call failed</string>
<string name="error.message.map">Map loading failed</string>

决不写全大写的string值。服从一般的文书惯例(e.g., capitalize first
character)。假如你要求将整句string大写呈现,那么针对实例使用TextView中的那些性子textAllCaps

Bad

<string name="error.message.call">CALL FAILED</string>

Good

<string name="error.message.call">Call failed</string>

幸免深层级的 views.
有时候你只是想要再加2个LinearLayout,用于完结都部队分views的摆放。但那种状态却恐怕会时有产生:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <RelativeLayout
        ...
        >

        <LinearLayout
            ...
            >

            <LinearLayout
                ...
                >

                <LinearLayout
                    ...
                    >
                </LinearLayout>

            </LinearLayout>

        </LinearLayout>

    </RelativeLayout>

</LinearLayout>

就算你从未在layout文件中一向目击到这般的情况,但这最终有恐怕发生,假使您填充(in
Java) views到其它views中。

部分题材恐怕会发生。你或然遇见过品质难点,因为如此会生成一棵复杂的UI树来让电脑解析。另3个更要紧的题材则是唯恐带来栈溢出荒唐:
StackOverflowError.

由此,试着让您的views层级尽大概的扁平:学习怎样行使RelativeLayout,
如何优化你的布局 optimize your
layouts

还有哪些行使 <merge>
tag
.

接头与 WebView 相关的题材
当你要求求显示3个web页面包车型大巴时候,比如说一篇文章,制止客户端侧的对于HTML的清理处理,更好的主意是从后端程序中一直拿走一段
纯粹的” HTML
。当有着Activity的引用而非ApplicationContext时,WebView还或许造成内部存款和储蓄器泄漏WebViews
can also leak
memory

when they keep a reference to their Activity, instead of being bound to
the ApplicationContext。幸免用 WebView 来做一些简约的文书或按钮,
更好的取舍是 TextViews 或 Buttons。

奇葩说有一期的辩题是从未有过钱要不要生儿女。反方壹位有心绪学背景的辩手介绍了“未到位愿望之魔咒”,即从前的急需远非满意会对您发生影响。小时候最贫乏的,长大之后会变成您最想要的。所以一旦没有钱就生子女,长大之后孩子会变得对金钱优秀执着。

IDEs and text editors IDE和文件编辑器

不论是使用什么编辑器,它必须能针对项目布局令人喜欢地运用
文本编辑器是一个很个人的选拔,依据项目协会和构建系统来让编辑器起到效益同时也是你的权利。

近日最推荐的IDE是 Android
Studio
,因为它由谷歌开发,与Gradle关系最严密,暗中同意使用新型项目布局,针对Android开发量身定做。

使用 Eclipse
ADT

来展开Android开发不再是一个好的选用。2014年,谷歌(谷歌(Google))截止了对ADT的支撑,并催促开发者尽快向Android
Studio迁徙。Google ended ADT support at the end of
2015
and
urges users tomigrate to Android
Studio
as
soon as
possible.你也足以继续运用它,不过急需一番配置,因为它利用旧式项目组织与Ant营造。倘若Eclipse 的 Gradle 集成令你选取得不乐意,你的抉择唯有应用命令行来营造。

您也能只行使多少个一味的公文编辑器像是Vim,Sublime Text, 或
Emacs。在那种意况下,你供给在指令行环境下利用 Gradle 和 adb

甭管你使用什么,总得确定保障使用 Gradle 和流行项目布局
来营造利用,注意不要将编辑器相关的配置文件加到版本控制系统中。比如,幸免添加Ant
build.xml 文件。
要是您在 Ant 中改变配置, 一定毫无忘记让build.gradle保持 up-to-date 和
functioning 。

再有,善待别的的开发者,不要强求他们改变她们特性化的工具配置。

眼角都很高,前者有点讨人厌,后者则浮现那么自然。

Use Stetho

Stetho,一款来自于推特的Android applications debug bridge,与Chrome
开发者工具集成在共同。使用它你很轻易就能检查选拔,越发是网络通讯。它还是能够让你简单地检讨和编辑SQLite
数据库、shared preferences。不过,你利用确认保证Stetho
仅在debug版本中可用,release版本中不可用。

求而得不到的,程羽蒙选拔用租来的商务车假装本身能获得。而能获得的人,不需求伪装,她说“作者不想要”,笔者就会信任。

Using an ORM

大家司空眼惯不引进应用对象关系映射库Object-Relation Mapping
library,除非你富有失常的错综复杂数据和亟待解决的必要。它们趋向复杂并须要时刻去学习。假若您说了算选取OENCOREM了,假如你的行使对
进度安全 process safe 有必要的话就要留心所运用的库是或不是援助这一特点,许多留存的O景逸SUVM消除方案令人愕然地不扶助。

因此本身日常问自身,为何女人的眼角要高吧。倘诺送孩子的人不是诈骗行为者,而你刚好想要二个儿童且本得不到,收下了又有怎样不对吧。

License

Futurice Oy
Creative Commons Attribution 4.0 International (CC BY 4.0)

水平和眼角其实都大致,它们有三个同台的近义词叫价位。《世界艺术学名著百部》一套要4800,而3遍澳洲行平均开支在1伍仟左右。当和情侣们坐在一起钻探去欧洲朝拜文化艺术复兴的时候,你家的水力发电单也不会无故消失的。

Summary 概要

实际上自重很不难,但把温馨放得太重,最终往往变成嘴硬和矫揉造作。从小被辅导“眼角要高级中学一年级些”的幼女,既错过怎么着平凡的与友爱相匹配的甜美,也不能够把虚幻的想象变为实际。

选取Gradle和它推荐的门类组织

小学有2个同校,她说每一天出门前,阿娘都会给她两块钱买早餐,然后和她说,阿娘没有怎么钱,薪金5个月唯有三千块,让他好好学习,以往自身多盈利。后来有一天,她在马路上遭逢1个路人,对方送他壹头娃娃,她就差了一点跟着人家走了,后来警察跑过去把她拉住才没出事。阿娘把她接回家现在,打了一顿,阿妈边打边哭,理由是“女人眼角要高级中学一年级些,你怎么那样好糊弄。”她和本身说的时候,眼里照旧表露着猜忌和委屈。她不懂“眼角要高级中学一年级点”是怎么个高法,每日被老母教育“家里没有钱”的她,1只好够娃娃丰富高过眼角,进入她的视线了。不精通干什么,看到程羽蒙,笔者就突然想到了要命同学。

Activity仅用于管理Fragment

高级中学的时候,和班里一个女子一起去出席一回中学生沙龙。当时她早已在学丹麦语准备出国。沙龙最后二个环节是发天涯论坛抽奖,发的腾讯网越来越多抽到的票房价值越大,奖品是一台拍立得。作者欢跃地拿动手提式有线电话机一下子发了五六条,她只是说了一句“可自小编多少用新浪诶”,就放下了手提式无线电话机。后来抽奖抽完了,没有抽到自家,笔者2头埋怨着好心痛,一边删博客园,而他在本身旁边,一直维系着微笑。小编说“你刚干嘛不发啊,好心痛啊。”她说“笔者不想发嘛,作者想要的话能够团结买啊。”笔者呆了一秒钟,然后窘迫地笑了笑,再没提抽奖的事。后来每一回抽奖看到大家狂热和开心的金科玉律,作者都会回想那多少个女孩,也会不自觉地克服一点。小编不以为嫉妒,也不觉得生气,小编只是隐约某些激动,原来人和人真的不平等。

不用自身写Http客户端,使用Volley或OkHttp

《等风来》的开场,程羽蒙就是如此多少个看起来“眼角很高”的女孩。她假屎臭文地方评了尖端餐厅的菜色,谢绝了富家小姐朋友送她回家的特邀,闪身钻进了那辆唬人的“公派”商务车。直到车子上路,才彻底放松下(Panasonic)来,说了一句“师傅,再开十块钱的吗。”后来在尼泊尔,井柏然先生拆穿她“成天爽”的名字随后,程羽蒙崩溃了,她把温馨的不甘、委屈、不平一股脑倒在前边这几个无辜的富二代身上,撕下伪装之后,真实的程天爽仍尚未变得可爱起来。

Updated on 2015/2/14 更新Stetho 相关,简书markdown不帮忙锚
-_-||||||||||||
Updated on 贰零壹陆/1/15
申明谷歌(谷歌)对ADT的舍弃态度,新增段落:对于非公布版本的营造利用不一致的包名
兵荒马乱时一起更新原文
迎接转发,但请保留译注者链接:http://www.jianshu.com/p/613d28a3c8a0

时辰侯,亲朋好友常说的话是“女人眼角要高级中学一年级些”。古说富养女,意思是女孩要华贵、要优雅,要尊重。对于做不到“富养女”的家园,“眼角要高级中学一年级些”成为了经过语言来促成的替代。

由于65k方法数限制,避免选取Guava并保持数量较少的库引用

老人说的“眼角要高级中学一年级些”,无非是寄希望于以后有一天,你有高贵能力之时,不要显得如此不般配。不过又某些许人,一辈子独自是在往返事先的人生,没有发家,没有进一步好,只是平凡地,仿佛明日一模一样地过完每多少个后日罢了。父母善意的期盼成为终身的求而不得。

Proguard configuration Proguard配置

ProGuard
常作为Android项目中减掉容积、混淆代码的工具。

是不是选择ProGuard取决于你的品类安插。日常你能够在gradle中像这么安顿以在构建规范apk时利用ProGuard。

buildTypes {
    debug {
        minifyEnabled false
    }
    release {
        signingConfig signingConfigs.release
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

为了操纵有些代码是亟需保持原样照旧撤除(注:即未实际运用,不打包,那也正是干什么使用ProGuard会裁减使用体积)依然混淆,你要求在代码中提出3个或多少个关键点。那些根本点区分出那个典型的类:with
main methods, applets, midlets, activities, etc.
Android
framework使用的暗许混淆配置能在此处找到:SDK_HOME/tools/proguard/proguard-android.txt,使用这一个布局,再增进你自身在此地定义的项目范围的安顿:my-project/app/proguard-rules.pro,将会同步整合最终的ProGuard混淆规则。

利用ProGuard日常遇到的三个难点是采纳运行时闪退,错误消息则为ClassNotFoundException
or NoSuchFieldException or similar,就算运营营造命令成功 (i.e.
assembleRelease) 且无警告。
那意味着以下一到两件事:

  1. ProGuard移除了类、枚举、方法、域或评释,检查一下哪些是不需求移除的局地。
  2. ProGuard混淆(重命名)了类、枚举、域,但这个都在代码中被一贯利用了它们原来的命名,
    i.e. through Java reflection.

检查app/build/outputs/proguard/release/usage.txt看是还是不是有疑虑对象被移除掉了。
检查 app/build/outputs/proguard/release/mapping.txt
看是还是不是有存疑对象被模糊了。

提防ProGuard遗弃一些索要的类或类成员,在您的ProGuard配置中插足keep
options:

-keep class com.futurice.project.MyClass { *; }

提防ProGuard混淆一些急需的类或类成员,添加keepnames:

-keepnames class com.futurice.project.MyClass { *; }

Check this template’s ProGuard
config

for some examples.
Read more at
Proguard
for examples.

不久地在您的类别中提供1个标准版本创设
用来检查ProGuard是不是推行不利符合预期是越发首要的事。当您引用了新库的时候,记得创设多个专业
版本在实机上测试一下。不要等到你的行使要颁发”1.0″版本了再来营造规范版本,你也许会受到一些令人不喜欢的喜怒哀乐,而你未曾剩余的岁月去匡正它们。

建议 保存好每三个您公布给您用户的正儿八经版本的mapping.txt file
。通过全部这几个文件,你才能够debug一些难题,当你的用户遇见bug并交付了一份包蕴混淆的stack
trace.

DexGuard. 如要你必要1个 hard-core tools 来优化并混淆正式版本代码,
能够考虑
DexGuard,
制作 ProGuard 的集体推出的商用软件. 它还是能自在地划分 Dex files
以缓解65k主意数限制.

接纳罗布olectric做单元测试,罗布otium做UI测试

Layout XML同样也是代码,好好协会它们

将密码和灵活数据放在gradle.properties中

ContentProviders

在SharedPreferences不够满意你的必要的景况下,你应当利用作为平台标准的ContentProvider,它相当慢并且经过安全。

关于ContentProvider的标题则在于你在选拔它前面须要写大批量的典范似的代码,还有就是低质量的学习指南。借使恐怕的话,使用机关库来生成ContentProvider,那样会显著减弱劳力。such
as
Schematic.

您照样须要靠你自身来写一些剖析代码用于从Sqlite列中读取出Object数据,反之亦然。你可以体系化数据对象,像是使用Gson,并且只具备结果字串。通过那种艺术你会损失一些属性,但3头你将不要求为数据类中的每一个域都注脚列。

毫无成立过深的ViewGroup层级

Project structure 项目结构

有二种常见应用的精选:旧式的Ant & Eclipse ADT project
structure,和新型的Gradle & Android Studio project
structure。你应有选拔新型,要是您还在选择旧式,考虑将之做为宝贵遗产并转账新式吧。

Old structure:

old-structure
├─ assets
├─ libs
├─ res
├─ src
│  └─ com/futurice/project
├─ AndroidManifest.xml
├─ build.gradle
├─ project.properties
└─ proguard-rules.pro

New structure:

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

重庆大学分歧点在于新式使用了来自Gradle的定义,更鲜明地分手了’source sets’
(main, androidTest)。举个例子,你能够加上source sets ‘paid’ 和
‘free’ 到 src中作为营造 paid 版本 和 free 版本的代码目录。
采纳四个top-level app对此将您的app从那三个需求引用的 库项目 (e.g.,
library-foobar) 中区分开来很实惠。settings.gradle中写着那个能被app/build.gradle引用的 库项目 的引用。

模拟器使用Genymotion

Data storage 数据存款和储蓄

Lessons learned from Android developers in
Futurice. Avoid
reinventing the wheel by following these guidelines. If you are
interested in iOS or Windows Phone development, be sure to check also
our iOS Good
Practices

and Windows App Development Best
Practices

documents.

Test frameworks 测试框架

Android SDK’s testing framework尚不完善,越发是关于于UI 测试。Android
Gradle完成了二个命名为connectedAndroidTest的测试职务,它能运营你创制的JUnit
test,参考extension of JUnit with helpers for
Android
.那意味着你供给连接实机或模拟器来运作测试,参考官方测试的指南[1]
[2]

使用 Robolectric
作为 unit tests, 而不要做 views tests

那是一个转业于增强开销速度的绝不连接装置的测试框架,特别适用于针对models
和 view models的单元测试。可是,罗布olectric对于UI
tests是不完全并且错误的。在测试以下相关UI成分时会有标题:animations,
dialogs,
etc,而且当您“行走于乌黑中”(无法看到屏幕正被操纵着操作)时,实情到底什么也是那么些麻烦明白的。

Robotium
让写 UI tests 变得简单
你可能不必要用Robotium来延续实机跑UI
case,但你仍会透过它拿走利益,因为它提供了很多helpers用于获取及分析views以及控制荧屏。Test
cases 将看起来相当粗略像是那样:

solo.sendKey(Solo.MENU);
solo.clickOnText("More"); // searches for the first occurence of "More" and clicks on it
solo.clickOnText("Preferences");
solo.clickOnText("Edit File Extensions");
Assert.assertTrue(solo.searchText("rtf"));

连日选用 ProGuard 或 DexGuard

Emulators 模拟器

假定你是正统的Android apps开发者,买二个标准版 Genymotion
emulator
啊。Genymotion比原生模拟器运转起来有着更高的帧速。它兼具一些工具用于调节和测试你的选拔,像是模拟互联网连接品质,GPS地方等。用于连接着开展UI
test它也很精美。你还是能获得许多(不是成套)分裂的杜撰设备,与买入许多实机相比较Genymotion专业版的开销实在是分外惠及。

警告:Genymotion emulators不协理全数的谷歌服务像是谷歌(Google) Play Store
and Maps.若是你想要测试三星(Samsung)特色的APIs,如故有必不可少拥有一台三星实机。

SharedPreferences

若果你只需持久化简单的标志位并且你的应用只在单进度环境下运转。SharedPreferences对你的话很大概早就丰裕了。它是不利的默许选项。

那时候有四个原因会让您不想要使用SharedPreferences:

  • 性能: 你富有大量多少还是数额小编卓殊复杂
  • 多进度获取数据:
    你抱有运营在各自进度中的组件或是远程服务,它们须求一起数据

Activities and Fragments

本着怎样最佳地经过 Fragments 和 Activities 来协会 Android
架构尚无统一结论,那一点不论在社区或许在 Futurice
的开发者中都以相同。Square
甚至开发了三个库用来最大化地因而View来建造应用架构 a library for
building architectures mostly with
Views
,以此绕过对于
Fragment 的依赖,但那在社区中仍未被看作广大推荐介绍的方案。

出于Android
API的历史,你能自然地想到将Fragments作为显示器上的UI碎片。换句话说,Fragments平常与UI相关联。Activities能被自然地想到作为控制器,从生命周期和景色管理上的第二来说。然则,你很或许遇见剧中人物发生变化的气象:activities恐怕被看成UI角色(delivering
transitions between
screens
),而fragments能被单独作为控制器
fragments might be used solely as
controllers
。大家推荐谨慎启航,获知尽大概多的新闻然后作出决定,因为不论选拔fragments-only、activities-only依然views-only架构,都留存着其症结。那里对于供给小心些什么有一些建议,但您须要持保留态度吸收它们:

  • 幸免大规模利用嵌套fragments nested
    fragments

    , 那恐怕会发出 matryoshka
    bugs

    。 要么在有意义的时候使用嵌套fragments (举个例子, 在1个screen-like
    的fragment中供给有的 fragments 放在二个档次方向滑动的 ViewPager 中)
    ,要么就确定保障这是多少个沉思熟虑后的支配。
  • 制止放太多代码在activities中。任何动静下要是恐怕,让它们作为轻量containers,其设有意义首要在于选择的生命周期循环以及其它主要的Android-interfacing
    APIs。采取单fragment的activity而不是2个单单的activity,那样能够将UI代码放在fragment中。当您须求转移它以重新放置到3个标签布局或是二个多fragment表格显示器中去的时候,这使得它能够被复用。幸免全体贰个无对应fragment的activity,除非你完全知道那样做的后果。
  • 毫无让你的利用的里边工作滥用Android-level
    APIs,像是重度依赖于Intent。那或然会影响到Android
    OS或是别的使用,创设bugs或许延缓。举个例子,若是您的运用使用Intent作为在这之中通讯手段,大概会造成多秒延迟——假使它在OS运行后随即被用户打开的话。

保证colors.xml简短并谨记DRubiconY,只在内部定义基础色彩

使用Fragment呈现UI

同等保持dimens.xml DHighlanderY,仅定义一般常量

Gradle configuration Gradle配置

General structure. Follow Google’s guide on Gradle for
Android

Small tasks. 与这么些 (shell, Python, Perl, etc)
脚本分裂,你能用Gradle来布署tasks。Just follow Gradle’s
documentation

for more details.

Passwords.
在app的
build.gradle中您要求为release版本的营造定义signingConfigs,以下为须要制止的事项:

并非那样做。这个音讯会现出在版本控制系统中。

signingConfigs {
    release {
        storeFile file("myapp.keystore")
        storePassword "password123"
        keyAlias "thekey"
        keyPassword "password789"
    }
}

与之相应,通过一个不会涵盖在版本控制系统中的gradle.properties这样做:

KEYSTORE_PASSWORD=password123
KEY_PASSWORD=password789

以此文件将会被gradle自动载入,所以您能在build.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(比如说 2.1.1),下载与拍卖
jars 的创新将会是一件笨重累赘的事,那几个难题在 Maven
中被解决得很好,那也是 Android Gradle builds
所鼓励的章程。看上面那一个例子:

dependencies {
    compile 'com.squareup.okhttp:okhttp:2.2.0'
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0'
}

制止 Maven 的动态重视
制止使用动态信赖的库版本, 像是 2.1.+
,因为那大概会促成不一致的、不平稳的创设,或是在多次创设之间表现出微薄的、不可追踪的差异行为。使用静态版本像是2.1.1会创建更安定的、可预料的和可重新的开支条件。

对此非发布版本的创设利用不相同的包名
debugbuild
type
动用applicationIdSuffix
,那能够让debug还有release本子的apk同时安装在平等部配备上(假诺您有别的部要求要的话,还是能够将此技能运用于自定义的
build 类型)。对于多少个 app
的生命周期来说,当它被宣布到市集之后,这一表征将变得可怜有价值。

android {
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            versionNameSuffix '-DEBUG'
        }

        release {
            // ...
        }
    }
}

利用差别的icons来区分安装在设备上的差别创设版本app——比如说使用区别的情调或是使用1个遮盖的”debug”标签。对于Gradle来说,那卓殊简单,你只必要将debugicon
放在app/src/debug/res,而release icon 放在
app/src/release/res。你仍是可以够针对不一样的营造版本更改应用名change app
name
,versionName也足以变更(就好像上面这一个事例做的那么)。

翻译推荐阅读

Java packages architecture Java分包架构

在Java分包架构方面,Android只可以算是粗略接近MVC模型Model-View-Controller。在Android中,Fragment和Activity是事实上的支配器类Fragment
and Activity are actually controller
classes
。从二头来说,它们又肯定是用户接口的一些,所以还要也是视图。

出于这一理由,不能将fragments (or
activities)严俊划分为控制器或是视图。让它们保持团结的fragments
package更好有的。Activities能放在最高级package中只要您遵照从前部分的建议。假设你陈设超过多个或八个Activities,那么再加1个
activities package。

除此以外,也足以像经典的MVC那样来拓展分包架构,通过应用贰个models
package包罗POJOs(这个POJOs由JSON解析器解析API
responses转化生成),和二个views
package包罗你的自定义Views,notifications, action bar views, widgets,
etc。Adapters算是四个劳神,存在于数据和视图之间。然则,典型气象是它们会通过getView()格局输出一些视图,由此你能够把adapters
subpackage将在views里面。

一部分application-wide的和好像于Android系统的主宰器类能够放置在一个managers
package中。混杂的数目处理类,像是”DateUtils”,放在utils
package中。那多少个用来与后端交互的类则放在network package中。

因而看来,类别是从 closest-to-backend 到 closest-to-the-user:

com.futurice.project
├─ network
├─ models
├─ managers
├─ utils
├─ fragments
└─ views
   ├─ adapters
   ├─ actionbar
   ├─ widgets
   └─ notifications

使用Jackson来解析JSON

Libraries 库

Jackson
是多个用于 Object 与 JSON
间相互转换的Java库。Gson
也是三个看成消除此题材广受欢迎的存在。不过大家发现 Jackson表现更好,因为它提供了可挑选的措施来拍卖 JSON : streaming, in-memory
tree model, and traditional JSON-POJO data binding。所以Jackson的体量会比 GSON 要大。取决于你的实际情状,你可能扶助于选择 GSON 以制止65k 方法数限制。别的采纳还有:
Json-smart
and Boon
JSON

互联网,缓存和图像.
那会儿有少数种经超过实际战检验的用于后端服务器请求的解决方案,你将运用哪个种类取决于你协调将要完结的客户端。使用
Volley

Retrofit.
Volley 额外提供了 helpers 以消除 载入和缓存图像。如果你选拔Retrofit, 考虑用
Picasso
来做这么些, 同时用
OkHttp
来完毕火速 HTTP 请求。Retrofit, Picasso 和 OkHttp
这四个工具由同样家商店付出,所以他们能到家地补足相互。 OkHttp can also
be used in connection with
Volley
.

RxJava 是三个响应式编制程序框架,换句话说,处理异步事件。
它是一种强大并有前途的范例,或然从可读性上讲不是那么特出因为它是如此的区别。我们引进您在采取那么些库来构筑整个应用以前抱持着丰富的小心。有一对项目经过动用
LacrossexJava 构筑, 假使你要求帮衬能够和她俩之中的人攀谈: 提姆o Tuominen, Olli
Salonen, Andre Medeiros, 马克 Voit, Antti Lammi, Vera Izrailit, Juha
Ristolainen. 大家写了有的博文宣布在那上头:
[1],
[2],
[3],
[4].

只要您过去一直不行使 Tiggox 的经验,只要求从将它作为对 API
的回答开首即可。你也能够挑选从作为不难 UI 事件处理起初,像是 search
田野同志 上的点击也许输入事件。如果您对友好的 哈弗x
技能充足自信并决定将它选用到全体应用构筑中,一定要针对具有科学精晓的片段写Javadoc。用心记住别的不熟知Lacrossex
的程序员恐怕会对保卫安全项目感到无比头大。尽你的着力来扶持她们知晓您的代码还有
Enclavex 。

Retrolambda
是三个用来让 JDK8 以前的 Android
或是别的平台支撑拉姆da说明式语法的库。它用于维持您的代码紧密并可读,尤其是当您利用函数式风格编写代码比如说
RubiconxJava 。为了采取它, 你需求设置 JDK8, 在 Android Studio 的 Project
Structure dialog 设置它当做你的 SDK Location , 然后装置条件变量
JAVA8_HOMEJAVA7_HOME , 接着在项目根目录的 build.gradle 引用信赖:

dependencies {
    classpath 'me.tatarka:gradle-retrolambda:2.4.1'
}

并在每三个模块的 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 lambda 的代码扶助扶助,假使您是 lambda
的新手,只需从以下提议中初露:

  • 任何只有三个方法的接口都以 “lambda friendly”
    的,亦即能被收缩成更严密的语法格式
  • 万一对 参数 或任何 的什么样拿不准,那么就写2个一般性的匿名内部类并让
    Android Studio 为您将它收缩成 lambda 格式

注意 dex 方法数限制,防止选用过多库
Android apps 当被打包成 dex file 时, 有一个原则性的引用方法数限制:65536
[1]
[2]
[3].
若是你超出了这一限量,就会在编译时遇上3个致命错误。出于那几个理由,使用尽恐怕少的库,并且使用这些工具
dex-method-counts
来决定选择什么库集合来保障低于这一限量。尤其要幸免选用 Guava library,
因为它包罗超越 13k 方法.

行使Stetho进行应用debug


使用style来制止Layout XML中的重复属性

Thanks to

Antti Lammi, Joni Karppinen, Peter Tackage, Timo Tuominen, Vera
Izrailit, Vihtori Mäntylä, Mark Voit, Andre Medeiros, Paul Houghton and
other Futurice developers for sharing their knowledge on Android
development.

采纳多少个style文件防止生成一个硕大

Build system 营造系统

您的暗许选项应该是
Gradle。Ant的限量要多而且语句还更没完没了。使用Gradle,能够简单完结:

  • 行使差别的flavours或variants来创设你的app
  • 创设不难的script-like的tasks
  • 管住并下载注重
  • 自定义keystores
  • 还有更多

Android’s Gradle plugin同时在被谷歌(Google)做为新规范塑造系统积极开发中

简短的数目持久化使用SharedPreferences,别的的运用ContentProvider

Android SDK

Android
SDK

放在你的home目录或是其余应用无关的职责。有个别IDE安装的时候就包罗了SDK,并且会将其放置在与IDE相同的目录下。当您须要进步(或重装,或改动)IDE时那就成了一件坏事。同时还要防止将SDK放在另3个系统级其他目录下,那样很或然会让你在使用user权限运营IDE时须要用到sudo权限。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图