这一层是应用层,是Google最开始时在Android系统中捆绑了一些核心应用程序。比如e-mail客户端、SMS短消息程序、日历、地图、浏览器、联系人管理程序,等等。
这些应用程序都使用Java语言编写。
你也可以用自己编写的应用程序来替换Android提供的应用程序,这个替换的机制实际是应用程序框架来保证的。
第三层是Android核心应用程序所使用的API框架,是创建应用程序时需要使用的各种高级构建块。用户可以自由地使用它们来开发自己的应用程序。
该框架最重要的部分包括:活动管理器,内容提供器,资源管理器,位置管理器,通知管理器。
任何应用程序都可以发布自己的功能模块供其他应用程序使用。
用户可能随意替换程序组件。
第二层是核心的扩展类库,由C、C++语言实现。包括:
系统库:Bionic系统C库、多媒体库、SGL-2D图形引擎库、SSL-TCP/IP协议为数据通信提供支持、OpenGL ES -3D效果支持、SQLite-关系数据库、Webkit浏览器、FreeType-位图,矢量等。
Android Runtime:
核心类库:提供了Java编程语言核心类库具有的大部分功能。
Dalvik虚拟机:
第一层是Linux内核层,包括Linux 操作系统及驱动,依赖于Linux2.6内核。使得Android能实现核心系统服务。
除了标准的Linux内核外,Android 系统还增加了Binder IPC驱动、WiFi驱动、蓝牙驱动等驱动程序, 为系统运行提供了基础性支持。
采用Android Studio + SDK
来搭建开发环境。
下载Java开发工具包JDK,并安装;
配置环境变量
Linux系统
在终端输入/usr/libexec/java_home
可以得到JAVA_HOME 的路径
在终端输入sudo vim /etc/profile
输入如下配置:
JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home"
export JAVA_HOME
CLASS_PATH="$JAVA_HOME/lib"
PATH="$PATH:$JAVA_HOME/bin"
输入source /etc/profile
运行profile配置
Window系统
打开系统属性的环境变量窗口,在"系统变量"中设置3项属性(若已存在则点击"编辑",不存在则点击"新建"):
变量名:JAVA_HOME
变量值:C:\Program Files (x86)\Java\jdk1.8.0_91 // 要根据自己的实际路径配置
变量名:CLASSPATH
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; //记得前面有个"."
变量名:Path
变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; //在 Windows10 中,Path 变量里是分条显示的,我们需要将 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 分开添加,否则无法识别
验证JDK是否安装成功
终端输入java -version
,能出现版本号就说明环境变量配置成功。
一个Android应用程序以一个项目目录的形式组织。Android程序由 java代码和xml 属性声明共同设计完成。
项目目录结构如下:
Android签名
Android签名的目的:
如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名。
每个要安装到Android平台的应用都要被编译打包为一个单独的文件,扩展名为 .apk。APK文件包含了应用的二进制代码、资源、配置文件等。将APK文件传入Android模拟器或Android手机中即可安装。
为Android应用程序签名时,需要注意以下几点:
Android 应用采用 Java 编程语言编写。Android SDK 工具将您的代码 — 连同任何数据和资源文件 — 编译到一个 APK:Android 软件包,即带有 .apk 后缀的存档文件中。一个 APK 文件包含 Android 应用的所有内容,它是基于 Android 系统的设备用来安装应用的文件。
安装到设备后,每个 Android 应用都运行在自己的安全沙箱内:
Android 系统可以通过这种方式实现最小权限原则。也就是说,默认情况下,每个应用都只能访问执行其工作所需的组件,而不能访问其他组件。 这样便营造出一个非常安全的环境,在这个环境中,应用无法访问系统中其未获得权限的部分。
不过,应用仍然可以通过一些途径与其他应用共享数据以及访问系统服务:
应用组件是 Android 应用的基本构建基块。每个组件都是一个不同的点,系统可以通过它进入您的应用。 并非所有组件都是用户的实际入口点,有些组件相互依赖,但每个组件都以独立实体形式存在,并发挥特定作用 — 每个组件都是唯一的构建基块,有助于定义应用的总体行为。
共有四种不同的应用组件类型。每种类型都服务于不同的目的,并且具有定义组件的创建和销毁方式的不同生命周期。
Activity
Activity 表示具有用户界面的单一屏幕。例如,电子邮件应用可能具有一个显示新电子邮件列表的 Activity、一个用于撰写电子邮件的 Activity 以及一个用于阅读电子邮件的 Activity。 尽管这些 Activity 通过协作在电子邮件应用中形成了一种紧密结合的用户体验,但每一个 Activity 都独立于其他 Activity 而存在。 因此,其他应用可以启动其中任何一个 Activity(如果电子邮件应用允许)。 例如,相机应用可以启动电子邮件应用内用于撰写新电子邮件的 Activity,以便用户共享图片。
服务Service
服务是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业。 服务不提供用户界面。 例如,当用户位于其他应用中时,服务可能在后台播放音乐或者通过网络获取数据,但不会阻断用户与 Activity 的交互。 诸如 Activity 等其他组件可以启动服务,让其运行或与其绑定以便与其进行交互。
内容提供程序(Content Provider)
内容提供程序管理一组共享的应用数据。您可以将数据存储在文件系统、SQLite 数据库、网络上或您的应用可以访问的任何其他永久性存储位置。 其他应用可以通过内容提供程序查询数据,甚至修改数据(如果内容提供程序允许)。 例如,Android 系统可提供管理用户联系人信息的内容提供程序。 因此,任何具有适当权限的应用都可以查询内容提供程序的某一部分(如 ContactsContract.Data
),以读取和写入有关特定人员的信息。
内容提供程序也适用于读取和写入您的应用不共享的私有数据。
ContentProvider为所有需要共享的数据创建一个数据表。ContentProvider会对外提供一个公开的通用资源标识符URI(Uniform Resource Identifier)来标识数据集。
URI格式如下:scheme://host:port/path
,如content://com.example.project:200/folder/subfolder/etc
广播接收器(Broadcast Receiver)
广播接收器是一种用于响应系统范围广播通知的组件。许多广播都是由系统发起的 — 例如,通知屏幕已关闭、电池电量不足或已拍摄照片的广播。应用也可以发起广播 — 例如,通知其他应用某些数据已下载至设备,并且可供其使用。 尽管广播接收器不会显示用户界面,但它们可以创建状态栏通知,在发生广播事件时提醒用户。 但广播接收器更常见的用途只是作为通向其他组件的“通道”,设计用于执行极少量的工作。 例如,它可能会基于事件发起一项服务来执行某项工作。
使用过程:将需要广播的消息封装到Intent中。然后通过发送方法中将Intent广播出去 。通过IntentFilter对象来过滤所发送的实体Intent。
Android 系统设计的独特之处在于,任何应用都可以启动其他应用的组件。 例如,如果您想让用户使用设备的相机拍摄照片,很可能有另一个应用可以执行该操作,那么您的应用就可以利用该应用,而不是开发一个 Activity 来自行拍摄照片。 您不需要集成甚至链接到该相机应用的代码,而是只需启动拍摄照片的相机应用中的 Activity。 完成拍摄时,系统甚至会将照片返回您的应用,以便您使用。对用户而言,就好像相机真正是您应用的组成部分。
当系统启动某个组件时,会启动该应用的进程(如果尚未运行),并实例化该组件所需的类。 例如,如果您的应用启动相机应用中拍摄照片的 Activity,则该 Activity 会在属于相机应用的进程,而不是您的应用的进程中运行。因此,与大多数其他系统上的应用不同,Android 应用并没有单一入口点(例如,没有 main() 函数)。
由于系统在单独的进程中运行每个应用,且其文件权限会限制对其他应用的访问,因此您的应用无法直接启动其他应用中的组件, 但 Android 系统却可以。因此,要想启动其他应用中的组件,您必须向系统传递一则消息,说明您想启动特定组件的 Intent。 系统随后便会为您启动该组件。
四种组件类型中的三种 — Activity、服务和广播接收器 — 通过名为 Intent 的异步消息进行启动。Intent 会在运行时将各个组件相互绑定(您可以将 Intent 视为从其他组件请求操作的信使),无论组件属于您的应用还是其他应用。
Intent 使用 Intent
对象创建,它定义的消息用于启动特定组件或特定类型的组件 — Intent 可以是显式的,也可以是隐式的。
对于 Activity 和服务, Intent 定义要执行的操作(例如,“查看”或“发送”某个内容),并且可以指定要执行操作的数据的 URI(以及正在启动的组件可能需要了解的信息)。 例如, Intent 传达的请求可以是启动一个显示图像或打开网页的 Activity。 在某些情况下,您可以启动 Activity 来接收结果,在这种情况下,Activity 也会在 Intent 中返回结果(例如,您可以发出一个 Intent,让用户选取某位联系人并将其返回给您 — 返回 Intent 包括指向所选联系人的 URI)。
对于广播接收器, Intent 只会定义要广播的通知(例如,指示设备电池电量不足的广播只包括指示“电池电量不足”的已知操作字符串)。
Intent 不会启动另一个组件类型 - 内容提供程序,后者会在成为 ContentResolver
的请求目标时启动。 内容解析程序通过内容提供程序处理所有直接事务,使得通过提供程序执行事务的组件可以无需执行事务,而是改为在 ContentResolver
对象上调用方法。 这会在内容提供程序与请求信息的组件之间留出一个抽象层(以确保安全)。
每种类型的组件有不同的启动方法:
Intent
传递到 startActivity()
或 startActivityForResult()
(当您想让 Activity 返回结果时)来启动 Activity(或为其安排新任务)。Intent
传递到 startService()
来启动服务(或对执行中的服务下达新指令)。 或者,您也可以通过将 Intent
传递到 bindService()
来绑定到该服务。Intent
传递到 sendBroadcast()
、sendOrderedBroadcast()
或 sendStickyBroadcast()
等方法来发起广播;ContentResolver
上调用 query()
来对内容提供程序执行查询。在 Android 系统启动应用组件之前,系统必须通过读取应用的 AndroidManifest.xml 文件(“清单”文件)确认组件存在。 您的应用必须在此文件中声明其所有组件,该文件必须位于应用项目目录的根目录中。
AndroidManifest.xml的主要作用:
AndroidManifest.xml结构示例:
开发Android应用项目,首先需要整理以下内容:
在进入具体的编码前,需要形成相关开发文档,描述上面涉及的问题。
用户界面设计
按照项目规划文档,使用XML文件描述出Android的用户界面:布局模式、视图组件、填充的数据等。
准备需要的资源
数据操作和存储
数据来源(SharedPreferences、数据库、ContentProvider、网络等)及存储开发。
多页面的跳转实现
实现各个界面直接的调用和跳转流程。
增加Service
实现项目需要的Service。
完善应用细节
从网络上获取数据,在manifest.xml中需要添加相关的uses-permission;
老版本更新,在manifest.xml中需要更新versionCode,versionName;
…
应用测试
使用模拟器和Eclipse中的DDMS功能。
打包发布