不同设备的 Android 应用开发指南
1. 引言
随着 Android 平台的快速发展,其 SDK 不断更新,新手机也层出不穷。这就要求开发者能够为不同的目标设备开发 Android 应用。Android 设备在硬件、软件特性以及所运行的 SDK 版本上存在差异,因此需要进行有效的配置管理。
2. Android 配置管理
2.1 确定目标平台的考虑因素
在确定目标平台时,开发者需要考虑以下因素:
-
硬件特性
:应用是否需要触摸屏、硬件键盘、方向键或特定的屏幕尺寸?
-
软件特性
:应用是否支持不同的屏幕方向?
-
Android SDK 版本
:应用需要哪个版本的 Android SDK?
2.2 资源目录限定符
许多配置管理可以通过资源目录限定符策略来处理,类似于应用国际化的做法。资源目录可以通过添加限定符来为不同的应用配置提供资源。以下是一些重要的资源目录限定符:
| 目录限定符类型 | 值 | 注释 |
| — | — | — |
| 语言 | en, fr, es, zh, ja, ko, de 等(ISO 639 - 1 双字母语言代码) | |
| 地区/区域设置 | rUS, rGB, rFR, rJP, rDE 等(ISO 3166 - 1 - alpha - 2 区域代码,全大写,前面加小写 r) | |
| 屏幕尺寸 | small, normal, large, xlarge | 屏幕大小和密度比 |
| 屏幕纵横比 | long, notlong | 用于处理“宽屏”设备 |
| 屏幕方向 | port, land | 竖屏模式,横屏模式 |
| 对接模式 | car, desk | 设备处于特定的对接状态 |
| 夜间模式 | night, notnight | 设备处于夜间或白天模式 |
| 屏幕像素密度 | ldpi, mdpi, hdpi, xhdpi, nodpi | 资源所适用的屏幕密度 |
| 触摸屏类型 | notouch, stylus, finger | 无触摸屏,仅触笔,手指触摸屏 |
| 键盘可用性 | keysexposed, keyshidden, keyssoft | 键盘可用,键盘对用户不可用,仅与软件键盘一起使用的资源 |
| 主要非触摸屏导航方法 | nonav, dpad, trackball, wheel | 四键方向键,轨迹球,滚轮 |
| SDK 版本 | v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12 等 | SDK 版本的 API 级别(例如,v4 是 Android SDK 1.6,v11 代表 Android SDK 3.0) |
2.3 正确与错误的限定目录示例
- 正确示例 :
- /res/values - en - rUS - port - finger
- /res/drawables - en - rUS - land
- /res/values - en - v11
- 错误示例 :
- /res/values - en - rUS - rGB
- /res/values - en - rUS - port - FINGER
- /res/values - en - rUS - port - finger - custom
3. 处理不同的屏幕方向
3.1 屏幕方向处理策略
Android 应用可以根据用户倾斜设备屏幕的方式在横屏或竖屏模式下运行。为了支持不同的屏幕方向,最好设计简单的布局,使其在两种模式下都能正常工作。以下是一些开发适用于多种屏幕类型的布局的提示:
- 不要使屏幕过于拥挤,保持简单。
- 使用可扩展的容器视图,如 ScrollView 和 ListView。
- 仅在一个方向(垂直或水平)上缩放和扩展屏幕,而不是两个方向。
- 不要硬编码屏幕元素的位置,而是使用相对位置和布局,如 RelativeLayout。
- 避免使用 AbsoluteLayout 和其他特定像素的布局设置。
- 使用可拉伸的图形,如 Nine - Patch。
- 保持资源尽可能小,以便在屏幕方向改变时快速加载。
3.2 添加自定义屏幕方向布局
要根据设备的方向修改屏幕显示,只需添加一组新的布局资源文件。具体步骤如下:
1. 在 /res/layout - land/ 目录中创建一个新的特定于横屏的布局文件。
2. 确保包含默认布局资源中定义的所有在 Java 代码或其他文件中引用的控件。
3. 设计一个在横屏模式下也美观的新布局版本。
3.3 设计横屏模式布局示例
3.3.1 横屏模式启动屏幕布局
- 启动屏幕的布局定义在 /res/layout/splash.xml 资源文件中。在横屏模式下运行应用时,图形会将版本和版权信息推到屏幕底部,导致其被遮挡。
-
为了解决这个问题,可按以下步骤操作:
1. 创建一个新的布局资源文件 /res/layout - land/splash.xml。
2. 将 /res/layout/splash.xml 的原始内容复制到新文件中。
3. 修改特定于横屏的布局文件的内容,以适应横屏模式设备。例如,将四个图像显示在一个 TableRow 控件中,而不是两个。
4. 可以通过在 /res/values - land/dimens.xml 资源文件中创建替代尺寸资源,稍微修改 TextView 控件的引用尺寸。确保替代尺寸资源的名称与 /res/values/dimens.xml 文件中存储的默认版本相同。
3.3.2 横屏模式主菜单屏幕布局
- 主菜单屏幕的布局定义在 /res/layout/menu.xml 资源文件中。在横屏模式下运行应用时,巨大的地球图形会遮挡菜单项。
- 可以采取以下措施:
- 创建一个替代布局 /res/layout - land/menu.xml,复制默认布局的内容,并移除带有地球图形的 ImageView 控件。
- 为了修复背景拉伸问题,创建三个新的可绘制文件夹 /drawable - land - hdpi、/drawable - land - mdpi 和 /drawable - land - ldpi。在每个文件夹中,放置一个适合屏幕密度和方向的 bkgrnd.png 文件的新版本。
3.3.3 横屏模式游戏屏幕布局
- 游戏屏幕的布局定义在 /res/layout/game.xml 资源文件中。在横屏模式下运行应用时,问题图形和文本会在屏幕底部被裁剪。
-
可按以下步骤改进:
1. 创建一个新的布局资源文件 /res/layout - land/game.xml。
2. 将 /res/layout/game.xml 的原始内容复制到新文件中。
3. 修改特定于横屏的布局文件的内容,以适应横屏模式设备。例如,将包含问题图形和文本的 LinearLayout 控件的方向改为水平,使问题图形显示在问题文本的左侧,而不是上方。调整其他属性,直到对布局设计满意为止。只要不更改重要控件的唯一标识符,应用功能就不会改变。
4. 可以通过在 /res/values - land/dimens.xml 资源文件中创建替代尺寸资源,稍微修改 ImageView 控件的引用尺寸。
3.4 编程处理方向更改
- 方向更改会导致当前活动重新启动,因此除非实现 Activity 类的 onRetainNonConfigurationInstance() 方法,否则任何处理任务(如图像解码或网络操作)都会重新开始。
- 活动可以注册监听屏幕方向事件,并通过不同的程序功能做出反应。可以使用 SensorManager 类(android.hardware.SensorManager)的 getOrientation() 方法查询当前方向,或者实现 OrientationEventListener 类(android.view.OrientationEventListener)并覆盖其 onOrientationChanged() 回调方法来注册方向更改。
- 只有当应用需要对方向事件进行特殊内部处理时,才需要监听这些更改。如果应用在 /res/layout - land/ 目录中定义了横屏布局资源,在 /res/layout/ 目录中定义了默认竖屏布局资源,则无需监听器即可无缝工作。
4. 支持不同的屏幕特性
4.1 屏幕特性差异
Android 设备具有各种显示设置,包括不同的屏幕尺寸、密度、纵横比、分辨率和默认方向。不同的设备还具有不同的默认显示设置,包括主题和样式。在发布应用之前,务必在所有目标平台上运行应用,因为应用在每个设备上的行为和显示可能会略有不同。
4.2 避免显示问题的方法
为了避免与屏幕密度等相关的显示问题,可以采取以下措施:
- 只设置所需的属性(无需维护不必要的设置)。
- 将所有尺寸值保存在尺寸值资源文件中,而不是单个布局文件中。
- 以 dp 或 sp 指定字体大小,而不是 pt。
- 以 dp 指定像素尺寸,而不是 px。
- 需要时添加自定义替代资源(但要谨慎使用)。
5. 支持不同的设备特性
开发者可以为多种手机配置情况提供自定义资源文件。例如,游戏可以根据手机是否有硬件键盘、特定类型的触摸屏或导航键来定制某些资源。对于具有高分辨率屏幕的强大手机,图形文件可以放大,而在基本手机上可以缩小以节省空间。在极端情况下,一款游戏在一部手机上可能是 2D 的,而在另一部手机上可能是 3D 的。
Android 平板电脑是一种值得特别关注的设备。如今市场上有许多平板电脑,并且每个季度都有更多产品推出。这些大屏幕、高分辨率的设备为开发者提供了大量的“屏幕空间”,从 UI 设计的角度来看可能会带来特殊的挑战。不过,Android 平板电脑开发与普通 Android 开发并无太大区别,开发者依赖相同的 API、底层操作系统和编程范式。
6. 开发不同的 Android SDK
6.1 Android SDK 版本情况
目前,用户手中有八个主要版本的 Android SDK:Android 1.5、Android 1.6、Android 2.1、Android 2.2、Android 2.3 - 2.3.2、Android 2.3.3 - 2.3.4、Android 3.0 和 Android 3.1。即将发布的版本(代号为 Ice Cream Sandwich)以及任何小的 SDK 修订版都会增加这个列表。
Google 会定期公布各种 Android 版本在手机上的使用情况:
- 1.9% 的用户使用 Android SDK 1.5。
- 2.5% 的用户使用 Android SDK 1.6。
- 21.2% 的用户使用 Android SDK 2.1。
- 64.6% 的用户使用 Android SDK 2.2。
- 1.1% 的用户使用 Android SDK 2.3。
- 8.1% 的用户使用 Android SDK 2.3.3 - 2.3.4。
- 0.3% 的用户使用 Android SDK 3.1。
6.2 向后兼容性问题
虽然 Android 团队努力保持新的 Android 版本与以前的版本兼容,但实际上 Android 平台的向后兼容性并不能保证。开发者在新 SDK 发布时经常需要更新他们的应用,因为类可能会被更改或弃用,方法的底层功能可能会被修改。因此,开发者需要负责保持他们的应用更新,在新 SDK 发布时重新测试应用,以便在用户升级设备时提供更新。
6.3 选择应用的目标平台
在开发任何 Android 应用之前,需要考虑目标平台。应用是要支持一些较旧、更成熟的手机,还是只支持最新的手机?需要进行一些市场研究,确定目标用户在实际使用中使用的 SDK 版本。
6.4 指定项目的目标 SDK
可以通过针对适当的 SDK 版本进行编译来指定应用的 SDK 支持,这在项目设置以及 Android 清单文件中设置。还可以使用表 20.1 中列出的适当资源目录限定符,指定某些应用资源以适用于特定的 SDK 版本。
6.5 为向后兼容性设计应用
为了覆盖最多的手机,需要针对多个版本的 SDK 进行开发。但是,在 Android 清单文件中设置所需的 SDK 版本会限制应用可以安装的 SDK 版本。可以使用 Java 的反射机制来解决这个问题,将最低 SDK 版本设置为应用合理使用的最低版本,然后通过在运行时确定实际可用的功能来增强可用的功能。
6.6 编程检测 Android SDK
可以使用 Build 类(android.os.Build)来编程确定 Android 版本。具体来说,可以检查 Build.VERSION 类的 SDK_INT 值,该值在 android.os.Build.VERSION_CODES 中定义。
6.7 定义特定于 Android SDK 的应用资源
开发者可以为特定版本的 Android SDK 提供资源,就像为特定语言、地区和手机配置选项提供资源一样。资源路径可以指定特定的 Android API 级别编号。
7. Q&A
7.1 固件升级导致应用崩溃怎么办?
首先,冷静下来,不要给 Android 开发团队发送愤怒的邮件。这种情况虽然令人烦恼,但确实会发生。在某些情况下,可以通过针对即将发布的 Android SDK 版本的开源项目测试应用来避免此类问题,但不能保证特定手机(或运营商)不会随意修改固件版本,添加或删除功能。当收到用户投诉时,需要有一个可靠的响应计划,指定专人关注 Android SDK 发布,修复漏洞并向用户发布应用更新。
7.2 如何监听方向更改并加载适当的竖屏或横屏布局,使应用屏幕始终美观?
应用无需监听方向更改即可实现此功能。只需确保有适当限定的布局资源(使用 port 或 land 限定符),Android 操作系统会在设备方向改变时自动加载适当的布局。与其他资源一样,确保竖屏和横屏资源包含相同的子视图,以免出现引用的视图在某个方向上未定义的情况。
8. 工作坊
8.1 测验
-
判断对错:/res/drawables - rUS - en 是一个正确限定的资源目录名称。
答案:错误。地区必须跟随语言,因此该目录应命名为 /res/drawables - en - rUS。 -
可以为以下哪些手机配置定义资源?
A. 语言和地区/区域设置
B. 输入方法,如键盘、触摸屏和导航键
C. 屏幕尺寸、分辨率和方向
D. 键盘和导航键是否隐藏
E. 以上所有选项
答案:E。所有这些限定符都可用于应用资源,还有其他一些限定符。完整列表可在 Android 开发者网站(http://goo.gl/87cUS)查看。 -
判断对错:可以为特定版本的 Android SDK(如 Honeycomb(Android 3.0))提供替代资源。
答案:正确。SDK 版本资源目录限定符是一串适用限定符末尾的最后一个限定符。
8.2 练习
- 提供替代字符串资源,使应用名称包含 Android SDK 版本,例如“Been There, Done That! (Honeycomb Edition)”与“Been There, Done That! (Gingerbread Edition)”。
- 更新应用,为白天和夜间模式提供不同的外观和感觉。例如,默认设置可用于夜间模式,白天模式的更改可能包括不同的文本颜色和更明亮的背景图形。
- 在一个 Activity 类中实现方向监听器,每次发生方向事件时记录一条信息消息。
- [挑战] 对平板电脑开发感兴趣?查看关于新 Fragments API 的系列在线文章,了解如何在平板电脑上更有效地利用“屏幕空间”。可以从这个教程开始:http://goo.gl/cDEwK。
9. 总结
通过前面的介绍,我们了解了众多关于 Android 应用开发的关键要点。在开发过程中,需要考虑不同设备的硬件和软件特性,以及所运行的 Android SDK 版本。利用资源目录限定符策略,我们可以为不同的设备配置提供定制化的资源,从而确保应用在各种设备上都能有良好的表现。
在处理屏幕方向方面,我们学习了设计简单布局以适应不同方向的策略,以及如何添加自定义布局文件来优化横屏显示效果。同时,还了解了编程处理方向更改的方法,以及在什么情况下需要监听方向事件。
为了支持不同的屏幕特性和设备特性,我们掌握了避免显示问题的方法,以及如何根据设备的特点定制资源。在开发不同版本的 Android SDK 时,我们需要考虑向后兼容性,通过反射机制等方法来确保应用能够在多个版本的 SDK 上正常运行。
下面通过一个 mermaid 流程图来总结整个开发过程:
graph LR
A[确定目标平台] --> B[考虑硬件特性]
A --> C[考虑软件特性]
A --> D[考虑 Android SDK 版本]
B --> E[使用资源目录限定符配置资源]
C --> E
D --> E
E --> F[处理屏幕方向]
F --> G[设计通用布局]
F --> H[添加自定义布局文件]
F --> I[编程处理方向更改]
E --> J[支持不同屏幕特性]
J --> K[避免显示问题]
J --> L[定制资源]
E --> M[支持不同设备特性]
M --> N[定制资源]
E --> O[开发不同 Android SDK 版本]
O --> P[考虑向后兼容性]
O --> Q[指定目标 SDK]
O --> R[编程检测 SDK 版本]
O --> S[定义特定 SDK 资源]
10. 深入分析资源目录限定符
资源目录限定符是 Android 开发中非常重要的一部分,它可以帮助我们为不同的设备配置提供合适的资源。下面我们进一步分析一些常见的限定符及其使用场景。
10.1 屏幕尺寸和密度相关限定符
| 限定符 | 说明 | 使用场景 |
|---|---|---|
| small, normal, large, xlarge | 表示屏幕的大小 | 当应用需要根据屏幕大小调整布局时使用,例如在小屏幕设备上可能需要简化布局,而在大屏幕设备上可以展示更多内容。 |
| ldpi, mdpi, hdpi, xhdpi, nodpi | 表示屏幕的像素密度 | 为不同密度的屏幕提供合适分辨率的图片资源,以确保图片在各种屏幕上都能清晰显示。 |
10.2 屏幕方向和模式相关限定符
| 限定符 | 说明 | 使用场景 |
|---|---|---|
| port, land | 表示屏幕的方向,分别为竖屏和横屏 | 为横屏和竖屏模式设计不同的布局,以优化用户体验。 |
| night, notnight | 表示设备的夜间或白天模式 | 根据不同的模式提供不同的颜色主题或背景图片。 |
10.3 SDK 版本限定符
| 限定符 | 说明 | 使用场景 |
|---|---|---|
| v1, v2, v3… | 表示 Android SDK 的版本 | 当应用需要使用特定版本的 SDK 功能时,或者为了兼容旧版本 SDK 而提供不同的资源时使用。 |
通过合理使用这些限定符,我们可以让应用在不同的设备和环境下都能有出色的表现。
11. 案例分析:Been There, Done That! 应用优化
以 Been There, Done That! 应用为例,我们来详细分析如何根据前面所学的知识对其进行优化。
11.1 屏幕方向优化
11.1.1 启动屏幕
在竖屏模式下,启动屏幕的布局可能适合展示一些竖向排列的元素,但在横屏模式下,可能会出现元素显示不全的问题。我们通过创建 /res/layout - land/splash.xml 文件,并对布局进行调整,将四个图像显示在一个 TableRow 控件中,避免了版本和版权信息被遮挡的问题。同时,通过修改 /res/values - land/dimens.xml 中的尺寸资源,进一步优化了控件的显示效果。
11.1.2 主菜单屏幕
主菜单屏幕在横屏模式下,巨大的地球图形可能会遮挡菜单项。我们通过创建 /res/layout - land/menu.xml 文件,移除了地球图形的 ImageView 控件,简化了布局。同时,为了修复背景拉伸问题,我们创建了不同密度的横屏背景图片资源,放置在 /drawable - land - hdpi、/drawable - land - mdpi 和 /drawable - land - ldpi 文件夹中。
11.1.3 游戏屏幕
游戏屏幕在横屏模式下,问题图形和文本可能会被裁剪。我们通过创建 /res/layout - land/game.xml 文件,将包含问题图形和文本的 LinearLayout 控件的方向改为水平,使问题图形显示在问题文本的左侧。同时,修改 /res/values - land/dimens.xml 中的尺寸资源,优化了 ImageView 控件的显示。
11.2 不同 SDK 版本优化
由于不同版本的 Android SDK 可能存在兼容性问题,我们需要考虑为不同版本的 SDK 提供不同的资源。例如,对于较新的 SDK 版本,可能支持一些新的特性和功能,我们可以为这些版本提供更丰富的资源和优化的布局。而对于较旧的 SDK 版本,我们需要确保应用能够正常运行,可能需要使用一些兼容性的方法。
11.3 设备特性优化
如果应用需要支持不同的设备特性,如触摸屏类型、是否有硬件键盘等,我们可以根据这些特性定制资源。例如,如果设备没有硬件键盘,我们可以提供更多的触摸屏操作提示;如果设备的屏幕密度较高,我们可以提供高分辨率的图片资源。
12. 未来展望
随着 Android 技术的不断发展,设备的多样性和功能的丰富性将不断增加。未来,开发者需要更加关注新的设备特性和 Android SDK 的更新,以提供更好的用户体验。
例如,随着折叠屏设备的逐渐普及,开发者需要考虑如何为这种特殊的屏幕形态设计合适的布局和交互方式。同时,新的 Android SDK 版本可能会引入更多的功能和优化,开发者需要及时学习和应用这些新特性,以提升应用的竞争力。
在向后兼容性方面,虽然 Android 团队一直在努力保持新老版本的兼容性,但开发者仍然需要密切关注版本更新带来的变化,及时调整应用的代码和资源。
总之,Android 应用开发是一个不断发展和变化的领域,开发者需要不断学习和实践,以适应市场的需求和技术的发展。
通过以上内容,我们全面了解了 Android 应用开发中针对不同设备的开发要点和方法。希望这些知识能够帮助开发者在实际开发中更好地应对各种挑战,开发出高质量的 Android 应用。
超级会员免费看
1778

被折叠的 条评论
为什么被折叠?



