
中文文档阅读笔记
Android 应用并没有单一入口点
Intent 使用 Intent
对象创建,它定义的消息用于启动特定组件或特定类型的组件 — Intent 可以是显式的,也可以是隐式的。
对于 Activity 和服务, Intent 定义要执行的操作(例如,“查看”或“发送”某个内容),并且可以指定要执行操作的数据的 URI(以及正在启动的组件可能需要了解的信息)。
ContentResolver
的请求目标时启动。每种类型的组件有不同的启动方法:
Intent
传递到 startActivity()
或 startActivityForResult()
(当您想让 Activity 返回结果时)来启动 Activity(或为其安排新任务)。Intent
传递到 startService()
来启动服务(或对执行中的服务下达新指令)。 或者,您也可以通过将 Intent
传递到 bindService()
来绑定到该服务。Intent
传递到 sendBroadcast()
、sendOrderedBroadcast()
或 sendStickyBroadcast()
等方法来发起广播;ContentResolver
上调用 query()
来对内容提供程序执行查询。在 Android 系统启动应用组件之前,系统必须通过读取应用的
AndroidManifest.xml
文件(“清单”文件)确认组件存在。 清单文件的主要任务是告知系统有关应用组件的信息。
还可以
声明Activity
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:icon="@drawable/app_icon.png" ... >
<activity android:name="com.example.project.ExampleActivity"
android:label="@string/example_label" ... >
</activity>
...
</application>
</manifest>
<application>
元素中,android:icon
属性指向应用图标所对应的资源。<activity>
元素中,android:name
属性指定 Activity
子类的完全限定类名,android:label
属性指定用作 Activity 的用户可见标签的字符串。<activity>
元素<service>
元素<receiver>
元素<provider>
元素您包括在源代码中,但未在清单文件中声明的 Activity、服务和内容提供程序对系统不可见,因此也永远不会运行。 不过,广播接收器可以在清单文件中声明或在代码中动态创建(如 BroadcastReceiver
对象)并通过调用 registerReceiver()
在系统中注册。
如需了解有关如何为您的应用构建清单文件的详细信息,请参阅 AndroidManifest.xml 文件文档。
隐式 Intent:描述要执行的操作类型,让系统能够在设备上找到可执行该操作的组件,并启动该组件。
将<intent-filter>
元素作为组件声明元素添加来为您的组件声明 Intent 过滤器。
为防止将您的应用安装在缺少应用所需特性的设备上,您必须通过在清单文件中声明设备和软件要求,为您的应用支持的设备类型明确定义一个配置文件。
例如,如果您的应用需要相机,并使用 Android 2.1(API 级别 7)中引入的 API,您应该像下面这样在清单文件中以要求形式声明这些信息:
<manifest ... >
<uses-feature android:name="android.hardware.camera.any"
android:required="true" />
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" />
...
</manifest>
现在,没有相机且 Android 版本低于 2.1 的设备将无法从 Google Play 安装您的应用。
设备兼容性文档中提供了有关如何管理应用与不同设备兼容性的详细信息。
例如,您应该通过 XML 文件定义 Activity 用户界面的动画、菜单、样式、颜色和布局。 使用应用资源能够在不修改代码的情况下轻松地更新应用的各种特性,并可通过提供备用资源集让您能够针对各种设备配置(如不同的语言和屏幕尺寸)优化您的应用。
对于您的 Android 项目中包括的每一项资源,SDK 构建工具都会定义一个唯一的整型 ID
简单项目的文件层次结构:
MyProject/
src/
MyActivity.java
res/
drawable/
graphic.png
layout/
main.xml
info.xml
mipmap/
icon.png
values/
strings.xml
表 1. 项目 res/
目录内支持的资源目录。
目录 | 资源类型 |
---|---|
animator/ | 用于定义属性动画的 XML 文件。 |
anim/ | 定义渐变动画的 XML 文件。(属性动画也可以保存在此目录中,但是为了区分这两种类型,属性动画首选 animator/ 目录。) |
color/ | 用于定义颜色状态列表的 XML 文件。请参阅颜色状态列表资源 |
drawable/ | 位图文件(.png 、.9.png 、.jpg 、.gif )或编译为以下可绘制对象资源子类型的 XML 文件:位图文件九宫格(可调整大小的位图)状态列表形状动画可绘制对象其他可绘制对象请参阅 可绘制对象资源。 |
mipmap/ | 适用于不同启动器图标密度的可绘制对象文件。如需了解有关使用 mipmap/ 文件夹管理启动器图标的详细信息,请参阅管理项目概览。 |
layout/ | 用于定义用户界面布局的 XML 文件。 请参阅布局资源。 |
menu/ | 用于定义应用菜单(如选项菜单、上下文菜单或子菜单)的 XML 文件。请参阅菜单资源。 |
raw/ | 要以原始形式保存的任意文件。要使用原始 InputStream 打开这些资源,请使用资源 ID(即 R.raw.*filename* )调用 Resources.openRawResource() 。但是,如需访问原始文件名和文件层次结构,则可以考虑将某些资源保存在 assets/ 目录下(而不是 res/raw/ )。assets/ 中的文件没有资源 ID,因此您只能使用 AssetManager 读取这些文件。 |
values/ | 包含字符串、整型数和颜色等简单值的 XML 文件。其他 res/ 子目录中的 XML 资源文件是根据 XML 文件名定义单个资源,而 values/ 目录中的文件可描述多个资源。对于此目录中的文件,<resources> 元素的每个子元素均定义一个资源。例如,<string> 元素创建 R.string 资源,<color> 元素创建 R.color 资源。由于每个资源均用其自己的 XML 元素定义,因此您可以根据自己的需要命名文件,并将不同的资源类型放在一个文件中。但是,为了清晰起见,您可能需要将独特的资源类型放在不同的文件中。 例如,对于可在此目录中创建的资源,下面给出了相应的文件名约定:arrays.xml,用于资源数组(类型化数组)。colors.xml:颜色值。dimens.xml:尺寸值。strings.xml:字符串值。styles.xml:样式。请参阅字符串资源、样式资源和更多资源类型。 |
xml/ | 可以在运行时通过调用 Resources.getXML() 读取的任意 XML 文件。各种 XML 配置文件(如可搜索配置)都必须保存在此处。 |
为一组资源指定特定于配置的备用资源:
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
hdpi
限定符表示该目录中的资源适用于屏幕密度较高的设备。
要创建指向现有可绘制对象的别名,请使用 <bitmap>
元素。例如:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/icon_ca" />
如果将此文件另存为 icon.xml
(例如,在备用资源目录中,另存为 res/drawable-en-rCA/
),则会编译到可作为 R.drawable.icon
引用的资源中,但实际上它是 R.drawable.icon_ca
资源(保存在 res/drawable/
中)的别名。
要创建指向现有布局的别名,请使用包装在 <merge>
中的 <include>
元素。例如:
<?xml version="1.0" encoding="utf-8"?>
<merge>
<include layout="@layout/main_ltr"/>
</merge>
如果将此文件另存为 main.xml
,则会编译到可作为 R.layout.main
引用的资源中,但实际上它是 R.layout.main_ltr
资源的别名。
要创建指向现有字符串的别名,只需将所需字符串的资源 ID 用作新字符串的值即可。例如:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello</string>
<string name="hi">@string/hello</string>
</resources>
R.string.hi
资源现在是 R.string.hello
的别名。
语言不带语言和区域限定符。
layout-land/
和 layout-port/
中分别提供横向和纵向的布局资源,而是保留其中之一作为默认设置,例如:layout/
用于横向,layout-port/
用于纵向。始终为应用正确运行所必需的资源提供默认资源。
minSdkVersion
为 4 或更高版本,则在提供带屏幕密度限定符的备用可绘制对象资源时,不需要默认可绘制对象资源。有些设备配置可能会在运行时发生变化(例如屏幕方向、键盘可用性及语言)。 发生这种变化时,Android 会重启正在运行的 Activity
(先后调用 onDestroy()
和 onCreate()
)。
要妥善处理重启行为,Activity 必须通过常规的Activity 生命周期恢复其以前的状态,在 Activity 生命周期中,Android 会在销毁 Activity 之前调用 onSaveInstanceState()
,以便您保存有关应用状态的数据。 然后,您可以在 onCreate()
或 onRestoreInstanceState()
期间恢复 Activity 状态。
重启应用并恢复大量数据不仅成本高昂,而且给用户留下糟糕的使用体验。 在这种情况下,您有两个其他选择: