Android应用基础知识

Android应用基础

使用语言:Kotlin、Java、C++

Android SDK:将代码连同任何数据和资源文件编译成 APK

Android OS

最小权限原则

​ Android 系统实现了最小权限原则。默认情况下,每个应用只能访问执行其工作所需的组件,而不能访问其他组件。这样便能创建非常安全的环境。在此环境中,应用无法访问其未获得权限的系统部分。不过,应用仍可通过一些途径与其他应用共享数据以及访问系统服务:

  • 可以安排两个应用共享同一 Linux 用户 ID,在此情况下,二者便能访问彼此的文件。为节省系统资源,也可安排拥有相同用户 ID 的应用在同一 Linux 进程中运行,并共享同一VM。应用还必须使用相同的证书进行签名。
  • 应用可以请求访问设备数据(如用户的联系人、短信消息、可装载存储装置(SD 卡)、相机、蓝牙等)的权限。用户必须明确授予这些权限。

Android 安全功能

每个Android 应用都处于Android 安全功能各自的安全沙盒中,并受以下 Android 安全功能的保护:

  • Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户;
  • 默认情况下,系统会为每个应用分配一个唯一的 Linux 用户 ID(该 ID 仅由系统使用,应用并不知晓)。系统会为应用中的所有文件设置权限,使得只有分配给该应用的用户 ID 才能访问这些文件;
  • 每个进程都拥有自己的虚拟机 (VM),因此应用代码独立于其他应用而运行。
  • 默认情况下,每个应用都在其自己的 Linux 进程内运行。Android 系统会在需要执行任何应用组件时启动该进程,然后当不再需要该进程或系统必须为其他应用恢复内存时,其便会关闭该进程。

应用组件

应用组件是 Android 应用的基本构建块。每个组件都是一个入口点,系统或用户可通过该入口点进入您的应用。有些组件会依赖于其他组件。每种类型都有不同的用途和生命周期。

共有四种不同的应用组件类型:

  • Activity
  • 服务
  • 广播接收器
  • 内容提供程序

Activity

Activity是与用户交互的入口点。它表示拥有界面的单个屏幕。电子邮件应用可能有一个显示新电子邮件列表的 Activity、一个用于撰写电子邮件的 Activity 以及一个用于阅读电子邮件的 Activity。尽管这些 Activity 通过协作在电子邮件应用中形成一种紧密结合的用户体验,但每个 Activity 都独立于其他 Activity 而存在。因此,其他应用可以启动其中任何一个 Activity(如果电子邮件应用允许)。例如,相机应用可以启动电子邮件应用内用于撰写新电子邮件的 Activity,以便用户共享图片。

Activity 有助于完成系统和应用程序之间的以下重要交互:

  • 追踪用户当前关心的内容(屏幕上显示的内容),以确保系统继续运行托管 Activity 的进程。
  • 了解先前使用的进程包含用户可能返回的内容(已停止的 Activity),从而更优先保留这些进程。
  • 帮助应用处理终止其进程的情况,以便用户可以返回已恢复其先前状态的 Activity。
  • 提供一种途径,让应用实现彼此之间的用户流,并让系统协调这些用户流。(此处最经典的示例是共享。)

概念

  1. Activity 类的目的就是实现当一个应用调用另一个应用时,调用方应用会调用另一个应用中的 Activity,而不是整个应用。通过这种方式,Activity 充当了应用与用户互动的入口点。可以将 Activity 实现为 Activity 类的子类。

  2. 大多数应用包含多个屏幕,这意味着它们包含多个 Activity。通常,应用中的一个 Activity 会被指定为主 Activity,这是用户启动应用时出现的第一个屏幕。然后,每个 Activity 可以启动另一个 Activity,以执行不同的操作。虽然应用中的各个 Activity 协同工作形成统一的用户体验,但每个 Activity 与其他 Activity 之间只存在松散的关联,应用内不同 Activity 之间的依赖关系通常很小。事实上,Activity 经常会启动属于其他应用的 Activity。

  3. 要在应用中使用 Activity,您必须在应用的清单AndroidManifest.xml中注册关于 Activity 的信息,并且必须适当地管理 Activity 的生命周期。

配置AndroidManifest

声明 Activity

要声明 Activity,请打开清单文件,并添加<activity>元素作为<application>元素的子元素。

1
2
3
4
5
6
7
<manifest ...>
<application ...>
<activity android:name=".MainActivity"/>
...
</application >
...
</manifest >

android:name属性用于指定 Activity 的类名称。也可以添加用于定义标签、图标或界面主题等 Activity 特征的属性。

Intent 过滤器

Intent 过滤器不但可以根据显式请求启动 Activity,还可以根据隐式请求启动 Activity。显式请求可能会告诉系统“在 Gmail 应用中启动‘发送电子邮件’Activity”,而隐式请求可能会告诉系统“在任何能够完成此工作的 Activity 中启动‘发送电子邮件’屏幕”。要使用此功能,您需要在<activity>元素中声明<intent-filter>属性。此元素的定义包括action元素,以及可选的category元素和/或data元素

  • 显式 Intent:通过提供目标应用的软件包名称或完全限定的组件类名来指定可处理 Intent 的应用。通常,在自己的应用中使用显式 Intent 来启动组件,因为我们知道要启动的 Activity 或服务的类名。
  • 隐式 Intent :不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理。例如,如需在地图上向用户显示位置,则可以使用隐式 Intent,请求另一具有此功能的应用在地图上显示指定的位置。

隐式 Intent 如何通过系统传递以启动其他 Activity:

1. Activity A 创建包含操作描述的 Intent,并将其传递给 startActivity()

2. Android 系统搜索所有应用中与 Intent 匹配的 Intent 过滤器。找到匹配项之后

3 该系统通过调用匹配 Activity (Activity B) 的 onCreate() 方法并将其传递给 Intent,以此启动匹配 Activity。

隐式intent

使用隐式 Intent 时,Android 系统通过将 Intent 的内容与在设备上其他应用的清单文件中声明的Intent 过滤器进行比较,从而找到要启动的相应组件。如果 Intent 与 Intent 过滤器匹配,则系统将启动该组件,并向其传递 Intent 对象。如果多个 Intent 过滤器兼容,则系统会显示一个对话框,支持用户选取要使用的应用。

Intent 过滤器是应用清单文件中的一个表达式,用于指定该组件要接收的 Intent 类型。只有声明Intent过滤器才能被其他 Activity 启动,下面给出声明范例:

1
2
3
4
5
6
7
8
<!-- 以下代码段展示了如何配置一个发送文本数据并接收其他 Activity 的文本数据发送请求的 Activity -->
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>

<action> 元素指定该 Activity 会发送数据; <category>元素声明为 DEFAULT 可使 Activity 能够接收启动请求;<data>元素指定此 Activity 可以发送的数据类型

1
2
3
4
5
6
7
8
//以下代码段展示了如何调用上述 Activity
// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
// Start the activity
startActivity(sendIntent);

Intent 常见操作:

  • ACTION_VIEW:如果您拥有一些某项 Activity 可向用户显示的信息(例如,要使用图库应用查看的照片),通过 Intent 将此操作与 startActivity() 结合使用。

  • ACTION_SEND:这也称为共享 Intent。如果您拥有一些用户可通过其他应用(例如,电子邮件应用或社交共享应用)共享的数据,则应使用 Intent 将此操作与 startActivity() 结合使用。