【官网翻译】性能篇(八)无缝设计

前言html

       本文翻译自Android开发者官网的一篇文档,主要用于介绍关于无缝性设计相关的一些要点。android

       中国版官网原文地址为:https://developer.android.google.cn/guide/practices/app-design/seamlessness数据库

       路径为:Android Developers > Docs > 指南 > Best practies > Performance > Designing for seamlessness安全

 

正文网络

       即使您的应用是快速并且响应的,可是某些设计决策仍然可能给用户带来问题——由于和其它应用或对话框的非计划内的交互,无心的数据丢失,不期的阻塞,等。为了不这些问题,它帮助理解应用运行的上下文和能够影响到应用的系统交互。简而言之,您应该努力开发一款与系统和其它应用无缝交互的应用。app

       一个常见的无缝问题是,当应用的后台进程——例如,服务或者广播接收者——弹出对话框来响应某事件时。这视乎是无害的行为,尤为是当在模拟器上单首创建及测试应用时。可是,当您的应用在真机上运行的时候,在您的后台进程显示对话框时,您的应用可能不会拥有用户焦点。这可能最终变成您的应用在活动的应用后面显示对话框,或者可能从当前应用获取焦点,而且在用户正在进行的任何操做前显示对话框(例如拨打电话)。那种行为对您的应用或用户都不起做用。less

       为了不这些问题,您的应用应该使用合适的系统特点来通知用户——【Notification】类。经过使用通知,当事件发生时您的应用能够示意用户,在状态栏上显示一个图标而不是抢占焦点并打扰用户。ide

      另一个无缝性问题的例子是,当activity由于没有正确实现onPause()方法以及其它生命周期方法而无心间丢失状态或者用户数据时。或者,若是您的应用暴露数据来给其它应用使用,您应该经过ContentProvider来暴露,而不是(举个例子)经过全世界都能读的原始文件或数据库来这样作。组件化

       这些例子有一个共同点是,它们涉及到系统和其它应用良好地协做。Android系统被设计为将应用视为一种松耦合组件的组合,而不是大块的黑盒子代码。这容许您做为一个开发者将整个系统视为一个这些组件的更大组合。这经过容许您清晰并没有缝地集成其它应用来让您受益,而且这样的话您应该设计您本身的代码来反馈这个恩惠。布局

       本文将讨论常见的无缝性问题以及如何避免它们。

 

不要丢弃数据

       请时刻谨记,Android是一个移动平台。这提及来很明显,可是更要的是记住其它Activity(好比“电话来了”应用)能够在任什么时候刻弹出来覆盖在您本身的Activity上。这将激发onSaveInstanceState()方法和onPause()方法,而且颇有可能会致使您的应用被杀死。

       若是当其它Activity出现时,用户正在您的应用中编辑数据,当您的应用被杀死时将颇有可能丢失那些数据。固然,除非首先保存正在进行的工做。“Android方式”的作法是:接收或者编辑输入的Android应用应该重写onSaveInstanceState()方法而且以适当的方式保存它们的状态。当用户从新访问您的应用时,她应该可以取回她的数据。

       一个典型的这种行为的良好使用示例是邮件应用。若是当另一个应用启动时,用户正在撰写邮件,该应用应该将这封正在进行的邮件做为草稿保存。

 

不要暴露原始数据

       若是您不会穿着内衣在街上走,那么您的数据也不该该。由于这有可能暴露某些类型的应用让全世界读取,这一般不是最好的主意。暴露原始的数据须要其它应用来理解您的数据格式;若是您改变那个格式,您将破坏其它没有进行相似更新的应用。

       “Android方式”是建立一个ContentProvider经过清晰、稳当的、可维护的API来将数据暴露给其它应用。使用ContentProvider很是像插入一个Java语言接口来分开并组件化两个紧耦合的代码片断。这意味着您将能够修改您的内部数据格式,而不用改变ContentProvider暴露的接口,而且这不会影响其它应用。

 

不要打扰用户

       若是用户正在运行一个应用(好比正在通话时使用电话应用),那么这是一个很是安全的赌注,他是故意这样作的。那就是为何除了直接响应来自当前Activity的用户输入以外,您应该避免生成activity。

       也就是说,不要从正在后台运行的BroadcastReceiver或者Service调用startActivity()。这样作将中断当前应用正在运行的工做,而且致使吵到用户。可能更严重的是,您的Activity可能变成一个“按键强盗”而且收到一些用户正在提供给前一个Activity的输入信息。根据您的应用的所做所为,这多是一个坏消息。

       您应该使用NotificationManager来设置通知,而不是从后台生成Activity用户界面。这些将会出如今状态栏,而且用户能够在空闲的时候点击它们,来看看您的应用给他们显示了什么。

       (请注意,全部的这些不适用于您本身的Activity已经在前台的场景:在那些场景中,用户但愿看到您下一个Activity来响应输入事件。)

 

有不少事情要作?在线程中完成吧

       若是您的应用须要执行一些昂贵或者长时间运行的计算,您可能应该把它们移动到一个线程中。这将阻止可怕的“应用未响应”对话框显示给用户,最终的结果是您的应用火爆地终止了。

       默认状况下,Activity中的全部代码以及它的全部视图都运行在相同的线程中。这也是处理UI事件的同一个线程。例如,当用户按了一个按键,按键按下事件就被添加到该Activity的主线程队列中。事件处理系统须要从队列中取出事件并快速处理它们;若是没有,几秒钟后系统会判定该应用已经被挂起而且为用户杀死它。

       若是您有长时间运行的代码,那么在Activity中内联运行它将会在事件处理线程中运行,从而有效地阻塞事件处理。这将延迟输入处理,并致使ANR对话框。为了不这种现象,将计算移动到子线程中。【为响应而设计】文档中会讨论如何作。

 

不要过分加载一个单独的activity屏幕

       全部值得使用的应用可能有多个不一样的屏幕。当为您的UI设计屏幕时,确保使用多个Activity对象实例。

       根据您开发的背景,您可能解释Activity为相似于Java Applet的东西,由于它是您应用的入口点。可是,那并不彻底正确:Applet子类是Java Applet惟一的入口点,可是Activity应该被认为是可能的进入应用的几个入口点之一。您“main”Activity和任何其它Activity之间您可能拥有的惟一差异是,“main”Activity碰巧是惟一一个对AndroidManifest.xml文件中的“android.intent.action.MAIN”行动表达过兴趣的Activity。

       因此,当设计应用时,将应用当作是Activity对象的组合。从长远看,这将会让您的代码更加具备可维护性,而且做为一个很好的反作用,它与Android的应用历史以及“回退栈”模式配合得很是好。

 

继承系统主题

       当涉及到用户接口的外观和感受时,重要的是将它们很好地融合在一块儿。用户被那些与他们所指望的用户接口大相径庭的应用弄得很烦躁。当设计您的UI时,您应该尽量尝试避免滚动您的界面。相反,使用主题。您能够重写或者继承那些您须要的主题部分,但至少您正在从和其余应用相同的UI基础启动。更多详情,请查阅【类型和主题】。

 

设计您的UI来适配多屏幕分辨率

       不一样的Android驱动设备将支持不一样的屏幕分辨率。有一些将甚至可能在运行中改变分辨率,好比经过切换到横屏模式。重要的是确保您的布局和图片在不一样的设备屏幕上足够灵活,以正确显示。

       幸运的是,这很是容易实现。简单来讲,您必需要作的是为主要分辨率提供不一样的图片版本(若是您使用任何一个),而且设计您的布局来适配不一样的尺寸。(例如,避免使用硬编码位置而且使用相对布局。)若是您作了不少,系统会处理剩下的,而且您的应用在任何设备上都看起来很不错。

     

假设网速慢

        Android设备将会提供各类不一样的网络链接选项。全部的这些选项将拥有一些数据访问规定,虽然有些将会比其它的快。但是,最小的公分母是GPRA,这是一种用于GSM网络的非3G数据服务。即便是支持3G的设备也将花费不少时间在非3G网络上,因此在将来很长一段时间缓慢的网络将仍然是一个事实。  

       那就是为何您应该老是编写您的应用来最小化网络访问和带宽。您不能假设网络是很快的,因此您应该老是为网速变慢作好计划。若是您的用户碰巧在更快的网络,那是很棒的——他们的用户体验将只会提高。不过,您但愿避免相反的状况:基于任何给定的时刻用户所在的位置,部分时间可使用,但剩余时间却很是慢的应用,多是不受欢迎的。

       这里有一个潜在的问题是,若是您正在使用模拟器,将很容易掉进这个陷阱,由于模拟器使用的是您的桌面电脑网络链接。那几乎能够确信比蜂窝网络快不少,因此您将须要更改模拟器上用来模拟更慢的网络速度的设置。当启动模拟器时,您能够在AndroidStudio中经过AVD Manager或者经过【命令行选项】来作这件事。

 

不要假设触摸屏或者键盘

       Android将会支持多种遥控器形式的因素。那是一种很奇特的说法,某些Android设备将拥有完整的“QWERTY”的键盘,而后其余的设备将拥有40按键,12按键,或者甚至其它按键配置。类似地,有些设备将拥有触摸屏,可是不少却没有。

       当构建您的应用时,请记住那些。不用假设特别的键盘布局——固然,除非您确实热衷于限制您的应用以致于让它只能在那些设备上使用。

 

节省设备电池

       若是常常被插到墙里,那么移动设备就不那么移动了。移动设备是电池驱动的,而且让电池一次充电后延续的时间越长,全部人就越开心——尤为是用户。电池电量的两个最大消费者是处理器和无线通讯;那就是为何尽量编写您的应用来作尽量少的工做,而且尽量少地使用网络是很重要的。

       最小化您应用使用的处理器时间实际上来源于【编写高效的代码】。为了最小化来自使用无线电通讯的电量流失,请确保优雅地处理错误条件,而且只取您所须要的。例如,若是一次失败了,不要常常重试网络操做。若是它失败了一次,极有多是由于用户没有接收信号,因此若是立刻尝试,可能将要再次失败;全部您将作的都是浪费电量。

       用户时很是明智的:若是您的程序是很是耗电的,您能够期望他们注意到。在那个点上,您惟一能确信的事情是,您的程序安装时间将不会很长了。

 

结语 

       本文最大限度保持原文的意思,因为笔者水平有限,如有翻译不许确或不稳当的地方,请指正,谢谢!

相关文章
相关标签/搜索