前言
在安卓开发 开发前你需要了解的一些资料(一) 中我们简单的介绍了JDK、SDK、NDK以及开发App的工程结构和Android Studio的部分使用方法。而在本次记录中,将会讲解在开发中必须要了解的一些资料以及编写Android 的Hello World(不使用模板)!
Android系统架构
安卓Android作为一个移动设备的开发平台,其系统构架被分成了四个部分,从高到低分别是:Android 应用层,Android 应用框架层,Android 系统运行层,Linux 内核层。
Android 应用层:包括系统应用和第三方应用等等,其中Android会同一系列核心应用程序包一起打包发布,其应用程序包括短信,联系人,日历,等等。
Android 应用框架层:可以说是应用程序的核心,所有的应用开发都必要遵循其框架的原则。同时,通过该框架,我们完全可以访问其核心应用程序所使用的API框架。(需要服从框架执行的安全限制)。当然,我们也可以在通过继承在其框架上进行扩展,以实现个性化应用等。【引用和了解的博客:软件体系结构---安卓系统架构之应用程序框架层分析---1】
Android 应用程序框架包含 Activity Manager(活动管理器)、Window Manager(窗口管理器)、Content Provider(内容提供器)、 View System(视图系统)、 Notification Manager(通告管理器)、Package Manager(包管理器)、 Telephony Manager(电话管理器)、 Location Manager、Resource Manager(位置管理器)、XMPP Service(XMPP服务)。
系统/服务 | 英文名称 | 说明 |
---|---|---|
活动管理器 | Activity Manager | 管理各个应用的生命周期以及导航回退功能等。 |
窗口管理器 | Window Manager | 窗口主要分为两种窗口:应用窗口和公共窗口。其中应用窗口是指应用中的窗口,例如主界面,Dialog弹窗,菜单等等。而公共窗口则大部分值系统级别的,例如下拉状态栏,锁屏界面等。 |
内容提供器 | Content Provider | 内容提供者是应用程序之间共享数据的一直接口机制,能够使得不同的程序之间存取和分享数据。 |
视图系统 | View System | 其构成了应用程序的基本组件。例如文本框,按钮等。 |
通告管理器 | Notification Manager | 使得应用程序可以在状态栏上显示自定义的提示信息。 |
包管理器 | Package Manager | 系统中对于程序的管理。 |
电话管理器 | Telephony Manager | 用于管理手机的通话状态,电话信息以及电话通讯等 |
资源管理器 | Resource Manager | 其用于提供应用程序中的各种非代码资源。注意:资源管理器提供的是应用程序中的资源,而不是外部存储的资源 |
位置管理器 | Location Manager | 顾名思义,其负责和管理位置信息 |
XMPP服务 | XMPP Service | 用于提供一些服务。XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议):是一种即时消息协议,其用与信息的传输。 |
Android 系统运行层:其通过一些C/C++库来为Android提供主要的特性支持。其包括两部分,一部分是系统库,另外一部分则是Android NDK。NDK这里不做解释了,在安卓开发 开发前你需要了解的一些资料(一)已经了解过了。我们这里解释一下系统库。【引用和了解来自与百度百科-Android系统构架】
系统库:Libc、Media Framework、Surface Manager、Webkit、SGL、SSL、OpenGL ES、greeType、SQLite。
库名 | 说明 |
---|---|
Libc | 系统C库,一个从BSD继承来的标准C系统函数库,专门为基于Embedded linux的设备定制的。 |
Media Framework | 多媒体库,基于PacketVideoopencore;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4,H.264,MP3,AAC,AMR,JPG,PNG。 |
Surface Manager | 负责管理针对显示子系统的访问,并且为多个应用程序提供了2D和3D图层的无缝融合。 |
Webkit | 浏览器引擎,支持Android浏览器和一个可嵌入的web视图 |
SGL | 底层的2D图形引擎 |
SSL | 位于TCP/IP协议栈与各种应用层协议之间,为数据通信提供支持 |
OpenGL ES | 用于对3D效果的支持,基于OpenGLES 1.0 APIs实现;该库可以使用硬件3D加速或者使用高度优化的3D软加速。 |
greeType | 位图(bitmap)和矢量(vector)字体显示 |
SQLite | 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。(安卓内置的数据库) |
(安卓在运行时,其运行了核心库,同时也运行着Dalvik虚拟机(应用运行在Dalvik虚拟机上),Dalvik虚拟机不同于Java虚拟机,在安卓中,每一个应用程序都运行在自己的进程上,其由Dalvik虚拟机分配。Dalvik虚拟机是一种基于寄存器的Java虚拟机,可执行的文件格式为.dex 。Dalvik做了大量的内存优化,其在一些底层方面,Dalvik虚拟机需要依赖Linux内核。)
Linux 内核层:整个安卓系统框架的最底层,其为Android设备各种硬件提供了驱动。同时其也为硬件与软件打通了联系。这里不过多解释。所以说安卓是基于Linux的,因为其底层为Linux。
安卓四大核心组件:Activity+Service+BroadcastReceiver+ContentProvider
我们了解安卓的系统框架之后,当我们在开发安卓应用时,我们要了解到其组成。Android的应用程序通常是由一个或多个基本组件组成(不同与其他语言,安卓中并没有常见的应用程序入口,例如C\C++、Java中的main方法),组件可以是被调用的基本功能模块。安卓程序利用组件实现程序内部或程序之间的模块调用来解决代码复用的问题,这也是Android程序非常重要的特性。
安卓程序中有4大核心组件:Activity(活动)、Service(服务)、BroadcastReceiver(广播接收者)、ContentProvider(内容提供者)。
Activity
Activity 是安卓中最基本的模块,其为用户操作提供一个可视化界面,在一个安卓程序中,可以包含一个或多个Activity 。Activity 是由 Android 系统进行维护的,它有自己的生命周期。其后面再了解。
Service
Service是服务意思,其没有可视化的用户界面,主要是在后台运行,其可以在后台运行很久很久,甚至当App关闭掉时,Service依旧可以运行。例如:用户在做其它事情时可以在后台播放歌曲,在下载视频时可以切换致其它App,依旧可以下载。这就是服务的强大之处。(注意:服务不是线程.其运行在主线程中。需要注意)
BroadcastReceiver
BroadcastReceiver(广播接收者)是一个专注于接收广播通知消息,并对其做出相对应的出来的组件。在安卓系统中,有着许许多多的广播,例如系统开机,系统将会发送一条广播,电量过低,系统也就会发送一条广播,网络改变,电量变化等等。当然自己的程序也可以发送广播。一个Android应用可以拥有任意数量的广播接收器,以对所有它感兴趣的通知信息予以响应。BroadcastReceiver是没有UI(图形界面)的,我们通常需要NotificationManager来通知用户。
ContentProvider
ContentProvider(内容提供者) 是 应用程序之间共享数据的一种接口机制,它是一种更为高级的数据共享方法,可以指定需要共享的数据,而其他应用程序则可以在不知道数据来源、路径的情况下,对共享数据进行操作。
AndroidManifest.xml
每一个Android 模块都必须包含一个清单(Manifest)文件 AndroidManifest.xml。在安卓开发 开发前你需要了解的一些资料(一)已经说明了一些常用的标签。为什么我们又要在这里提及呢?因为当我们创建一个活动(Activity)、服务(Service)、内容提供者(ContentProvider)都 必须 必须 必须 需要在清单文件中声明!而广播接受者(BroadcastReceiver)既可以在清单文件中声明静态注册,也可以在代码中进行动态注册。
组件大小单位
在Android中UI组件其像素单位有:px(像素),in(英寸),mm(毫米),pt(磅,1/72英寸),dp(与设备无关的显示单位),dip(就是dp),sp(用于设置字体大小)。其中,常用的有px、dp、sp。下面简单介绍一下。
在众多的单位中,px是可显示的最小的单位,其1dp就代表一个像素,其与物理设备的显示屏有关。
dp是一种与设备无关的显示单位,其只与屏幕的尺寸有关。
sp与dp原理是一样的,当手机系统设置的字体大小为普通字体大小时,sp和dp是一样的。而当字体大小设置为大字体时,sp所显示的大小将会比dp大。
当我们在设计UI时,最好除了文字大小使用sp单位,其他都使用dp单位。
另外,我们需要注意的是,在xml布局文件中,当我们使用dp为单位时,我们如果要在代码中修改大小,我们需要转换一下,因为 Android中用于设置大小的函数都以px为单位。所以我们得将dp值换为px值。
px,sp,dp互相转换的推荐博客:px,sp,dp相互转换
颜色
在Android中,颜色值都是由透明度alpha和RGB(红、绿、蓝)三原色所定义的,有八位十六进制数和六位十六进制数两种编码。例如八位编码FFEEDDCC,FF表示透明度,EE表示红色的浓度,DD表示绿色的浓度,CC表示蓝色的浓度。而六位十六进制数则自动省略了最开头的两位(表示透明度的)。需要注意的是:在XML文件中默认是不透明的,而在代码中,默认是透明的。
在安卓系统中,已定义12种颜色任开发者选择。其具体的类型定义在Color类中。可以直接在代码中调用,而在xml文件中,颜色种类更多,使用"@android:color/颜色名"
Color类中颜色 | 说明 | Color类中颜色 | 说明 |
---|---|---|---|
Color.BLACK | 黑色 | Color.WHITE | 白色 |
Color.GREEN | 绿色 | Color.RED | 红色 |
Color.GRAY | 灰色 | Color.YELLOW | 黄色 |
Color.BLUE | 蓝色 | Color.DKGRAY | 深灰色 |
Color.MAGENTA | 玫瑰红 | Color.TRANSPARENT | 透明 |
Color类颜色:
XML文件
在前面中,我们多次提到xml。为了防止个别不懂,所以这里简单介绍一下。XML指可扩展标记语言,被设计用于传输和存储数据。其结构大致上类似于HTML的标签一样,由 尖括号 包围关键字,例如<acitvity />,其具有一个开始标签和一个结束标签(必须包含结束标签),其中 被开始标签和结束标签所包围的数据就是属于该标签的数据。
例如:
<!--这是一个用户信息-->
<user><!--根标签-->
<name type="Chinese">露西</name><!--姓名标签,其中type是姓名标签的属性-->
<sex>女</sex><!--性别标签-->
<age>16</age><!--年龄标签-->
<remark type="Chinese" /> <!--备足标签,注意这里使用了结束标签另外一种形式-->
</user><!--user根标签的结束标签-->
<!--这是一个注释-->
XML的一些语法
所以的XML标签都必须要关闭标签
开始标签和结束标签对大小写敏感,必须一致!
标签中嵌套其它元素必须要正确的嵌套,错误示范:<user><name> 刘某某 <user><name> 。
XML文档必须要具有根标签,也就是说,必要要有一个元素是所有元素的父元素。错误示范:<name></name><sex></sex> (存在了两个根标签:name和sex。必须使用一个标签包裹他们才行。)
XML中的属性值必须加引号进去区分:错误示范 <name type=Chinese />(错误,type属性的值没有加引号)
-
在XML中,某些字符具有特殊意义,例如
<
。其无法判断是开始标签还是值,所以当我们在使用<
作为值时,需要使用<
代替。在XML中,有5个预定义的实体引用:引用 符号 说明 <
< 小于 >
> 大于 &
& 和号 '
’ 单引号 "
” 双引号
- 在XML中,空格也会保留。
编写安卓的Hello World(不使用模板)
=-=简书里面不能放视频 ?!!!!!哎,算了。还是使用截图吧。
第一步:新建一个项目
第二步:不选择模板
第三步:添加项目名以及包名等信息(我选择的是Java,根据自己情况填写)
第四步:等待同步完成
第五步:在项目开发资源文件中创建Acitvity布局文件
或者自己在res目录中创建layout文件夹。然后再创建一个xml文件。然后在包中创造活动的实体类。也是一样的。(偷一下懒,这个重点不是在这。)
下面是一些注释。注意。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:text="Hello World"
android:textSize="30sp"
android:textColor="#FF000000"
android:gravity="center"
app:layout_constraintTop_toBottomOf="parent"
app:layout_constraintBottom_toTopOf="parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints">
</TextView>
</androidx.constraintlayout.widget.ConstraintLayout>
第六步(最最重要的一步!!):配置AndroidManifest.xml清单文件。
需要在清单文件中,指明该活动实体类为App启动时启动的活动!不然无法启动!
其中最重要的就是在意图过滤中,指明该活动实体类为App启动时的。就是在意图过滤中指明:<action android:name="android.intent.action.MAIN"/>
,<category android:name="android.intent.category.LAUNCHER"/>
。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.palz.learn">
<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 android:name=".MainActivity"><!--指明活动实体类-->
<intent-filter><!--意图过滤节点 :只有符合该元素的才能启动活动-->
<!--指明在App启动时,启动该活动-->
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
第七步:运行即可
后话
安卓的应用程序由各个组件组成。其中安卓的四大核心组件是我们必须所掌握的。
而在编写第一个Hello World时,推荐自己去配置清单文件。再多说一句:当我们创建一个活动(Activity)、服务(Service)、内容提供者(ContentProvider)都 必须 必须 必须 需要在清单文件中声明!而广播接受者(BroadcastReceiver)既可以在清单文件中声明静态注册,也可以在代码中进行动态注册。