Android 程序应该考虑的问题

Android最佳实践之流畅设计
即便你的应用程序是快速且响应灵敏的,但一些设计仍然会给用户形成问题——与其它应用程序或对话框未事先计划的交互,意外的数据丢失,意料以外的阻塞等等。避免这些问题,有助于理解应用程序运行的上下文和系统的交互过程,而这些又正影响着你的应用程序。简而言之,你应该不遗余力去开发一个与系统和其它应用程序流畅交互的应用程序。
一个常见的流畅问题是,一个应用程序的后台处理——例如,一个Service或者BroadcastReceiver——弹出一个对话框来响应一些事件。这可能看起来没啥大碍,尤为是你在模拟器上单独地构建和测试你的应用程序的时候。然而,当你的应用程序运行在真机上时,有可能你的应用程序在没有得到用户焦点时后台处理显示了一个对话框。所以,可能会出如今活跃的应用程序后方显示了你的应用程序的对话框,或者从当前应用程序夺取焦点显示了一个对话框,而无论当前用户正在作什么(例如,正在打电话)。那种行为,对应用程序或用户来讲,就不该该出现。
为了不这些问题,你的应用程序应该使用合适的系统资源来通知用户——Notification类。使用Notification,你的应用程序能够在状态栏显示一个icon来通知用户已经发生的事情,而不是夺取焦点和打断用户。
另外一个流畅问题的例子是未能正确实现Activity的onPause()和其它生命周期方法而形成意外丢失了状态或用户数据。又或者,若是你的应用程序想暴露数据给其它应用程序使用,你应该经过ContentProvider来暴露,而不是(举例)经过一个可读的原始文件或数据库来实现。
这些例子的共同点是它们都应该与系统和其它应用程序协做好。Android系统设计时,就把应用程序看做是一堆松散耦合的组件,而不是一堆黑盒代码。做为开发者来讲,容许咱们把整个系统看做是更大的组件集合。这有益于咱们能够与其它应用程序进行清晰无缝的集成,所以,做为回报,咱们应该更好的设计咱们的代码。
这篇文章将讨论常见的流畅问题以及如何避免它们。它将囊括这些主题:
1) 别丢弃数据
2) 不要暴露原始数据
3) 不要打断用户
4) 有太多事情要作?在线程里作
5) 不要让一个Activity超负荷
6) 扩展系统主题
7) 设计你的UI能够应付多屏幕分辨率
8) 假设网络很慢
9) 不要假定触摸屏或键盘
10) 节省设备电池
1)别丢弃数据

必定要记住Android是一个移动平台。能够显而易见地说,其它Activity(例如,“Incoming Phone Call”应用程序)可能会在任什么时候候弹出来遮盖你的Activity,记住这个事实很重要。由于这个过程将触发onSaveInstanceState()和onPause()方法,并可能致使你的应用程序被杀死。
若是用户在你的应用程序中正在编辑数据时,其它Activity出现了,这时,你的应用程序被杀死时可能丢失那些数据。固然了,除非你事先保存了正在进行的工做。“Android方式”是这样作的:能接收和编辑用户输入的Android应用程序应该重写onSaveInstanceState()方法,并以恰当的方式保存它们的状态。当用户从新访问应用程序时,她能获得她的数据。
进行这种处理方式最经典的例子是mail应用程序。若是用户正在输入email,这时其它Activity启动了,mail应用程序应该把正在编辑的email以草稿的方式保存起来。
2)不要暴露原始数据
若是你不想穿着内衣在大街上溜达的话,你的数据也不该该这样。尽管可能存在暴露应用程序的某种形式给其它应用程序,但这一般不是最好的主意。暴露原始数据,要求其它应用程序可以理解你的数据的格式;若是你变动了格式,那么,你将破坏那些没有进行同步更新的应用程序。
“Android方式”是建立一个ContentProvider,以一种清晰的、深思熟虑的和可维护的API方式暴露你的数据给其它应用程序。使用ContentProvider,就好像是插入Java接口来分离和组装两片高耦合的代码。这意味着你能够修改数据的内部格式,而不用修改由ContentProvider暴露的接口,这样,也不会影响其它应用程序。
3)不要打断用户
若是用户正在运行一个应用程序(例如,Phone程序),判定对用户操做的目的才是安全的。这也就是为何必须避免建立Activity,而是直接在当前的Activity中响应用户的输入。
那就是说,不要在BroadcastReceiver或在后台运行的Service中调用callActivity()。这么作会中断当前运行的应用程序,并致使用户恼怒。也许更糟糕的是,你的Activity可能成为“按键强盗”,窃取了用户要提供给前一个Activity的输入。视乎你的应用程序所作的事情,这多是个坏消息。
不选择在后台直接建立Activity UI,取而代之的是,应该使用NotificationManager来设置Notification。它们会出如今状态栏,而且用户能够在他空闲的时候点击它们,来查看你的应用程序向他显示了什么。
(注意,若是你的Activity已经在前台了,以上将不适用:这时,对于用户的输入,用户指望的是看到下一个Activity来响应。)
4)有太多事情要作?在线程里作
若是你的应用程序须要执行一些昂贵或耗时的计算的话,你应该尽量地将它挪到线程里。这将阻止向用户显示可怕的“Application Not Responding”对话框,若是不这样作,最终的结果会致使你的应用程序彻底终止。
通常状况下,Activity中的全部代码,包括它的View,都运行在相同的线程里。在这个线程里,还须要处理UI事件。例如,当用户按下一个按键,一个key-down事件就会添加到Activity的主线程队列里。事件处理系统须要很快让这个事件出列并获得处理;若是没有,系统数秒后会认为应用程序已经挂起并为用户提供杀死应用程序的机会。
若是有耗时的代码,内联在Activity上运行也就是运行在事件处理线程里,这在很大程度上阻塞了事件处理。这会延迟输入处理,并致使ANR对话框。为了不这个,把你的计算移到线程里。在响应灵敏性设计的文章里已经讨论了如何作。

5)不要让一个Activity超负荷
任何值得使用的应用程序均可能有几个不一样的屏幕。当设计UI屏幕时,请必定要使用多个Activity对象实例。
依赖于你的开发背景,你可能理解Activity相似于Java Applet,它是你应用程序的入口点。然而,那并不精确:Applet子类是一个Java Applet的单一入口点,而一个Activity应该看做是你的应用程序多个潜在入口点之一。你的“main”Activity和其它之间的惟一不一样点是“main”Activity正巧是在AndroidManifest.xml文件中惟一对“android.intent.action.MAIN”动做感兴趣的Activity。
所以,当设计你的应用程序的时候,把你的应用程序看做是Activity对象的集合。从长远来看,这会使得你的代码更加方便维护。
6)扩展系统主题
当谈到UI观感时,巧妙地交融很是重要。用户在使用与本身指望相反的UI的应用程序时,会产生不愉快的感受。当设计你的UI时,你应该尽可能避免太多本身的主题。相反的,使用同一个主题。你能够重写或扩展你须要的主题部分,但至少在与其它应用程序相同的UI基础上开始。详细请参照“应用风格和主题”部分。
7)设计你的UI能够应对多屏幕分辨率
不一样的Android设备可能支持不一样的屏幕分辨率。甚至一些能够本身变动分辨率,例如,切换到风景模式。确保你的布局和图片能足够灵活地在不一样的设备屏幕上正常显示。
幸运的是,这很容易作到。简而言之,你须要作的是为主要分辨率提供不一样版本的做品,而后为不一样的尺寸设计你的布局。(例如,避免使用硬编码位置而使用相对布局。)若是那样作的话,系统会处理剩下的部分,并且你的应用程序在任何设备上都看起来很棒。
8)假设网络很慢
Android设备会有多种网络链接选项。全部的都提供数据访问,但之间确定有更快的。其中,速度最慢的是GPRS,GSM网络的非3G数据服务。即便具有3G能力的设备在非3G的网络上也会花费不少的时间,因此,网络很慢仍然是一个长期存在的事实。
这就是为何你应该按照最小化的网络访问和带宽来编写你的代码。你不能假设网络是快速的,因此,你应该老是计划它是慢的。若是你的用户碰巧在一个快速的网络上,那很好——他们的用户体验会提高。你要避免相反的情形:在不一样的地点和不一样时间,应用程序有时可用,有时慢得使人抓狂,这样的程序可能不会受欢迎。
还有一个潜在的地方是,若是你正在使用模拟器,那么你很容易受它迷糊,由于模拟器使用电脑的网络链接。这比手机网络快不少,因此,你须要修改模拟器设定来模拟较低的网络速度。你能够在Eclipse中作到这点,在启动选项的模拟器设置页里设置或者在启动模拟器时经过命令行选项设置。
9)不要假定触摸屏或键盘
Android能够支持多种外观形状。也就是说,一些Android设备拥有全“QWERTY”键盘,而其它可能会有40键、12键或其它键盘设置。一样的,一些设备可能有触摸屏,但一些也会没有。
当建立你的应用程序的时候,记住这一点。不要假定特定的键盘布局——除非你真的想限定你的应用程序只运行在某些设备上。

10)节省设备电池
若是移动设备常常插在墙上,那么,它也就不是很“移动”。移动设备是电池供电的,若是咱们能让每次充电的电池使用得更持久一些,那么每一个人都会更加开心——尤为是用户。其中两大耗电硬件是处理器和无线;这也就是咱们为何要写尽量少作工做、尽量少去使用网络的应用程序的重要缘由。
如何让你的应用程序最小化的占用处理器,归根结底仍是要写高效代码。为了减小无线的电量消耗,确保对错误条件进行正确的处理,并只获取你要的东西。例如,若是某一个网络操做失败了,不要不断地进行重试。若是失败了一次,有多是用户不受欢迎,所以,若是你再以正确的方式操做,有可能还会失败;全部你作的都是在浪费电池。
用户是至关聪明的:若是你的程序高耗电,他们是必定会发现的。到那个时点,你惟一能够肯定的是,你的程序将很快被卸载掉。
相关文章
相关标签/搜索