第一部分目录:
第一章 快速入门
- 安装工具
- 再见Hello World
- 模拟器(或真机)运行
- 其他步骤
- 常用快捷键
第二章 重要概念
- 总览
- 构件
- 前台只能有一个应用
- 安全保障
重要概念:
1.总览
我们先来看看Android的系统架构图。
说明:
(1)Linux内核
Linux内核为Android提供了硬件抽象层,让Android能够移植到各种平台上。在内部,Android使用Linux来提供内存管理、进程管理、联网和其他操作系统服务。Android用户根本看不到Linux,而程序员往往也不会直接使用Linux调用。但作为开发人员必须直到Linux的而存在。
(2)原生层
在内核层的上一层是Android原生层,这些共享库都是使用C或C++编写的,针对Android设备使用的硬件架构进行编译,并直接由厂商预装。以下是最重要的原生库:
- Surface Manager。
- 2D和3D图形。
- 多媒体编码解码器。
- SQL数据库。
- 浏览器引擎。
(3)Android运行时
在内核之上还有Android运行时,包括运行环境和核心Java库。运行环境使用Dalvik或ART,具体使用取决于Android版本。
- Dalvik是Google的Dan Bornstein 设计并编写的一款虚拟机。编写好的代码会被编译为独立于机器的指令(字节码),然后由移动设备的Dalvik VM执行。
- ART,即Android Runtime,是一款超前的编译器。Android 5.0用它取代了Dalvik。相比与Dalvik,ART可以提高程序的运行速度,但代价是安装时间更长一点。
(4)应用框架
在原生层和运行时之上,是应用框架。它提供了用于创建应用的高级构件。这个框架是随着Android预安装的,可以根据需要对其进行扩展,在其中添加自己的组件。以下是应用框架最重要的组成部分:
- 活动管理器。它控制着应用的生命周期,并维护一个用于用户导航功能的通用后退栈。
- 内容提供者。这些对象封装了要在应用之间共享的数据,如通讯录等。
- 资源管理器。资源指的是程序中除代码以外的其他所有东西。
- 位置管理器。Android设备始终知道其自身处何方。
- 通知管理器。以不唐突的方式将短信、约会、接近提示等事件告知用户。
(5)应用和服务
最顶层的就是应用和服务层。应用是可以占据整个屏幕与用户进行交互的程序,而服务则隐匿在用户的视线之外,默默地扩展应用框架。
2.构件
Android应用框架提供了大量可用于创建应用的构件,而这些构件最重要的就是:活动、片段、视图、意图、服务和内容提供者。以下简要介绍,之后会在对应章节中详细学习:
- 活动(Activity),是一个用户界面屏幕。应用可以定义一个或多个活动,用于处理应用程序的不同阶段。活动扩展了Context类,因此可使用他们来获取全局信息。
- 片段(Fragment),是活动的一个组成部分,通常显示在屏幕上,但并非必须如此。通过片段,能够使应用轻松适应不同尺寸屏幕。
- 视图(View),是最小的用户界面单元,可以直接包含在活动中,也可以包含在活动的片段中。视图可以用Java代码创建,但更好的方式是使用XML布局来定义。每中视图都有其一系列的属性,它们决定了视图功能、行为和外观。
- 意图(Intent),是一种行为描述机制(如选择照片,打电话等)。在Android中,几乎一切都是通过意图来实现的,这给我们提供了大量替换或重用组件的机会。
- 服务(Service),是运行在后台的任务,无需用户直接与之交互。
- 内容提供者,是一组数据和用于读取它们的自定义API,这是在应用之间共享全局数据的最好方法。
补充:
关于使用资源。资源是本地化的文本字符串、位图或程序需要的其他非代码信息。你将在项目的res目录中创建和存储资源。Android资源编辑器(aapt)根据资源文件所属的文件夹和格式对其进行处理。资源编辑器对资源进行压缩和打包,再生成一个名为R的类,其中包含可以用于在程序中引用这些资源的标识符。
3.前台只能有一个应用
在Android中只有一个前台应用,它通常占据除状态栏以外的整个屏幕。
用户运行应用时,Android会启动该应用并让它进入前台。系统的活动管理器会将所有用户调用的其他应用或应用中的其他屏幕都记录到应用栈中。每当用户按返回按钮时,都将返回到栈中的前一个屏幕。从用户角度来看,着很想Web浏览器的历史记录,按后退键返回到前一个页面。相关的知识点如下:
(1) 进程不等于应用。在内部,每个用户界面屏幕都由一个活动表示。每个活动都有生命周期。应用由一个或多个活动以及包含这些活动的Linux进程组成。
(2) 活动的生命周期。在生命周期内,Android程序的活动可处于多种状态。开发人员不能控制程序所处的状态,这完全由系统管理。然而,在状态发生变化前,系统会调用方法onXXX()来通知开发人员。
说明:
在创建的Acitivity子类时,需要重写如下方法,Android会在合适的时候调用它们。
- onCreate(Bundle):活动首次启动时被调用。可以用它来执行一次性初始化工作。onCreate()接收一个参数,这个参数要么为null,要么为方法onSaveInstanceState()保存的状态信息。
- onStart():表明活动即将显示给用户。
- onResume():活动能够开始与用户交互时被调用。这是启动动画和音乐的理想场所。
- onPause():在活动即将进入后台(通常是由于启动了另一个活动)时被调用。应该在这个方法中保存程序的持久化状态。
- onStop():在活动对用户不再可见且暂时不需要该活动时被调用。如果内存紧张,该方法可能不会被调用(系统可能会直接终止进程)。
- onRestart():如果该方法被调用,就表明原本处于停止状态的活动重新显示到屏幕上。
- onDestroy():在活动销毁前被调用。如果内存紧张,该方法可能不会被调用(系统可能会直接终止进程)。
- onSaveInstanceState(Bundle):Android调用这个方法让活动保存其特有的状态。通常不需要重写该方法。因为默认实现会自动保存所有用户界面控件的状态。
- onRestoreInstanceState(Bundle):根据 onSaveInstanceState()方法保存的状态重新初始化活动时被调用,其默认实现恢复用户界面状态。
不在前台运行的活动可能会被停止。另外,包含此类活动的Linux进程也可能随时被终止,以便为新活动腾出空间。在某些情况下,onPause()可能是最后一个被调用的活动方法,因此对于要保留下次使用的任何数据,都必须在这里进行保存。
(3) 使用片段简化工作。片段是应用的组成部分,它们包含在活动中,其生命周期与活动很像。事实上,很多生命周期方法都是由活动的方法调用的(如Fragment.onResume()间接地由Activity.onResume()调用)。
说明:不存在包含它们的活动时,片段依然可以存在。例如,如果你在应用运行时旋转屏幕,活动通常会被销毁并重新创建,以适应新的屏幕朝向,但片段通常会被保留。这样能够在朝向切换期间保留网络连接等重量级对象。
4.安全保障
每个应用都运行在自己的Linux进程中。硬件禁止一个进程去访问另一个进程的内存。另外,每个应用都被分配了一个独特的用户ID。只要设备没有被root以更高的权限运行,一个应用创建的文件就不能被其他应用读写。另外,限制了对一些关键操作的访问。要使用这些操作,必须在清单文件中请求相应的权限。在应用安装时,包管理器将根据证书授予或不授予请求的权限,并在必要时询问用户。下面是常见的权限:
- INTERNET:访问Internet。
- READ_CONTACTS:读取但不写入用户的联系人数据。
- WRITE_CONTACTS:写入但不读取用户的联系人数据。
- RECEIVE_SMS:监视收到的短信。
- ACCESS_COARSE_LOCATION:使用粗糙的位置提供器,如基站或Wi-Fi。
- ACCESS_FINE_LOCATION:使用更精确的位置提供器,如GPS。
补充:Android甚至可以限制访问系统的特定部分。通过在清单文件中使用XML标签、可指定谁可启动活动、启动或绑定服务、向接收器广播意图以及访问内容提供器中的数据。
题外话:
世界上最快乐的事,莫过于为理想而奋斗。——苏格拉底