android入门
Android入门
Android平台架构
应用程序
这一层是应用层,是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:
linux 内核
第一层是Linux内核层,包括Linux 操作系统及驱动,依赖于Linux2.6内核。使得Android能实现核心系统服务。
除了标准的Linux内核外,Android 系统还增加了Binder IPC驱动、WiFi驱动、蓝牙驱动等驱动程序, 为系统运行提供了基础性支持。
开发环境搭建
采用Android Studio + SDK
来搭建开发环境。
1、Java JDK安装与配置
-
下载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
,能出现版本号就说明环境变量配置成功。
2、安装Android Studio
3、新建Android项目
-
新建一个Android项目
-
选择开发程序将运行在哪个平台上:
-
选择Activity的风格:
- 设置Activity属性
4、项目目录结构
一个Android应用程序以一个项目目录的形式组织。Android程序由 java代码和xml 属性声明共同设计完成。
项目目录结构如下:
5、相关术语的解析
- Dalvik: Android特有的虚拟机,和JVM不同,Dalvik虚拟机非常适合在移动终端上使用
- AVD(android virtual machine):安卓虚拟设备,就是安卓的模拟器
- ADT(android development tools): 安卓开发工具
- SDK(software development kit):软件开发工具包,就是安卓系统,平台架构等的工具集合,如adb.exe
- DDMS(dalvik debug monitor service):安卓调试工具
- adb:安卓调试桥,在sdk的platform-tools目录下,功能很多,命令行必备
- DX工具:将.class转换成.dex文件
- AAPT(android asset packing tool):安卓资源打包工具
- R.java文件:由aapt工具根据APP中的资源文件自动生成,可以理解为资源字典
- Androidmanifest.xml:app包名 + 组件声明 + 程序兼容的最低版本 + 所需权限等程序的配置文件
6、APP程序打包与安装的流程
Android签名
Android签名的目的:
- 发送者的身份认证。
- 保证信息传输的完整性。
- 防止交易中的抵赖发生,android market 对软件的要求。
如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名。
每个要安装到android平台的应用都要被编译打包为一个单独的文件,扩展名为 .apk。APK文件包含了应用的二进制代码、资源、配置文件等。将APK文件传入Android模拟器或Android手机中即可安装。
为Android应用程序签名时,需要注意以下几点:
- 所有的Android应用都必须有数字签名,Android系统不会安装没有数字证书的应用。
- 同一个开发者的多个程序尽可能使用同一个数字证书签名。
- 签名的数字证书不需要权威机构来认证,是开发者自己产生的数字证书,即所谓的自签名。
- 正式发布一个Android应用时,必须使用一个合适的私钥生成的数字证书来给程序签名,不能使用ADT插件或者ANT工具生成的调试证书来发布。
- 数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
7、APP的安装过程
Android应用程序
Android 应用采用 Java 编程语言编写。Android SDK 工具将您的代码 — 连同任何数据和资源文件 — 编译到一个 APK:Android 软件包,即带有 .apk 后缀的存档文件中。一个 APK 文件包含 Android 应用的所有内容,它是基于 Android 系统的设备用来安装应用的文件。
安装到设备后,每个 Android 应用都运行在自己的安全沙箱内:
- Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户;
- 默认情况下,系统会为每个应用分配一个唯一的 Linux 用户 ID(该 ID 仅由系统使用,应用并不知晓)。系统为应用中的所有文件设置权限,使得只有分配给该应用的用户 ID 才能访问这些文件;
- 每个进程都具有自己的虚拟机 (VM),因此应用代码是在与其他应用隔离的环境中运行;
- 默认情况下,每个应用都在其自己的 Linux 进程内运行。Android 会在需要执行任何应用组件时启动该进程,然后在不再需要该进程或系统必须为其他应用恢复内存时关闭该进程。
Android 系统可以通过这种方式实现最小权限原则。也就是说,默认情况下,每个应用都只能访问执行其工作所需的组件,而不能访问其他组件。 这样便营造出一个非常安全的环境,在这个环境中,应用无法访问系统中其未获得权限的部分。
不过,应用仍然可以通过一些途径与其他应用共享数据以及访问系统服务:
- 可以安排两个应用共享同一 Linux 用户 ID,在这种情况下,它们能够相互访问彼此的文件。 为了节省系统资源,可以安排具有相同用户 ID 的应用在同一 Linux 进程中运行,并共享同一 VM(应用还必须使用相同的证书签署)。
- 应用可以请求访问设备数据(如用户的联系人、短信、可装载存储装置 [SD 卡]、相机、蓝牙等)的权限。 用户必须明确授予这些权限。
应用组件
应用组件是 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()
来对内容提供程序执行查询。
AndroidManifest.xml文件
在 Android 系统启动应用组件之前,系统必须通过读取应用的 AndroidManifest.xml 文件(“清单”文件)确认组件存在。 您的应用必须在此文件中声明其所有组件,该文件必须位于应用项目目录的根目录中。
AndroidManifest.xml的主要作用:
- 声明应用程序的包名,该包名将作为应用程序的唯一标识符
- 声明应用的组件,如Activity、Service、BroadcastReceiver及ContentProvider等
- 确定应用需要的任何用户权限,如互联网访问权限或对用户联系人的读取权限
- 根据应用使用的 API,声明应用所需的最低 API 级别
- 声明应用使用或需要的硬件和软件功能,如相机、蓝牙服务或多点触摸屏幕
- 应用需要链接的 API 库(Android 框架 API 除外),如 Google 地图库
AndroidManifest.xml结构示例:
<?xml version="1.0" encoding="utf-8"?><!--定义使用的xml版本和编码-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.liaoxuyi.androidlearning"><!--定义应用程序包名-->
<!--声明应用程序正常工作所需要的权限。程序包必须被授予该权限才能进行正确的操作。-->
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<!--声明一个安全授权。用来限制哪些应用可以访问指定的程序包内的组件和特有功能。-->
<permission android:name="android.permission.ACCESS_LOCATION"></permission>
<!--声明程序内应用级别组件的根节点,描述应用程序的全局/默认属性,如标签、图标、主题及权限等。-->
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!--声明一个Activity-->
<activity android:name=".MainActivity">
<!--声明组件所支持的一组Intent值-->
<intent-filter>
<!--声明该组件支持的Intent action-->
<action android:name="android.intent.action.MAIN" />
<!--声明该组件支持的Intent目录-->
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--定义一个Service组件-->
<service
android:name=".MyService"
android:enabled="true"
android:exported="true" />
<!--定义一个使应用监听全局事件,并对外部事件作出响应的BroadcastReceiver组件-->
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true" />
<!--定义一个用来管理和发布持久数据的ContentProvider组件-->
<provider
android:name=".MyContentProvider"
android:authorities="com.example.liaoxuyi.androidlearning.MyContentProvider"
android:enabled="true"
android:exported="true"></provider>
</application>
</manifest>
应用开发步骤
开发Android应用项目,首先需要整理以下内容:
- 项目有哪些功能;
- 需要哪些用户界面;
- 各界面之间跳转的流程;
- 需要的数据及其数据的来源和格式;
- 是否需要服务端的支持;
- 是否需要本地数据库的支持;
- 是否需要特殊的权限;
- 是否需要后台进程等。
在进入具体的编码前,需要形成相关开发文档,描述上面涉及的问题。
开发步骤
-
用户界面设计
按照项目规划文档,使用XML文件描述出Android的用户界面:布局模式、视图组件、填充的数据等。
-
准备需要的资源
-
数据操作和存储
数据来源(SharedPreferences、数据库、ContentProvider、网络等)及存储开发。
-
多页面的跳转实现
实现各个界面直接的调用和跳转流程。
-
增加Service
实现项目需要的Service。
-
完善应用细节
从网络上获取数据,在manifest.xml中需要添加相关的uses-permission;
老版本更新,在manifest.xml中需要更新versionCode,versionName;
…
-
应用测试
使用模拟器和Eclipse中的DDMS功能。
-
打包发布
文章最后发布于: 2018-12-26 22:59:16
相关阅读
1.背景 本人纯小白,在折腾使用freeline的过程遇到了一些不大不小的问题,记录下希望对其他人有帮助 2.freeline介绍 Free
随着计算机的普及、互联网的发展,原本黑客手中的攻城利器---Linux,渐渐进入到普通群众的视线里,让越来越多的人接触到Linux,并学习Lin
目 录 第1章 GRUB4DOS入门 1 1.1 用途 1 1.2 安装 1 1.2.1 修改MBR 1 1.2.2
es6入门到五连绝世之双杀(double kill )欢迎来到e6语法笔记教学一、解构赋值篇1.1、对象解构1.2、数组解构1.3、字面量解构二、循环
作者 | @Aloys (