android6流畅,Android应用流畅(Seamlessness)设计

即使你的应用程序是快速且响应灵敏的,但一些设计仍然会给用户造成问题——与其它应用程序或对话框未事先计划的交互,意外的数据丢失,意料之外的阻塞等 等。避免这些问题,有助于理解应用程序运行的上下文和系统的交互过程,而这些又正影响着你的应用程序。简而言之,你应该竭尽全力去开发一个与系统和其它应 用程序流畅交互的应用程序。

一个常见的流畅问题是,一个应用程序的后台处理——例如,一个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)节省设备电池

如果移动设备经常插在墙上,那么,它也就不是很“移动”。移动设备是电池供电的,如果我们能让每次充电的电池使用得更持久一些,那么每个人都会更加开心 ——尤其是用户。其中两大耗电硬件是处理器和无线;这也就是我们为什么要写尽可能少做工作、尽可能少去使用网络的应用程序的重要原因。

如何让你的应用程序最小化的占用处理器,归根结底还是要写高效代码。为了减少无线的电量消耗,确保对错误条件进行正确的处理,并只获取你要的东西。例如, 如果某一个网络操作失败了,不要不断地进行重试。如果失败了一次,有可能是用户不受欢迎,因此,如果你再以正确的方式操作,有可能还会失败;所有你做的都 是在浪费电池。

用户是相当聪明的:如果你的程序高耗电,他们是一定会发现的。到那个时点,你唯一可以确定的是,你的程序将很快被卸载掉。

【编辑推荐】

【责任编辑:闫佳明 TEL:(010)68476606】

点赞 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stack overflow--技术问答网站

转自:http://baike.baidu.com/link?urleMR6Pwdk9IkauI5B3nZb2Yo3VUAcK6vQfrMpcSMPWqgH0ngqFkup3Gdr3t_s_yZe_UFwkR8c1pboaxhEuY-iwF_nGiUYHajEPMO6Y1kqWvT8aPz7a_T6t3a1vxyTccgKl_UIx1cU-6IP7qjre2ijtq Stack Overflow是一个与程序相关的IT技术问答网站。用户可以在…

8782:乘积最大

【题目描述】 有一个长度为N的数字串,要求选手使用K个乘号将它分成K1个部分,找出一种分法,使得这K1个部分的乘积能够为最大。 【题目链接】 http://noi.openjudge.cn/ch0206/8782/ 【算法】 决策过程:决策插入第i个乘号的位置使插…

uvalive 4973 Ardenia

题意&#xff1a;给出空间两条线段&#xff0c;求距离。 注意输出格式&#xff01; 1 #include<cstdio>2 #include<cmath>3 #include<algorithm>4 using namespace std;5 6 struct Point37 {8 int x, y, z;9 Point3(int x0, int y0, int z0):x(x),y(…

rz和sz上传下载文件

安装软件包 yum install lrzsz 上传文件&#xff0c;输入rz选择文件上传(可以按住shift键多选) # rz sz 下载文件到本地&#xff0c;选择保存文件夹 # sz dd xshell设置默认上传下载文件夹 转载于:https://www.cnblogs.com/fcing/p/9382377.html

上班第一天(6)--一个程序员的成长史(15)

走出公司大门口之后&#xff0c;代是雄看到很多人都朝着一个方向走去。代是雄比较纳闷&#xff0c;于是便问保安这是什么情况。“你是新来的吧&#xff1f;连这个都不知道吗&#xff1f;”保安似乎不屑于回答新人的问题。“我是新来的实习生&#xff0c;”代是雄压制住了心中的…

自学Java汇报(3)

本周自学Java总结&#xff1a; 继承语法、成员变量的隐藏和方法的覆盖、super、final、多态、组合于继承、初始化顺序、部分抽象类。 总用时八小时&#xff0c;编程两小时。 下周目标&#xff1a;接口、枚举、异常。转载于:https://www.cnblogs.com/lianghang/p/9384793.html

怎样在html中设置首字母大写,javascript如何设置字符串首字母大写?

给出一个字符串&#xff0c;如何确保字符串的首字母都大写&#xff1f;下面本篇文章就来给大家介绍一下使用javascript设置首字母大写的方法&#xff0c;希望对大家有所帮助。在javascript中&#xff0c;可以使用slice()方法、toUpperCase()方法和toLowerCase()方法来设置首字母…

win2008修改远程端口

2019独角兽企业重金招聘Python工程师标准>>> 网络上找到的一段代码&#xff0c;保存为.bat&#xff0c;运行修改成功&#xff0c;需要重启。 echo off color 0a echo ◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇ echo ◇◇◇◇修改远程桌面3389端口批处理◇◇◇◇ ech…

ios7 苹果原生二维码扫描(和微信类似)

在ios7苹果推出了二维码扫描&#xff0c;以前想要做二维码扫描&#xff0c;只能通过第三方ZBar与ZXing。 ZBar在扫描的灵敏度上&#xff0c;和内存的使用上相对于ZXing上都是较优的&#xff0c;但是对于 “圆角二维码” 的扫描确很困难。 ZXing 是 Google Code上的一个开源的条…

有符号位和无符号位。——int8疑问有感

学习go语言的数据类型&#xff0c;看见int、int8、int16很是疑惑&#xff0c;int8是什么意思&#xff1f;查询资料进行综合解释大概如下&#xff1a; Int8是有符号位8位整形&#xff08;-128到127&#xff09;&#xff0c;随即产生疑惑&#xff0c;为什么负数可表示到-128&…

html帮助文档乱码,使用doxygen生成的帮助文档,中文出现乱码的问题

今天使用doxygen工具生成帮助文档发现中文注释都是乱码。然后根据网上的要求把Exper>>Input>>INPUT_ENCODING&#xff1a;(输入文件的编码) UTF-8 改成 GBK 或者 GB2312Exper>>HTML>>CHM_INDEX_ENCODING&#xff1a;(输出文件的编码) UTF-8 改成 GBK 或…

Java并发编程--理解ThreadLocal

另一篇博文&#xff1a;Hibernet中的ThreadLocal使用 http://www.cnblogs.com/gnivor/p/4440776.html 本文参考&#xff1a;http://blog.csdn.net/lufeng20/article/details/24314381http://www.cnblogs.com/chenying99/articles/3405161.html ThreadLocal类接口很简单&#xf…

delphi Post数据到网页

varhttp: TIdHttp;sendtoserver: TStringStream;str: string; beginhttp : TIdHttp.Create(); // 创建http.HandleRedirects : True; // 允许转头http.ReadTimeout : 3000; …

python之路——迭代器与生成器

要了解for循环是怎么回事儿&#xff0c;咱们还是要从代码的角度出发。 首先&#xff0c;我们对一个列表进行for循环。 for i in [1,2,3,4]: print(i) 上面这段代码肯定是没有问题的&#xff0c;但是我们换一种情况&#xff0c;来循环一个数字1234试试 for i in 1234print(i) 结…

HTML页面显示透视效果,html – CSS – 对背景图像的“敲除”/透视效果

我认为这里的想法是图像必须足够大,以覆盖网页或至少父母div ..然后,您可以将图像应用于容器和’inner’div的背景.覆盖可以通过伪元素而不是单独的div来实现.修订结构 –.bck {position: relative;height: 800px;width: 100%;background:url(http://webneel.com/wallpaper/sit…

DFS分布式文件系统--管理篇

DFS分布式文件系统--管理篇参考文档&#xff1a;浅谈DFS分布式文件系统DFS 命名空间 和 DFS 复制概述续DFS分布式文件系统--基础篇DFS分布式文件系统--部署篇添加命名空间服务器&#xff08;添加第二台命名空间服务器 NameSrv02)成功后如下图&#xff1a;“从显示区域隐藏命名空…

Linux 0-1 修改主机名及IP地址

1.修改主机名 hostname 查看主机名 vi /etc/sysconfig/network 修改hostname主机名 vi /etc/hosts 修改127.0.1 主机名 service network restart #/etc/hosts 在域名解析时优先于DNS服务器2.IP地址 ifconfig 查看目前网络卡信息 cd /etc/sysconfig/network-scripts ls查看…

html渐变颜色代码表,渐变颜色代码表

渐变颜色代码表2020-12-24素材&#xff1a;网络 编辑&#xff1a;唔尔灬#000000#2F0000#600030#460046#28004D#272727#4D0000#820041#5E005E#3A006F#3C3C3C#600000#9F0050#750075#4B0091#4F4F4F#750000#BF0060#930093#5B00AE#5B5B5B#930000#D9006C#AE00AE#6F00D2#6C6C6C#AE0000…

js贪心算法---背包问题

/** param {Object} capacity 背包容量 6* param {Object} weights 物品重量 [2,3,4]* param {Object} values 物品价值 [3,4,5]*///贪心算法&#xff0c;只能算&#xff0c;可以分割的物品&#xff0c;如果不能分割物品&#xff0c;只能得到近似解&#xff0c;不分割物品&…

Spring利用JDBCTemplate实现批量插入和返回id

1、先介绍一下java.sql.Connection接口提供的三个在执行插入语句后可取的自动生成的主键的方法&#xff1a; //第一个是 PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException; 其中autoGenerateKeys 有两个可选值&#xff1a;Stat…