Android 应用基础知识
您可以使用 Kotlin、Java 和 C++ 语言编写 Android 应用。Android SDK 工具会将您的代码连同任何数据和资源文件编译成一个 APK(Android 软件包),即带有 .apk
后缀的归档文件。一个 APK 文件包含 Android 应用的所有内容,它也是 Android 设备用来安装应用的文件。
每个 Android 应用都处于各自的安全沙盒中,并受以下 Android 安全功能的保护:
-
Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户;
-
默认情况下,系统会为每个应用分配一个唯一的 Linux 用户 ID(该 ID 仅由系统使用,应用并不知晓)。系统会为应用中的所有文件设置权限,使得只有分配给该应用的用户 ID 才能访问这些文件;
-
每个进程都拥有自己的虚拟机 (VM),因此应用代码独立于其他应用而运行。
-
默认情况下,每个应用都在其自己的 Linux 进程内运行。Android 系统会在需要执行任何应用组件时启动该进程,然后当不再需要该进程或系统必须为其他应用恢复内存时,其便会关闭该进程。
Android 系统实现了最小权限原则。换言之,默认情况下,每个应用只能访问执行其工作所需的组件,而不能访问其他组件。这样便能创建非常安全的环境,在此环境中,应用无法访问其未获得权限的系统部分。不过,应用仍可通过一些途径与其他应用共享数据以及访问系统服务:
-
可以安排两个应用共享同一 Linux 用户 ID,在此情况下,二者便能访问彼此的文件。为节省系统资源,也可安排拥有相同用户 ID 的应用在同一 Linux 进程中运行,并共享同一 VM。应用还必须使用相同的证书进行签名。
-
应用可以请求访问设备数据(如用户的联系人、短信消息、可装载存储装置(SD 卡)、相机、蓝牙等)的权限。用户必须明确授予这些权限。如需了解详细信息,请参阅。
应用组件
应用组件是 Android 应用的基本构建块。每个组件都是一个入口点,系统或用户可通过该入口点进入您的应用。有些组件会依赖于其他组件。
共有四种不同的应用组件类型:
-
Activity
-
服务
-
广播接收器
-
内容提供程序
启动组件
在四种组件类型中,有三种(Activity、服务和广播接收器)均通过异步消息 Intent 进行启动。Intent 会在运行时对各个组件进行互相绑定。您可以将 Intent 视为从其他组件(无论该组件是属于您的应用还是其他应用)请求操作的信使。
您需使用 Intent
对象创建 Intent,该对象通过定义消息来启动特定组件(显式 Intent)或特定的组件类型(隐式 Intent)。
对于 Activity 和服务,Intent 会定义要执行的操作(例如,查看或发送某内容),并且可指定待操作数据的 URI,以及正在启动的组件可能需要了解的信息。例如,Intent 可能会传达对 Activity 的请求,以便显示图像或打开网页。在某些情况下,您可以通过启动 Activity 来接收结果,这样 Activity 还会返回 Intent
中的结果。例如,您可以发出一个 Intent,让用户选取某位联系人并将其返回给您。返回 Intent 包含指向所选联系人的 URI。
对于广播接收器,Intent 只会定义待广播的通知。例如,指示设备电池电量不足的广播只包含指示“电池电量不足”的已知操作字符串。
与 Activity、服务和广播接收器不同,内容提供程序并非由 Intent 启动。相反,它们会在成为 ContentResolver
的请求目标时启动。内容解析程序会通过内容提供程序处理所有直接事务,因此通过提供程序执行事务的组件便无需执行事务,而是改为在 ContentResolver
对象上调用方法。这会在内容提供程序与请求信息的组件之间留出一个抽象层(以确保安全)。
每种组件都有不同的启动方法:
-
如要启动 Activity,您可以向
startActivity()
或startActivityForResult()
传递Intent
(当您想让 Activity 返回结果时),或者为其安排新任务。 -
在 Android 5.0(API 级别 21)及更高版本中,您可以使用
JobScheduler
类来调度操作。对于早期 Android 版本,您可以通过向startService()
传递Intent
来启动服务(或对执行中的服务下达新指令)。您也可通过向将bindService()
传递Intent
来绑定到该服务。 -
您可以通过向
sendBroadcast()
、sendOrderedBroadcast()
或sendStickyBroadcast()
等方法传递Intent
来发起广播。 -
您可以通过在
ContentResolver
上调用query()
,对内容提供程序执行查询。
如需了解有关 Intent 用法的详细信息,请参阅 文档。以下文档将为您详细介绍如何启动特定组件:、、BroadcastReceiver
- 点赞
- 收藏
- 关注作者
评论(0)