本文从开发工具选择,UI界面、图片模块、网络模块、数据库产品选择、性能、安全性等几个方面讲述了如果开发一个Android应用。现在整理出来分享给广大的Android程序员。

开发工具的选择

开发工具我将选用Android Studio,它是Google官方指定的Android开发工具,目前是1.2.2稳定版,1.3的预览版也已经发布了。

Android Studio的优点就不需多说了,GitHub上大部分的Android开源库也都已迁移到Android Studio上来,在未提供jar文件时,使用Android Studio可以极为方便地集成开源库。最为重要的是Google已宣布将在年底前停止对Eclipse Android开发工具的一切支持(Google Ends Support for Android Eclipse Tools),因此请早日转移到Android Studio上来。

App设计风格

这一点对于一个开发者来说,貌似没有决定权,最终的决定权在产品部门手里。尽管这样,我还是会尽力说服产品部门将App设计成Material Design风格。这一点说多了都是泪啊,作为一个Android开发者,却整天开发着iOS风格的App,相信很多公司都这样,为了节省成本和时间,Android和iOS共用一套UI。举一个最常见的例子,Android App中每个页面TitleBar的左上角放一个返回按钮,这在iOS里是必须的,但Android有返回键啊,这样设计对于Android完全是多此一举。

真心希望产品设计者尊重每种操作系统的风格及使用习惯,不要再设计不伦不类的产品。Material Design正好提供了一种这样的规范,自MD规范发布以来,其优雅的设计和清新的风格已吸引了大批设计者和开发者,如今MD设计不止在Android上(已有官方类库支持MD风格),甚至在CSS、HTML、JavaScript网页设计上都越来越火。因此,对于App的设计风格,Material Design当仁不让,也许你曾经错过了Android Design,请不要再错过Material Design。

一些相关的链接:

Material Design官网

Material Design配色模板

MD一个设计案例网站

MD风格的Andorid抽屉源码:Android-MaterialDesign-NavigationDrawer

MD风格的一个App源码(有妹子哦):Android-MaterialDesign-DBMZ

版本支持

对于Android要支持的最低版本,可以参考各个版本的市场占有率,其实最靠谱的是根据自家App的统计数据来决定,目前我们的App最低支持2.2。以个人观点认为,虽然2.x的版本仍然有一部分用户,但其实手机更新换代特别快,为了更好的用户体验,也为了应用更新的API(很多第三方库也都有版本要求),应该提高最低支持的版本,大概3.0 为宜,即API Level为11。

App框架设计

相信大家都有体会,随着功能模块的增加,App越来越大,如果没有良好的架构设计,则代码将会变得臃肿且不易维护,各功能模块的耦合度会越来越高。因此可以把App模块化,将一个完整的App划分成几个相对独立的模块,这样即可以降低模块间的耦合也利于复用。

1.网络模块

已经很少有单机版的App了吧,大部分都需要联网,从服务器请求数据,因此网络模模块必不可少。GitHub上的开源网络框架也特别多,个人认为可以使用开源框架,目前我会选okHttp或者Volley,也许以后会有更好的网络框架出现。注意如果使用开源框架,则必须要阅读其源码,必须能够驾驭它,这样就不至于当bug出现时束手无策。当然还可以自己写网络模块,目前我们的App网络模块就完全是自己写的,这样的好处是自己熟悉所写的代码,当有bug时可以迅速定位问题,同时注意处理一些联网过程中的细

节,如:

(1)对HTTPS的支持、HTTPS证书的验证(目前很多做法都是默认允许所有HTTPS证书的,其实这样做是不安全的,应当真正地做证书校验)

(2)支持Wap方式上网,移动、联通、电信代理的设置

(3)支持重定向、数据压缩传输等

(4)其他值得注意的问题

自己写网络框架可以完美地处理这些细节,但时间成本比较大。如果使用开源框架,一般都没有处理这些细节,因此我们可以在第三方框架上做些修改,这样时间成本将会节省很多。

2.图片管理模块

图片也是App中不可少的元素,而且图片是占用内存的大户,因此图片管理框架特别重要,不好的图片框架容易引起内存泄露甚至导致崩溃。当然可以自己实现图片框架(目前我们也是这样做的),实现图片的下载、解码、缓存等关键环节。个人建议可以采用一些比较好的图片库,也许会比我们自己管理图片更完善和高效。我会推荐如下几个图片管理库:

(1)Glide,Google的一些官方App,如Google photos都使用了,还要解释更多吗?

(2)Fresco,FaceBook的开源库,功能超级强大,支持WebP、Gif、JPEG渐进显示,关键是其对图片内存的设计思想,使得图片内存开销大大减少。

(3)Android-Universal-Image-Loader,在出现上述图片库之前,貌似这个最火吧,之前个人的App中也用了它。

(4)Picasso,Square的开源库,据说Glide就是参考Picasso设计的。

3.本地数据库模块

也许你的App需要用到本地数据库,那么建议你采用流行的ORM框架,如ActiveAndroid或greenDAO,使用第三方库会大大方便你对sqlite的操作,个人认为在使用中我们需要注意数据库升级以及多线程并发操作数据库的问题。

4.文件管理模块

一个App,肯定会涉及到一些文件,如配置文件、图片、视频、音频、SharedPreferences文件等。我们可以提供一个全局的文件管理模块,负责文件的增、删、改、查等操作。

另外还需支持文件压缩,文件的上传与下载操作,对于下载需要支持多线程并发下载、断点续传等功能。

5.组件内、组件间通信机制

对于一个App,组件通信必不可少,通信类型可以分为点对点和点对面的的通信,点对点即只有唯一的接收者可以响应消息,点对面则类似于消息广播,即所有注册过的都可以响应消息。在Android 中,通常使用消息机制来实现,但消息机制的耦合度比较高。目前也有一些通信框架,如EventBus、Otto等事件总线框架,这些框架可以极大地降低组件间的耦合,但无法完美地实现点对点通信,因此建议消息机制和事件总线机制结合使用。

6.数据处理框架

其实还应该有一个数据处理框架,当发出数据请求后(走子线程),经网络模块返回数据(一般为JSON格式),JSON数据一般不能直接交给View层使用,需要解析成对应的Model,同时如有需要,还要缓存数据,因此这些流程可以抽象成一个数据处理的框架。这个框架可以认为接受数据请求的url,并将数据Model返回给Activity或 Fragment。对于JSON数据解析,建议使用fastjson,速度快且稳定,缺省值也比较完善。

7.线程调度模块

其实Android中有很多操作,如请求数据、下载图片、清除缓存等都是需要在子线程中执行的,往往很多时候都是直接起一个Thread来做了,这样做就会很乱而且线程多了将难以管理。因此可以抽象出一个线程调度模块,它维护一个线程池,如果有需要线程的话就通过线程调度模块取线程来做,这样就方便统一管理。当然第三方库中的线程操作我们将无法归到线程调度模块来管理,但其他涉及到线程的操作都应该来统一处理。

8.业务层

业务层大概就是四大组件、Fragment、View了,建议尽可能地使用原生组件,少用自定义组件,因为原生组件性能是最好的。另外建议使用MVC模式就好,只要设计管理好自己的逻辑,至于MVP、MVVM等模式个人认为都有缺陷,总之寻求一个折中吧,有得必有失。

9.APK动态加载机制

随着App的增大,功能的扩展,很多App已经采用了APK动态加载的机制,也可以叫做插件化。由于本人没有在实际的App中应用过,所以不便发表过多评论。但这种机制个人认为很有前途,这种机制将利于App的解耦、功能扩展和局部升级。具体可以参考一个商用的解决方案:ApkPlug-移动应用模块化解决方案和一个开源的APK动态加载框架。

10.App的安全性考虑

Android App的安全问题很少有人重视,但这的确是一个很严重的问题,一些好的App经常被人破解。建议将一些核心算法等写成.so库,重要的逻辑放在服务器端,数据请求采用加密等,另外打包APK时至少要混淆代码,还可以采用APK加壳机制,总之这类的防范措施永远不嫌多。

【Android开发】如何设计开发一款Android App的更多相关文章

  1. Android通用框架设计与完整电商APP开发系列文章

    作者|傅猿猿 责编|Javen205 有福利 有福利 有福利 鸣谢 感谢@傅猿猿 邀请写此系列文章 Android通用框架设计与完整电商APP开发 课程介绍 [导学视频] [课程详细介绍] 以下是部分 ...

  2. Android 高级UI设计笔记08:Android开发者常用的7款Android UI组件(转载)

    Android开发是目前最热门的移动开发技术之一,随着开发者的不断努力和Android社区的进步,Android开发技术已经日趋成熟,当然,在Android开源社区中也涌现了很多不错的开源UI项目,它 ...

  3. Android 高级UI设计笔记23:Android 夜间模式之 两种常用方法(降低屏幕亮度+替换theme)

    1. 夜间模式 所谓的夜间模式,就是能够根据不同的设定,呈现不同风格的界面给用户,而且晚上看着不伤眼睛.特别是一些新闻类App实现夜间模式是非常人性化的,增强用户体验. 2. 我根据网上的资料 以及自 ...

  4. Android 高级UI设计笔记24:Android 夜间模式之 WebView 实现白天 / 夜间阅读模式 (使用JavaScript)

    1. 问题引入: 前面我们是使用方法 降低屏幕亮度(不常用) 和 替换theme,两者都是针对Activity的背景进行白天.夜间模式的交换,但是如果我们显示的是Html的内容,这个时候改怎么办? 分 ...

  5. Android 高级UI设计笔记09:Android如何实现无限滚动列表

    ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们提供了一个良好,整洁的用户体验 ...

  6. Android 高级UI设计笔记09:Android实现无限滚动列表

    1. 无限滚动列表应用场景: ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们 ...

  7. Android 高级UI设计笔记22:Android 指示引导页(带圆点)

    1. 引导页: 我们在安装某个软件首次运行时,大部分都会有一个引导页的提示,介绍软件新功能的加入或者使用说明等,支持滑动且下面会有几个圆点,显示共有多少页和当前图片的位置,类似如下效果: 2. 引导页 ...

  8. Android 高级UI设计笔记21:Android SegmentView(分段选择控件)

    1. 分段控制(SegmentView) 首先我们先看看什么是SegmentView的效果,如下: 分段控制这个View控件是ios7的分段控制,和QQ消息页面顶部的效果一样,android没有这个控 ...

  9. Android 高级UI设计笔记17:Android在非UI线程中显示Toast

    1. 子线程的Toast怎么显示不出来? 因为Toast在创建的时候会依赖于一个Handler,并且一个Handler是需要有一个Looper才能够创建,而普通的线程是不会自动去创建一个Looper对 ...

  10. 20155227 《Java程序设计》实验四 Android开发基础设计实验报告

    20155227 <Java程序设计>实验四 Android开发基础设计实验报告 任务一 Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二 ...

随机推荐

  1. Along with all the above benefits, you cannot overlook the space efficiency and performance gains in using DataFrames and Dataset APIs for two reasons.

    Of all the developers’ delight, a set of APIs that makes them productive, that are easy to use, and ...

  2. Eclipse无法启动小结

    Eclipse启动的时候出现: The Eclipse executable launcher was unable to locate its companion shared library 针对 ...

  3. text-align 在ie7与ie8下的区别

      在某元素上应用text-align:center; 在ie7下解释为,该元素内的元素和文字都居中. 在ie8下解释为,该元素内的文字居中. 例如:<div style="borde ...

  4. iOS拦截导航栏返回按钮事件的正确方式(二)

    当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮时不一定要 pop 回上一界面,比如一个视频播放界面,进入横屏后,默认点击返回按钮仍然 ...

  5. plot-sin-02

    draw sin 02 设置数据区域的边界线颜色 设置坐标轴的位置 code #!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as ...

  6. 【WPF】TabControl垂直分页栏/选项卡

    分页栏控件TabControl默认的选项卡是水平方向的,如下: 现在要改成垂直方向的: 给TabControl 标签添加属性 TabStripPlacement=”Left” , 如下: <Ta ...

  7. openwrt内核配置选项添加

    摘自:http://blog.csdn.net/weiniliuchao/article/details/50295527 增加内核配置选项 openwrt的.config文件中,关于内核的选项都是形 ...

  8. nginx日志分析利器GoAccess(转)

    面试的时候一定会被面到的问题是:给出web服务器的访问日志,请写一个脚本来统计访问前10的IP有哪些?访问前10的请求有哪些?当你领略过goaccess之后,你就明白,这些问题,除了考验你的脚本背诵记 ...

  9. [JavaScript]JS调用PHP和PHP调用JS的方法举例

    http://blog.csdn.net/pleasecallmewhy/article/details/8592571 body { background: #C7EDCC !important; ...

  10. innobackupex参数之 --throttle 限速这个值设置多少合理 原创

    innobackupex参数之--parallel --throttle--parallel 此参数用于开启多个子进程并发备份多个数据文件(注意,一个数据文件只会有一个进程完成备份).可以加快备份速度 ...