在写作一个基于Android的App的时候,要考虑App将来运行的硬件平台:
1.Android 平台的基础是 Linux 内核。这种结构使得上层功能可以依靠 Linux 内核来执行底层功能。这一层为Android 设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi 驱动、电源管理等。
2.硬件抽象层 (HAL) 提供标准界面,向更高级别的 Java API 框架显示设备硬件功能。HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如相机或蓝牙模块。当框架 API 要求访问设备硬件时,Android 系统将为该硬件组件加载库模块。
3.对于运行 Android 5.0(API 级别 21)或更高版本的设备,每个应用都在其自己的进程中运行,并且有其自己的 Android Runtime (ART) 实例。ART 编写为通过执行 DEX 文件在低内存设备上运行多个虚拟机,DEX 文件是一种专为 Android 设计的字节码格式,经过优化,使用的内存很少。编译工具链(例如 Jack)将 Java 源代码编译为 DEX 字节码,使其可在 Android 平台上运行
4.ART 的部分主要功能包括:
(1)预先 (AOT) 和即时 (JIT) 编译
(2)优化的垃圾回收 (GC)
(3)在 Android 9(API 级别 28)及更高版本的系统中,支持将应用软件包中的 Dalvik Executable 格式 (DEX) 文件转换为更紧凑的机器代码。
更好的调试支持,包括专用采样分析器、详细的诊断异常和崩溃报告,并且能够设置观察点以监控特定字段
(4)在 Android 版本 5.0(API 级别 21)之前,Dalvik 是 Android Runtime。如果您的应用在 ART 上运行效果很好,那么它应该也可在 Dalvik 上运行,但反过来不一定。
Android 还包含一套核心运行时库,可提供 Java API 框架所使用的 Java 编程语言中的大部分功能,包括一些 Java 8 语言功能。
5.许多核心 **Android 系统组件和服务(例如 ART 和 HAL)**构建自原生代码,需要以 C 和 C++ 编写的原生库。Android 平台提供 Java 框架 API 以向应用显示其中部分原生库的功能。例如,您可以通过 Android 框架的 Java OpenGL API 访问 OpenGL ES,以支持在应用中绘制和操作 2D 和 3D 图形。
如果开发的是需要 C 或 C++ 代码的应用,可以使用 Android NDK 直接从原生代码访问某些原生平台库.
您可通过以 Java 语言编写的 API 使用 Android OS 的整个功能集。这些 API 形成创建 Android 应用所需的构建块,它们可简化核心模块化系统组件和服务的重复使用,包括以下组件和服务:
(1)丰富、可扩展的视图系统,可用以构建应用的 UI,包括列表、网格、文本框、按钮甚至可嵌入的网络浏览器
(2)资源管理器,用于访问非代码资源,例如本地化的字符串、图形和布局文件
(3)通知管理器,可让所有应用在状态栏中显示自定义提醒
(4)Activity 管理器,用于管理应用的生命周期,提供常见的导航返回栈
(5)内容提供程序,可让应用访问其他应用(例如“联系人”应用)中的数据或者共享其自己的数据开发者可以完全访问 Android 系统应用使用的框架 API。
Android 随附一套用于电子邮件、短信、日历、互联网浏览和联系人等的核心应用
Android 提供了一个内容丰富的应用框架,支持您在 Java 语言环境中为移动设备开发创新应用和游戏。
(1)应用提供多个入口点
(2)应用可适应不同的设备
Android SDK 工具将您的代码 — 连同任何数据和资源文件 — 编译到一个 APK:Android 软件包,即带有 .apk 后缀的存档文件中。一个 APK 文件包含 Android 应用的所有内容,它是基于 Android 系统的设备用来安装应用的文件。安装到设备后,每个 Android 应用都运行在自己的安全沙箱内:
(1)Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户;
(2)默认情况下,系统会为每个应用分配一个唯一的 Linux 用户 ID(该 ID 仅由系统使用,应用并不知晓)。系统为应用中的所有文件设置权限,使得只有分配给该应用的用户 ID 才能访问这些文件;
(3)每个进程都具有自己的虚拟机 (VM),因此应用代码是在与其他应用隔离的环境中运行;
(4)默认情况下,每个应用都在其自己的 Linux 进程内运行。Android 会在需要执行任何应用组件时启动该进程,然后在不再需要该进程或系统必须为其他应用恢复内存时关闭该进程。
Android 系统可以通过这种方式实现最小权限原则。也就是说,默认情况下,每个应用都只能访问执行其工作所需的组件,而不能访问其他组件。 这样便营造出一个非常安全的环境,在这个环境中,应用无法访问系统中其未获得权限的部分。
不过,应用仍然可以通过一些途径与其他应用共享数据以及访问系统服务:
(1)可以安排两个应用共享同一 Linux 用户 ID,在这种情况下,它们能够相互访问彼此的文件。 为了节省系统资源,可以安排具有相同用户 ID 的应用在同一 Linux 进程中运行,并共享同一 VM(应用还必须使用相同的证书签署)。
(2)应用可以请求访问设备数据(如用户的联系人、短信、可装载存储装置 [SD 卡]、相机、蓝牙等)的权限。 用户必须明确授予这些权限。
应用组件是 Android 应用的基本构建基块。每个组件都是一个不同的点,系统可以通过它进入您的应用。 并非所有组件都是用户的实际入口点,有些组件相互依赖,但每个组件都以独立实体形式存在,并发挥特定作用 — 每个组件都是唯一的构建基块,有助于定义应用的总体行为。
四种应用组件类型:
Activity
Activity 表示具有用户界面的单一屏幕。例如,电子邮件应用可能具有一个显示新电子邮件列表的 Activity、一个用于撰写电子邮件的 Activity 以及一个用于阅读电子邮件的 Activity。 尽管这些 Activity 通过协作在电子邮件应用中形成了一种紧密结合的用户体验,但每一个 Activity 都独立于其他 Activity 而存在。 因此,其他应用可以启动其中任何一个 Activity(如果电子邮件应用允许)。 例如,相机应用可以启动电子邮件应用内用于撰写新电子邮件的 Activity,以便用户共享图片。
Activity 作为 Activity类 的子类实现,我们在以后的学习中了解。
服务
服务是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业。 服务不提供用户界面。 例如,当用户位于其他应用中时,服务可能在后台播放音乐或者通过网络获取数据,但不会阻断用户与 Activity 的交互。 诸如 Activity 等其他组件可以启动服务,让其运行或与其绑定以便与其进行交互。
服务作为 Service类 的子类实现,我们在以后的学习中了解。
内容提供程序
内容提供程序管理一组共享的应用数据。您可以将数据存储在文件系统、SQLite 数据库、网络上或您的应用可以访问的任何其他永久性存储位置。 其他应用可以通过内容提供程序查询数据,甚至修改数据(如果内容提供程序允许)。 例如,Android 系统可提供管理用户联系人信息的内容提供程序。 因此,任何具有适当权限的应用都可以查询内容提供程序的某一部分(如 ContactsContract.Data),以读取和写入有关特定人员的信息。
内容提供程序也适用于读取和写入您的应用不共享的私有数据。 例如,记事本示例应用使用内容提供程序来保存笔记。
内容提供程序作为 ContentProvider 的子类实现,并且必须实现让其他应用能够执行事务的一组标准 API。我们在以后的学习中了解。
广播接收器
广播接收器是一种用于响应系统范围广播通知的组件。 许多广播都是由系统发起的 — 例如,通知屏幕已关闭、电池电量不足或已拍摄照片的广播。应用也可以发起广播 — 例如,通知其他应用某些数据已下载至设备,并且可供其使用。 尽管广播接收器不会显示用户界面,但它们可以创建状态栏通知,在发生广播事件时提醒用户。 但广播接收器更常见的用途只是作为通向其他组件的“通道”,设计用于执行极少量的工作。 例如,它可能会基于事件发起一项服务来执行某项工作。
广播接收器作为 BroadcastReceiver 的子类实现,并且每条广播都作为 Intent 对象进行传递。 我们在以后的学习中了解。
每种类型的组件有不同的启动方法:
(1)您可以通过将 Intent 传递到 startActivity() 或 startActivityForResult()(当您想让 Activity 返回结果时)来启动 Activity(或为其安排新任务)。
(2)您可以通过将 Intent 传递到 startService() 来启动服务(或对执行中的服务下达新指令)。 或者,您也可以通过将 Intent 传递到 bindService() 来绑定到该服务。
(3)您可以通过将 Intent 传递到 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast() 等方法来发起广播;
(4)您可以通过在 ContentResolver 上调用 query() 来对内容提供程序执行查询。
您的应用必须在此文件中声明其所有组件,该文件必须位于应用项目目录的根目录中。
(1)确定应用需要的任何用户权限,如互联网访问权限或对用户联系人的读取权限
(2)根据应用使用的 API,声明应用所需的最低 API 级别
(3)声明应用使用或需要的硬件和软件功能,如相机、蓝牙服务或多点触摸屏幕
(4)应用需要链接的 API 库(Android 框架 API 除外),如 Google 地图库
(5)其他功能
在 元素中,android:icon 属性指向标识应用的图标所对应的资源。
在 元素中,android:name 属性指定 Activity 子类的完全限定类名,android:label 属性指定用作 Activity 的用户可见标签的字符串。
您必须通过以下方式声明所有应用组件:
Activity 的 元素
服务的 元素
广播接收器的 元素
内容提供程序的 元素
您包括在源代码中,但未在清单文件中声明的 Activity、服务和内容提供程序对系统不可见,因此也永远不会运行。 不过,广播接收器可以在清单文件中声明或在代码中动态创建(如 BroadcastReceiver 对象)并通过调用 registerReceiver() 在系统中注册。
声明组件功能
当您在应用的清单文件中声明 Activity 时,可以选择性地加入声明 Activity 功能的 Intent 过滤器,以便响应来自其他应用的 Intent。 您可以通过将 元素作为组件声明元素的子项进行添加来为您的组件声明 Intent 过滤器.
如果您开发的电子邮件应用包含一个用于撰写新电子邮件的 Activity,则可以像下面这样声明一个 Intent 过滤器来响应“send” Intent(以发送新电子邮件):
...
设置工作区
这是您可能已经完成的阶段:安装 Android Studio 和创建项目。
编写您的应用
现在您可以开始编写了。Android Studio 包含多种工具和智能功能,可帮助您更快速地编写应用、编写高质量的代码、设计界面以及为不同的设备类型创建资源。
编译并运行
在此阶段,您可以将项目编译成一个可调试的 APK 软件包,以便在模拟器或 Android 设备上安装和运行。
您也可以开始自定义编译。例如,您可以创建编译变体以根据同一项目生成不同类型的 APK,然后压缩代码和资源以缩小您的 APK 文件。
调试、分析和测试
在这个迭代阶段,您可以继续编写应用,但精力侧重于消除错误并优化应用性能。当然,创建测试可以帮助您完成这些工作。
发布
当您准备好向用户发布应用时,还需要考虑一些其他因素,例如管理应用版本和使用密钥为应用签名。
Minimum API level: 当您选择较低的 API 级别时,您的应用可以依赖的现代 Android API 会更少,但能够运行应用的 Android 设备的比例会更大。当选择较高的 API 级别时,情况正好相反。如果您想参考更多数据来帮助您做决定,请点击 Help me choose。
如果您选择的项目类型通过 Google Play 免安装体验支持免安装体验,并且您希望为该应用启用该体验,请选中 This project will support instant apps 旁边的复选框.
如果您希望项目默认使用 AndroidX 库,请选中 Use AndroidX artifacts 旁边的复选框。AndroidX 库是 Android 支持库的改进替换。
优先级是以下值之一:
V:详细(优先级最低)
D:调试
I:信息
W:警告
E:错误
A:断言
在 Log level 菜单中,选择以下值之一:
Verbose:显示所有日志消息(默认值)。
Debug:显示仅在开发期间有用的调试日志消息,以及此列表中较低的消息级别。
Info:显示常规使用情况的预期日志消息,以及此列表中较低的消息级别。
Warn:显示尚不是错误的潜在问题,以及此列表中较低的消息级别。
Error:显示已经引发错误的问题,以及此列表中较低的消息级别。
Assert:显示开发者预计绝不会发生的问题。
Android工程中的assets目录:主要存放一些文件资源,这些文件会被原封不动的打包到APK文件中。