如何开发一款优秀的APP(侧重实践层面)

最近,不少刚入行或行外的小伙伴在咨询我,如何开发一款优秀的APP?这是一个老生常谈的问题,对于身在IT行业的技术渣来说,实践不是纠结的地方,如何开发一款符合用户刚需,聚拢大量用户,才是我们所想。但是身为局外人,在APP实践层面(小渣已经关荣上升战略层)有点陌生,甚至有点神秘。



此时此刻,小渣专门写一篇干货,本文侧重从技术设计理念、偏Android领域,让各位容易理解,觉得有趣,又有冲动深入研究,这么一篇文章。希望各位小伙伴们阅读此文后,能有所收获。


首先,APP从诞生到完成,有它特定合理的流程,先介绍下开发一款APP的流程。一般来说,不同的团队,有不同的开发流程。小渣例举通用的开发流程,如下图:




立项

这是一款APP的开始,主要由决策人拍案决定。这里的决策人通常指一家公司的老板,或一个团队的leader。比如,老板发掘市场有某需求待挖掘,这块有巨大的商业机会,于是,招兵买马,组织人力财力物力,把想法演变成具体实物。这阶段的决定,往往是抽象的,还没有深入进行具体需求分析、市场考察等。不过,往往就是因为决策人独到的眼光,抓住那刹那的灵感,才有具体的实践。决策人,需要有极高的市场洞察力,及对自己抽象的想法,坚持不懈的肯定。


需求分析

一旦立项之后,就是具体的行动了。开始对需求进行详细的市场调研、用户访问、竞品分析、政策分析、产品定位等宏观分析,当然这阶段也会有微观分析,比如功能分类、产品架构、用户体验、开发规划、人员定位等等。总之,这阶段就是把所有要做的事情理顺清楚了,万事俱备只欠东风,下一步就是落实。


开发

一个牛逼的想法,如果没有落实,那还是想法而已。开发,通常指编程,通过代码的编写,用计算机软件形式表示出来,让用户看得见(但摸不着)。这阶段也是本文侧重讲的地方。这阶段的进程,前期一定要设计完善,尽量不要中间需求变更,那样的话会造成很多开发进度拖延,或推倒重来。


测试

产品开发出来了,不可能立即给用户使用。任何大大小小的软件产品,肯定有各种BUGs(缺陷),测试的目的就是尽早发现BUG,并修复它们,把产品做到无误。这阶段不能让开发人员来做,需要其他团队成员,如有专门的测试人员,那是最美好的。这样可以把很多“理想当然”的功能测个精通。


发布

iOS APP如果发布,过程会麻烦点,大家用iPhone也知道APP store,各种各样的审核,需要有耐心。而Android APP就相对简单些,如果自己有服务器,放到服务器上可以直接供网友下载,无任何上线的限制,这也是Android APP一大特色。不过,如果APP想追求更好的下载量,还是得发布到第三方应用商店,比如应用宝、豌豆荚、360手机助手等,这里就不一一例举了。发布时候,要善于运用新媒体传播,多方面宣传产品,开通专门运营的微博、微信及网站主页。


现在的APP,最主要是面对互联网用户,除了这些流程步骤之外,还会分得更细,步骤更多。尤其是后期产品发布之后,线上线下推广、运营、产品升级等,这才是大头,或许对互联网小伙伴们来说,这才是开发一款优秀的APP的刚刚开始。啥不多说了,接着讲简单点的—用户体验。


用户体验要素


优秀的APP,需要拥有良好的用户体验(这几个词在现在的互联网周遭,想必耳熟能详)。我们在使用互联网APP的时候,通常第一印象特别重要,一旦画面不清晰,给人错乱的感觉,后果就是直接删除,不得不说现在的用户真是越来越挑剔。这也是互联网APP竞争压力大的表现之一,如何做到产品既深入用户痛点,又美观流畅,这是各位小伙伴们思考的重点之重。所以呢,这里需要专门讲讲用户体验的方法论。



战略层

只需要清楚回答两个基本问题,这阶段目标算通过。

1、我们要通过这个产品得到什么?(产品目标)

2、我们的用户要通过这个产品得到什么?(用户需求)

但是有多少人可以清楚回答呢?这也是为什么这么多APP,刚上线没多久就被无情淘汰的原因之一。


范围层

确定产品各种特性和功能最合适的组合方式。举个很好理解的例子,到底是做社交呢,还是新闻资讯类,还是生活服务,及其他。


结构层

用来设计用户如何达到某个页面,并且在他们做完事情之后能去什么地方。


框架层

这是结构层的具体表达方式,确定在页面上交互元素的位置。


表现层

这一层主要由感官角度决定,也就是产品给用户带来的视觉效果。


用户体验的方法论看似简单,但需要仔细琢磨。能把五个层次的问题解释清楚,距离一款优秀的APP也不远。好了,下面进行正题,给大家提供些建议,在开发一款APP时候,从技术设计层面需要注意的地方。以下的篇幅,小渣避免过多使用代码,这样保证本文章通俗易懂,既能给外行同仁看得热闹,又让初学者有兴趣深入研究。


讲解结构分以下层面:视图、后台及电池。


视图


一 图像优化


这里主要涉及两个知识点,一是图像的高效加载,二是缓存策略。


Android对单个应用有内存限制,比如16MB,这导致加载图像的时候很容易出现内存溢出,也就是应用崩溃状况。每个APP在使用过程中,肯定多多少少从网络下载图像,而图像的原始大小比手机容纳的像素高出很多,需要处理的是,不能让它按照原始的大小加载,我们需要在APP图像加载前,按一定的比例(采样率)缩小该图像,控制图像的内存使用。也许有小伙伴会问,非常非常多的图片需要加载怎么办?接着看下文。


不管是在Android设备,还是其他移动设备,流量对用户来说是一笔宝贵的资源。如何避免消耗过多的流量?当然是使用缓存,这样既可以节省用户的流量,同时也能给APP带来更快的加载速度。说到缓存策略,并没有统一的标准。基本思路是,1、从内存寻找加载过的图像,这里使用缓存算法LRU(Least Recently Used),核心思想是,当内存缓存满时,会优先淘汰近期最少使用的缓存对象。如果内存没有,进入下一步。2、从磁盘寻找加载过的图像,如果还是没有,进入下一步。3、从网络重新下载。经过这些步骤,图片加载问题,基本可以得到优化。


二 View优化


手机屏幕先天尺寸有限,更多的内容得靠滑动页面伸展,对于初学者来说,本来从教科书上下载的demo运行好好的,但是只要出现滑动冲突,demo就无法使用了。这是手机触动经常发生的异常。




常见的滑动冲突场景可以简单分为以上三种:

场景1,外部滑动方向与内部方向不一致

场景2,外部滑动方向和内部滑动方向一致

场景3,上面两种情况的嵌套


在说解决方法前,先讲讲一个概念,就是当手指触动屏幕引发的事件(MotionEvent)。

ACTION_DOWN,手指刚接触屏幕

ACTION_MOVE,手指在屏幕上移动

ACTION_UP,手机从屏幕上松开的一瞬间


解决滑动冲突的思路很简单,就是实现拦截。在ACTION_MOVE这个事件里,拦截你不想出来的屏幕操作。比如左右滑动,禁止上下滑动;上下滑动,禁止左右滑动。按照类似的思路,可以解决上述三种滑动冲突。


Android系统本身提供的原生态View有限,我们需要动手自定义自己想要的View,这样可以给用户带来更多的惊喜。比如消息弹出框、登陆按钮等。自定义View五花八门,只有想不到的,没有做不到,这里我提供一种思想,在面对陌生的自定义View时,运用这个思想去快速解决问题。

1,掌握基本功,如View的弹性滑动、滑动冲突、绘制原理等

2,能够对自定义View分类,并选择合适的实现思路

3,平时多积累

自定义View运用得恰当,可以带给用户很多不一样的感受哦,这可以让你的APP新颖靓丽,风格别致,与众不同。


三 动画


动画使用是越来越多了,简单点就像启动APP第一个页面,通常会伴随一系列的欢迎动画。Android的动画分三种:

1,View动画,通过对场景里的对象不断做图像变换(平移、缩放、旋转、透明度)从而产生动画效果。

2,帧动画,通过顺序播放一系列的图像从而产生动画的效果,可以理解成图片切换动画,很显然,如果图片过大过多会导致OOM(内存溢出)。

3,属性动画,通过动态地改变对象的属性从而达到动画效果,这种特性需要在Android 3.0以上才有。


使用动画的注意事项:,

1,OOM问题

这个问题主要出现在帧动画中,当图片过大过多极其容易出现OOM,这个需要注意,尽量避免使用

2,内存泄露

在属性动画中有一类无线循环的动画,这类动画需要再Activity退出时及时停止,否则将导致Activity无法释放从而导致内存泄露。

3,兼容性问题

动画在Android 3.0以下的系统上有兼容性问题,在某些场合可能无法使用,所以取舍吧。

4,不要使用px(像素)

在进行动画的过程中,要尽量使用dp(与像素无关),使用px会导致在不同的设备有不同的效果。

5,硬件加速

使用动画过程中,建议开启硬件加速,这样会提高动画的流畅性。



后台


进程与线程


每一个APP后台也许运行着无数个进程与线程,APP后台开发,与进程、线程两者密不可分,这是必考的知识,理解其中的概念非常重要。


按照操作系统中的描述,线程是CPU调度最小单元,同时线程是一种有限的系统资源。而进程一般指一个执行单元,也就是说APP相当于一个进程。一个进程可以包含无数个线程,两者是包含与被包含的关系。也许你现在正打开的APP,里面运行这N个线程,在为你后台运行各种各样的服务,而你无需关心。


IPC,含义为进程间通信或跨进程通信。说到IPC的使用场景就必须提到多进程,第一种使用情况是,一个应用因为某些原因自身需要采用多进程模式来实现,比如为了加大一个应用可使用的内存所以需要通过多进程来获取更多份内存。Android对单个应用所使用的最大内存做了限制,早期的一些版本可能是16MB,不同设备有不同的大小;第二种使用情况是,当前应用需要向其他应用获取数据,由于是两个应用,所以必须采用跨进程的方法来获取所需要的数据。另外,实现进程通信的方式有很多种,需要根据自身情况采用。


Android主线程主要负责分发UI事件,所以通常称之为UI线程。子线程负责处理耗时的操作,这里切记不能在主线程执行耗时的操作,否则会报ANR系统错误,也就是应用强制被退出。线程有同步和异步,在执行复杂的UI页面时,应该使用异步操作,这样能带给用户更高级的享受,无需用户等待,如果涉及更加复杂而且耗时的操作,适合使用线程池,它有以下好处:

1,线程重用,要知道频繁的线程创建与销毁,很是消耗系统资源

2,有并发数控制,避免大量线程互抢系统资源导致堵塞

3,提供定时执行,指定间隔循环执行


合理运用进程和线程,可以降低系统的复杂度,从而减少更多的系统消耗,这也是省电的方法之一。


内存泄露


内存泄露是指那些程序不再使用的对象,无法被GC(垃圾回收器)回收,这样导致对象一直保留在内存中,占用了宝贵的空间。空间被占用越多,应用性能越差,严重的会导致应用崩溃。常见的内存泄露原因很多,通常为图片加载过大,或代码写法问题。图片加载过大容易理解,同时很容易控制,对原始大小进行控制就行。但是由代码引起的,可能无法控制,这也许演变成一场灾难。


内存泄露优化办法分两方面,一方面是在开发过程中避免写出有内存泄露的代码;另一种情况是通过一些分析工具比如MAT来找到潜在的内存泄露。可想而知,开发人员加强自身的综合实力,是何等重要,当然我们还需要平常多积累,多练习。


电池



Android与iOS比较电池比较,前者往往被大家标上“耗电大户”。Android自身的技术架构是其中耗电原因之一,但估计大家有所不知,很多Android应用设置了开机启动选项,造成APP再没有打开的情况下,从开机就在后台执行,造成很多电池被默默地消耗掉。作为有职业良知的、能站用户体验角度思考的开发者而言,请慎重使用开机启动这选项。


据许多研究表明,一款APP电力70%消耗在网络请求,所以呢,需要急迫解决网络请求带来的消耗,这里给大家的建议是,在网络状况不便时,传输或下载更小的载体,比如使用JSON,而不是XML。无必要情况,当发现网络断开,不必要再继续访问网络,应该立即中止请求,直到用户再次运行。另外GPS也是耗电原因之一,如今几乎每个APP都在使用GPS定位功能,在不使用的情况下应该通知用户及时关闭GPS。再者需要开发者保持良好的代码编写习惯,用更少的代码,运行更多的功能。


一个健壮的软件应用,肯定比一个扎乱不堪的运行更快。优秀与差劲软件应用,以系统复杂度评比,也就是程序需要的运行时间,及程序占用的系统资源。越优秀的应用,复杂度越低,也就是性能越好;越差劲的应用,复杂度越高,也就是性能越差。这里考虑到开发人员自身的代码编写能力,还有系统架构设计能力。总之,需要加强自身实力,多多练习。


Google发布Android性能优化典范:http://www.oschina.net/news/60157/android-performance-patterns,介绍比较系统,更加权威详细,大家可以参考,这篇文章也是在这基础上编写的。


以上从视图、后台和电池,三个角度讲解了一遍。除此之外,优秀的APP是可延续发展的事务,所以呢,还要考虑到程序维护性,如应用架构是否易与扩展,对象方法命名是否容易理解,重要地方是否添加注释等等。


通常来讲,开发时间比重占整个项目约30%,这里很多小伙伴会疑问,开发这么重要的事情,占比重这么少。确实,开发才是落实想法的过程,没有开发这过程,就没有完整的产品。但是呢,实践的前提是想法的确定,也就是先有想法,后有行动。可以这么理解,如果你觉得开发时间应该很多的,那么前期的想法确定,相应也花了很长时间。如果想法确定时间很少,而开发很漫长,那么说明你的项目是有问题的。


以上只是从实践角度讲解,其实一款优秀的APP,特别是在如此激烈的互联网时代,要想成功还需要很多很大的力气,去完善去加强。这是一个伪命题,让我小渣写几本书都介绍不完(写完这篇文章够呛了!)。小渣认为一款优秀的APP应该是这样子的:

1,自我修行。拥有良好的心态,拥有生活独有的品质

2,洞察力。善于发现生活的美,善行天下

3,说服力。有一个惊喜的想法很珍贵,但需要让别人理解

4,坚持不懈的肯定。相信自己,相信周围的小伙伴。


常言道,努力不一定成功,但成功一定需要努力。一款优秀的APP,不一定能成功,但成功的APP,肯定是一款优秀的APP。文本只是小渣的片言片语,不一定看懂了就能使你的APP获得成功,小渣只是告诉你捷径。这里面具体如何走,靠的是你自己,在过程中如何应对突发情况。所以呢,还是踏实一步一个脚印。


完毕。


参考文献:

《Android开发艺术探索》 电子工业出版社 任玉刚

《结网》 人民邮电出版社 王坚

《人人都是产品经理》 电子工业出版社 苏杰

《用户体验要素》 机械工业出版社 (美)Jesse James Garrett


本文同时发表于微信公众账号、豆瓣、开源中国及CSDN,转载需要声明原文链接,谢谢配合。

Email:wsyangzuda@163.com欢迎交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值