Android学习笔记
一、Android系统简介
1.1 体系架构
采用了分层的架构,如下图
1.1.2 Linux内核
Android 平台的基础是 Linux 内核。例如,Android Runtime (ART) 依靠 Linux 内核来执行底层功 能,例如线程和低层内存管理。使用 Linux 内核可让 Android 利用主要安全功能,并且允许设备 制造商为著名的内核开发硬件驱动程序
1.1.3 Android Runtime
对于运行 Android 5.0(API 级别 21)或更高版本的设备,每个应用都在其自己的进程中运行,并 且有其自己的 Android Runtime (ART) 实例。ART 编写为通过执行 DEX 文件在低内存设备上运行 多个虚拟机,DEX 文件是一种专为 Android 设计的字节码格式,经过优化,使用的内存很少。编 译工具链(例如 Jack)将 Java 源代码编译为 DEX 字节码,使其可在 Android 平台上运行
1.1.4 原生C/C++库
许多核心 Android 系统组件和服务(例如 ART 和 HAL)构建自原生代码,需要以 C 和 C++ 编写 的原生库。Android 平台提供 Java 框架 API 以向应用显示其中部分原生库的功能。例如,您可以 通过 Android 框架的 Java OpenGL API 访问 OpenGL ES,以支持在应用中绘制和操作 2D 和 3D 图形。如果开发的是需要 C 或 C++ 代码的应用,可以使用 Android NDK 直接从原生代码访问某 些原生平台库
1.1.5 Java API框架
您可通过以 Java 语言编写的 API 使用 Android OS 的整个功能集。这些 API 形成创建 Android 应 用所需的构建块,它们可简化核心模块化系统组件和服务的重复使用包括以下组件和服务:
- 丰富、可扩展的视图系统,可用以构建应用的 UI,包括列表、网格、文本框、按钮甚 至可嵌入的网络浏览器
- 资源管理器,用于访问非代码资源,例如本地化的字符串、图形和布局文件
- 通知管理器,可让所有应用在状态栏中显示自定义提醒
- Activity 管理器,用于管理应用的生命周期,提供常见的导航返回栈
- 内容提供程序,可让应用访问其他应用(例如“联系人”应用)中的数据或者共享其自己 的数据 开发者可以完全访问 Android 系统应用使用的框架 API
1.1.6 系统应用
Android 随附一套用于电子邮件、短信、日历、互联网浏览和联系人等的核心应用。平台随附的应 用与用户可以选择安装的应用一样,没有特殊状态。因此第三方应用可成为用户的默认网络浏览 器、短信 Messenger 甚至默认键盘(有一些例外,例如系统的“设置”应用)。系统应用可用作用 户的应用,以及提供开发者可从其自己的应用访问的主要功能。例如,如果您的应用要发短信,您 无需自己构建该功能,可以改为调用已安装的短信应用向您指定的接收者发送消息。
1.2 应用组件
1.2.1Android开发四大组件
- 活动 (Activity)
- Android 中,Activity是所有程序的根本,所有程序的流程都运行在Activity 之中,Activity可 以算是开发者遇到的最频繁,也是Android 当中最基本的模块之一。
- 一般一个Android 应用是由多个Activity 组成的。这多个Activity 之间Android的应用 可以进 行相互跳转。
- 服务(Service)
- Service 是android 系统中的一种组件,它跟Activity 的级别差不多,但是他不能自己运行, 只能后台运行,并且可以和其他组件进行交互。Service 是没有界面的长生命周期的代码。
- 举个例子,打开一个音乐播放器的程序,这个时候若想上网了,那么,打开Android浏览 器,这个时候虽然已经进入了浏览器这个程序,但是,歌曲播放并没有停止,而是在后台继 续一首接着一首的播放。其实这个播放就是由播放音乐的Service进行控制。
- 广播接收器 (BroadcastReceiver )
- 在Android 中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。
- 内容提供者 (Content Provider )
- Content Provider 是Android提供的第三方应用数据的访问方案
- 在Android中,对数据的保护是很严密的,除了放在SD卡中的数据,一个应用所持有的数据 库、文件等内容,都是不允许其他直接访问的。Android当然不会真的把每个应用都做成一 座孤岛,它为所有应用都准备了一扇窗,这就是Content Provider。
1.3 平台优势
1.3.1 开放性
- 在优势方面,Android平台首先就是其开放性,开发的平台允许任何移动终端厂商加入到Android 联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平 台也将很快走向成熟。
- 开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者 来讲,最大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以 用更低的价位购得心仪的手机。
1.3.2 丰富的硬件
- 在优势方面,Android平台首先就是其开放性,开发的平台允许任何移动终端厂商加入到Android 联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平 台也将很快走向成熟。 开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者 来讲,最大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以 用更低的价位购得心仪的手机。
1.3.3 方便开发
- Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可 想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏 如何控制正是留给Android难题之一。
1.3.4 Google应用
- 在互联网的Google已经走过10年度历史,从搜索巨人到全面的互联网渗透,Google服务如地图、 邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的 Google服务。
二、Android UI开发
2.1 UI定义
-
用户界面(User Interface,简称 UI,亦称使用者界面)是系统和用户之间进行交互和信息交换 的媒介,它实现信息的内部形式与人类可以接受形式之间的转换。
-
软件设计可分为两个部分:编码设计与UI设计。
-
Android应用界面包含用户可查看并与之交互的所有内容。Android 提供丰富多样的预置 UI 组 件,例如结构化布局对象和 UI 控件,您可以利用这些组件为您的应用构建图形界面。
-
Android 还 提供其他界面模块,用于构建特殊界面,例如对话框、通知和菜单。
2.2 布局
布局(layout)可定义应用中的界面结构(例如 Activity 的界面结构)。布局中的所有元素均使用 View 和 ViewGroup 对象的层次结构进行构建。View 通常绘制用户可查看并进行交互的内容。然而, ViewGroup 是不可见容器,用于定义 View 和其他 ViewGroup 对象的布局结构。
2.2.1 布局的结构
- 定义界面布局的视图层次结构图示:
-
View 对象通常称为“微件”,可以是众多子类之一,例如 Button 或 TextView 。
-
ViewGroup 对象通常称为“布局”,可以是提供其他布局结构的众多类型之一,例如 LinearLayout 或 ConstraintLayout 。
2.2.2 声明布局
- 在 XML 中声明界面元素,Android 提供对应 View 类及其子类的简明 XML 词汇,如用于微件和布 局的词汇。 也可使用 Android Studio 的 Layout Editor,并采用拖放界面来构建 XML 布局。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
2.2.3 编写XML
- 利用 Android 的 XML 词汇,按照在 HTML 中创建包含一系列嵌套元素的网页的相同方式快速设计 UI 布局及其包含的屏幕元素
- 每个布局文件都必须只包含一个根元素,并且该元素必须是视图对象或 ViewGroup 对象
- 定义根元素后,可以子元素的形式添加其他布局对象或控件,从而逐步构建定义布局的视图层次结构
- 在 XML 中声明布局后,以 .xml 扩展名将文件保存在Android 项目的 res/layout/ 目录中
2.2.4 加载XML资源
- 当编译应用时,系统会将每个 XML 布局文件编译成 View 资源。在 ``Activity.onCreate()
回调 内,通过调用
setContentView(),并以
R.layout.layout_file_name` 形式向应用代码传 递布局资源的引用 ,加载应用代码中的布局资源。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
2.2.5 内边距和外边距
一般只有字体大小用sp,其余均用dp。
2.3 常用布局
Android七大布局:LinearLayout(线性布局)、TableLayout(表格布局)、RelativeLayout(相对布局)、FrameLayout(层布局)、AbsoluteLayout(绝对布局)、GridLayout(网格布局)、ConstraintLayout(约束布局)。
继承关系:
2.3.1 线性布局 - LinearLayout
LinearLayout
是一个视图容器,用于使所有子视图在单个方向(垂直或水平)保持对齐。您可 使用android:orientation
属性指定布局方向。android:orientation="horizontal"
水平对齐
android:orientation="vertical"
-
android:gravity:内部控件对齐方式,常用属性值:center、center_vertical、center_horizontal、top、bottom、left、right等。android:gravity在布局组件 RelativeLayout、TableLayout 中也有使用,在 FrameLayout、AbsoluteLayout 则没有这个属性。
-
center:居中显示,这里并不是表示显示在 LinearLayout 的中心,当 LinearLayout 线性方向为垂直方向时,center 表示水平居中,但是并不能垂直居中,此时等同于 center_horizontal 的作用;同样当线性方向为水平方向时,center 表示垂直居中,等同于 center_vertical。top、bottom、left、right 顾名思义为内部控件居顶、低、左、右布局。
-
这里要与 android:layout_gravity 区分开,layout_gravity 是用来设置自身相对于父元素的布局。
-
android:layout_weight:权重,用来分配当前控件在剩余空间的大小。使用权重一般要把分配该权重方向的长度设置为零,比如在水平方向分配权重,就把 width 设置为零。
2.3.2 相对布局 - RelativeLayout
-
相对布局 :子视图可通过相应的布局属性,设定相对于另一个兄弟视图或父视图容器的相对位置
-
属性说明:
-
相对于兄弟元素
属性名称 属性含义 android:layout_below=“@id/aaa” 在指定View的下方 android:layout_above=“@id/aaa” 在指定View的上方 android:layout_toLeftOf=“@id/aaa” 在指定View的左边 android:layout_toRightOf=“@id/aaa” 在指定View的右边 android:layout_alignTop=“@id/aaa” 与指定View的上边界一致 android:layout_alignBottom=“@id/aaa” 与指定View下边界一致 android:layout_alignLeft=“@id/aaa” 与指定View的左边界一致 android:layout_alignRight=“@id/aaa” 与指定View的右边界一致 -
相对于父元素
属性名称 属性含义 android:layout_alignParentLeft=“true” 在父元素内左边 android:layout_alignParentRight=“true” 在父元素内右边 android:layout_alignParentTop=“true” 在父元素内顶部 android:layout_alignParentBottom=“true” 在父元素内底部 -
对齐方式
属性名称 属性含义 android:layout_centerInParent=“true” 居中布局 android:layout_centerVertical=“true” 垂直居中布局 android:layout_centerHorizontal=“true” 水平居中布局 -
间隔
属性名称 属性含义 android:layout_marginBottom=“” 离某元素底边缘的距离 android:layout_marginLeft=“” 离某元素左边缘的距离 android:layout_marginRight =“” 离某元素右边缘的距离 android:layout_marginTop=“” 离某元素上边缘的距离 android:layout_paddingBottom=“” 往内部元素底边缘填充距离 android:layout_paddingLeft=“” 往内部元素左边缘填充距离 android:layout_paddingRight =“” 往内部元素右边缘填充距离 android:layout_paddingTop=“” 往内部元素右边缘填充距离
-
2.3.3 帧布局 - FrameLayout
- 最简单的一种布局,没有任何定位方式,当我们往里面添加控件的时候,会默认把他们放到这块区域的左上角,帧布局的大小由控件中最大的子控件决定,如果控件的大小一样大的话,那么同一时 刻就只能看到最上面的那个组件,后续添加的控件会覆盖前一个。
2.3.4 约束布局 - ConstraintLayout
- 传统的Android开发当中,界面基本都是靠编写XML代码完成的,虽然Android Studio也支持可视化的方式来编写界面,但是操作起来并不方便,我也一直都不推荐使用可视化的方式来编写Android应用程序的界面。而ConstraintLayout就是为了解决这一现状而出现的。它和传统编写界面的方式恰恰相反,ConstraintLayout非常适合使用可视化的方式来编写界面,但并不太适合使用XML的方式来进行编写。当然,可视化操作的背后仍然还是使用的XML代码来实现的,只不过这些代码是由Android Studio根据我们的操作自动生成的。另外,ConstraintLayout 还有一个优点,它可以有效地解决布局嵌套过多的问题。我们平时编写界面,复杂的布局总会伴随着多层的嵌套,而嵌套越多,程序的性能也就越差。ConstraintLayout则是使用约束的方式来指定各个控件的位置和关系的,它有点类似于 RelativeLayout,但远比RelativeLayout要更强大。
属性名称 | 属性含义 |
---|---|
layout_constraintTop_toTopOf | 将所需视图的顶部与另一个视图的顶部对齐 |
layout_constraintTop_toBottomOf | 将所需视图的顶部与另一个视图的底部对齐 |
layout_constraintBottom_toTopOf | 将所需视图的底部与另一个视图的顶部对齐 |
layout_constraintBottom_toBottomOf | 将所需视图的底部与另一个视图的底部对齐 |
layout_constraintLeft_toLeftOf | 将所需视图的左边与另一个视图的左边对齐 |
layout_constraintLeft_toRightOf | 将所需视图的左边与另一个视图的右边对齐 |
layout_constraintRight_toLeftOf | 将所需视图的右边与另一个视图的左边对齐 |
layout_constraintRight_toRightOf | 将所需视图的右边与另一个视图的右边对 |