# Android 上那些“不守规矩”的应用们

- 作者：徐浩岑
- 发布时间：2012-06-11 13:54
- 分类：公司
- 原文：https://www.ifanr.com/97675

[![](https://s3.ifanr.com/wp-content/uploads/2012/06/image1.png "image.png")](http://www.ifanr.com/97675/image-png-199)

我曾经作为一个普通消费者使用过 Android 设备很长一段时间，也一直感叹它的强大与便利。而我有机会接触 iOS 设备之后，却更是为 iOS 系统的灵巧、便利和美观惊叹。运行同样的应用， iOS 设备总是显得更为灵动和友好。 iOS 设备无比迅捷的响应能力更是令我印象深刻，据称这是由于系统界面绘制时，图形进程优先级别不同造成的。

而作为一个刚刚入门的 Android 开发者，我最近阅读了许多 Android 应用的开发指导与规范，也确实按照这些规范开发了几个 Android 应用，但却感到越来越不是滋味。虽然这些指导与规范十分合理与明确，但很明显，许多现有的 Android 应用不知为何都没有遵守它们。我自己每天使用的 Android 设备上虽然安装了近百个应用，但真正称的上“规范”的却寥寥无几。这使我意识到，很多时候，运行 Android 系统的设备虽然存在一些固有的缺陷，但更多时候糟糕的应用才是造成用户体验不佳的罪魁祸首。

### “生命周期”规范

如果用通俗易懂的语言来描述， Android 应用的标准生命周期正式开始于被启动并显示应用界面，此后只要用户没有离开应用界面，那么这个应用将始终处于“可见”阶段。换言之，一旦用户通过什么操作从当前应用中跳出，那么这个应用将进入下一个阶段，这个阶段被称为“后台”阶段。离开当前应用的方式有很多种，可能是当前应用启动了另外一个应用，也可能是用户通过“返回”或者“主界面”按钮主动离开了应用。在处于“后台”阶段的应用可以随时回到“活动”阶段——只要用户通过任务管理器或者任何别的方式重新启动了它。处于“后台”阶段的应用也通常可能会因为内存不足被终止。

由于处于“后台”阶段的应用可能会被不可预期的终止，Android 允许应用在切换到后台时一定会有机会对当前数据进行保存。不过与此同时，处于“后台”阶段的应用被终止时其实也有机会保存数据，但这个保存机会是否存在取决于系统内存的紧张程度。

因此，通常建议 Android 开发者在应用切换到“后台”阶段时保存对用户来说十分重要的数据，比如 Gmail 应用会在切换到“后台”时保存邮件的草稿。而那些对用户来说不那么重要的数据，比如 Gmail 应用从服务器上缓存到一半的邮件数据，建议在应用被终止时再尝试保存，因为它们可以随时从服务器上重新拉取，丢了也无关紧要，何况他们相对更为庞大，容易在进行保存操作时拖累系统效能。

但我在操作调试器监视自己的 Android 设备时，却注意到一些内置了广告服务的应用，尤其是游戏应用，会在切换到“后台”时尝试保存从服务器上获取到的广告图片。这些图片数据不仅很大，而且数量也不算少，导致游戏切换到主界面时速度很慢，降低了用户的操作体验。这么做的原因也不是不能理解：这些应用无论如何都希望在你没有网络连接时向你展示广告。

而在 iOS 系统上，应用被切换到后台时也有机会执行操作。但系统和用户随时都可以强行结束应用，这种情况下应用没有机会执行任何操作。这也使得很多开发者更小心地处理自己的应用，以免因占用资源太多被系统关闭，而不会出现 Android 上那种肆无忌惮的做法。

值得一提的 Google 官方指导完全没有做这方面的限制和要求， Google Play 也没有因此对应用进行下架。

### “数据存储”规范

iOS 上由于没有文件系统，且对应用产生的缓存和用户数据都有非常苛刻的存储规范，否则就会被苹果公司下架，因此应用对于存储数据的位置十分统一。

但在 Android 上，这简直就是一场灾难。获取大容量存储器读写权限之后，很多应用都会在其根目录中生成缓存文件。除了上文提到的广告，这些文件甚至可能是应用程序用于存储自身状态的。因为有些应用希望在被卸载重新安装后仍能找回先前的配置。但这也造成很多问题。首先这给用户管理存储器带来了巨大的不便：要如何处理这些自己冒出来的文件？其次这种行为也无故减少了存储器的可用容量：如果用户再也不打算安装这个应用了怎么办？

事实上，Android 系统已经设计了可用于应用存储内部数据的几种方式。除了机身内部对应的数据文件，如果应用确有必要，也可以在大容量存储器的 Android/Data 位置存储数据，这些数据也能在应用卸载时一并被 Android 系统自动删除。不过许多开发者对此完全不在意，仍然肆无忌惮的在用户存储器内生成各种文件。某著名新闻客户端生成的存储文件甚至会给用户造成严重困扰，使用户相册无故出现不相干的图片。因为其缓存文件夹没有遵守命名规范，在文件夹名前加“.”或者在文件夹内放置 .nomedia 文件以防止媒体扫描应用搜索。另一款著名即时通讯软件更是夸张，竟然同时生成两个文件夹缓存数据。

Google 官方指导同样没有在这方面提出限制和要求，只是简单解释了几种数据存储方式的用法和用例。

### “交互界面”规范

相信很多朋友看到这里第一个反应是： Android 有应用交互界面规范吗？遗憾的是， Android 2.3 之前的确是没有明确的应用交互界面规范。但在 Android 系统来到 4.0 之后， Google 终于意识到应用交互界面的规范化有多么的重要，因此推出了基于 Holo 主题的应用交互指导。现在，包括淘宝，人人和一众 Google 自己的应用已经依照新规范重新开发，它们看上去兼具美感和实用性。但也有一些应用刚愎自用，甚至照搬 iOS 系统上的界面。希望未来它们能够有所改变，给用户带来更好的体验。

除了上文提到的 Android 应用普遍存在一些问题， Android 上的一些著名应用不守规矩的行为更是夸张，比如某款通讯录应用就会尝试将自己的短信接受优先级别设置成比系统应用还高，一度导致了 Android 防病毒程序 Dr.Web 报告病毒。某款网盘应用则关联了 Android 系统内所有可以注册的文件类型，导致用户打开任何文件时都会被询问“是否要上传到网盘？”这些问题的具体细节太过复杂，在此略过不表。

总体上来说， Android 是一个自由的系统。就连 Google 官方指导也都弥漫着这种气息。它很少告诉你“要怎么做”，而是一直不停的解释“能怎么做”。比方说，应用图标的形状以及风格完全不受限制。或许 Google 认为圆角矩形的磁贴风格并不是设计师唯一的选择。Google 也没有强制开发者必须使用 [Google Backup Transport](http://developer.android.com/guide/topics/data/backup.html) 云端数据备份接口。更没有强调 [Android C2DM](https://developers.google.com/android/c2dm/) 是应用程序接受推送数据的唯一方式。就连 [Holo](http://developer.android.com/design/index.html) 主题风格也仅仅是推荐开发者采用，并没将不符合规范的应用从 Google Play 下架。

有评论认为 Google 太过仁慈而导致应用程序总会有些不守规矩的小动作，但我认为自由和开放不能因此而受到影响。更多时候，还是希望开发者能够仔细研究自己的程序可能造成的问题，不要怎么方便怎么来，多从用户的考虑角度一下。
