前言
??在安卓開發(fā) 開發(fā)前你需要了解的一些資料(一) 中我們簡單的介紹了JDK、SDK、NDK以及開發(fā)App的工程結(jié)構(gòu)和Android Studio的部分使用方法。而在本次記錄中,將會講解在開發(fā)中必須要了解的一些資料以及編寫Android 的Hello World(不使用模板)!
Android系統(tǒng)架構(gòu)
??安卓Android作為一個移動設(shè)備的開發(fā)平臺,其系統(tǒng)構(gòu)架被分成了四個部分,從高到低分別是:Android 應(yīng)用層,Android 應(yīng)用框架層,Android 系統(tǒng)運(yùn)行層,Linux 內(nèi)核層。
??Android 應(yīng)用層:包括系統(tǒng)應(yīng)用和第三方應(yīng)用等等,其中Android會同一系列核心應(yīng)用程序包一起打包發(fā)布,其應(yīng)用程序包括短信,聯(lián)系人,日歷,等等。
??Android 應(yīng)用框架層:可以說是應(yīng)用程序的核心,所有的應(yīng)用開發(fā)都必要遵循其框架的原則。同時,通過該框架,我們完全可以訪問其核心應(yīng)用程序所使用的API框架。(需要服從框架執(zhí)行的安全限制)。當(dāng)然,我們也可以在通過繼承在其框架上進(jìn)行擴(kuò)展,以實現(xiàn)個性化應(yīng)用等。【引用和了解的博客:軟件體系結(jié)構(gòu)---安卓系統(tǒng)架構(gòu)之應(yīng)用程序框架層分析---1】
Android 應(yīng)用程序框架包含 Activity Manager(活動管理器)、Window Manager(窗口管理器)、Content Provider(內(nèi)容提供器)、 View System(視圖系統(tǒng))、 Notification Manager(通告管理器)、Package Manager(包管理器)、 Telephony Manager(電話管理器)、 Location Manager、Resource Manager(位置管理器)、XMPP Service(XMPP服務(wù))。
| 系統(tǒng)/服務(wù) | 英文名稱 | 說明 |
|---|---|---|
| 活動管理器 | Activity Manager | 管理各個應(yīng)用的生命周期以及導(dǎo)航回退功能等。 |
| 窗口管理器 | Window Manager | 窗口主要分為兩種窗口:應(yīng)用窗口和公共窗口。其中應(yīng)用窗口是指應(yīng)用中的窗口,例如主界面,Dialog彈窗,菜單等等。而公共窗口則大部分值系統(tǒng)級別的,例如下拉狀態(tài)欄,鎖屏界面等。 |
| 內(nèi)容提供器 | Content Provider | 內(nèi)容提供者是應(yīng)用程序之間共享數(shù)據(jù)的一直接口機(jī)制,能夠使得不同的程序之間存取和分享數(shù)據(jù)。 |
| 視圖系統(tǒng) | View System | 其構(gòu)成了應(yīng)用程序的基本組件。例如文本框,按鈕等。 |
| 通告管理器 | Notification Manager | 使得應(yīng)用程序可以在狀態(tài)欄上顯示自定義的提示信息。 |
| 包管理器 | Package Manager | 系統(tǒng)中對于程序的管理。 |
| 電話管理器 | Telephony Manager | 用于管理手機(jī)的通話狀態(tài),電話信息以及電話通訊等 |
| 資源管理器 | Resource Manager | 其用于提供應(yīng)用程序中的各種非代碼資源。注意:資源管理器提供的是應(yīng)用程序中的資源,而不是外部存儲的資源 |
| 位置管理器 | Location Manager | 顧名思義,其負(fù)責(zé)和管理位置信息 |
| XMPP服務(wù) | XMPP Service | 用于提供一些服務(wù)。XMPP(Extensible Messageing and Presence Protocol:可擴(kuò)展消息與存在協(xié)議):是一種即時消息協(xié)議,其用與信息的傳輸。 |
??Android 系統(tǒng)運(yùn)行層:其通過一些C/C++庫來為Android提供主要的特性支持。其包括兩部分,一部分是系統(tǒng)庫,另外一部分則是Android NDK。NDK這里不做解釋了,在安卓開發(fā) 開發(fā)前你需要了解的一些資料(一)已經(jīng)了解過了。我們這里解釋一下系統(tǒng)庫?!疽煤土私鈦碜耘c百度百科-Android系統(tǒng)構(gòu)架】
??系統(tǒng)庫:Libc、Media Framework、Surface Manager、Webkit、SGL、SSL、OpenGL ES、greeType、SQLite。
| 庫名 | 說明 |
|---|---|
| Libc | 系統(tǒng)C庫,一個從BSD繼承來的標(biāo)準(zhǔn)C系統(tǒng)函數(shù)庫,專門為基于Embedded linux的設(shè)備定制的。 |
| Media Framework | 多媒體庫,基于PacketVideoopencore;該庫支持多種常用的音頻、視頻格式回放和錄制,同時支持靜態(tài)圖像文件。編碼格式包括MPEG4,H.264,MP3,AAC,AMR,JPG,PNG。 |
| Surface Manager | 負(fù)責(zé)管理針對顯示子系統(tǒng)的訪問,并且為多個應(yīng)用程序提供了2D和3D圖層的無縫融合。 |
| Webkit | 瀏覽器引擎,支持Android瀏覽器和一個可嵌入的web視圖 |
| SGL | 底層的2D圖形引擎 |
| SSL | 位于TCP/IP協(xié)議棧與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通信提供支持 |
| OpenGL ES | 用于對3D效果的支持,基于OpenGLES 1.0 APIs實現(xiàn);該庫可以使用硬件3D加速或者使用高度優(yōu)化的3D軟加速。 |
| greeType | 位圖(bitmap)和矢量(vector)字體顯示 |
| SQLite | 一個對于所有應(yīng)用程序可用,功能強(qiáng)勁的輕型關(guān)系型數(shù)據(jù)庫引擎。(安卓內(nèi)置的數(shù)據(jù)庫) |
(安卓在運(yùn)行時,其運(yùn)行了核心庫,同時也運(yùn)行著Dalvik虛擬機(jī)(應(yīng)用運(yùn)行在Dalvik虛擬機(jī)上),Dalvik虛擬機(jī)不同于Java虛擬機(jī),在安卓中,每一個應(yīng)用程序都運(yùn)行在自己的進(jìn)程上,其由Dalvik虛擬機(jī)分配。Dalvik虛擬機(jī)是一種基于寄存器的Java虛擬機(jī),可執(zhí)行的文件格式為.dex 。Dalvik做了大量的內(nèi)存優(yōu)化,其在一些底層方面,Dalvik虛擬機(jī)需要依賴Linux內(nèi)核。)
??Linux 內(nèi)核層:整個安卓系統(tǒng)框架的最底層,其為Android設(shè)備各種硬件提供了驅(qū)動。同時其也為硬件與軟件打通了聯(lián)系。這里不過多解釋。所以說安卓是基于Linux的,因為其底層為Linux。
安卓四大核心組件:Activity+Service+BroadcastReceiver+ContentProvider
??我們了解安卓的系統(tǒng)框架之后,當(dāng)我們在開發(fā)安卓應(yīng)用時,我們要了解到其組成。Android的應(yīng)用程序通常是由一個或多個基本組件組成(不同與其他語言,安卓中并沒有常見的應(yīng)用程序入口,例如C\C++、Java中的main方法),組件可以是被調(diào)用的基本功能模塊。安卓程序利用組件實現(xiàn)程序內(nèi)部或程序之間的模塊調(diào)用來解決代碼復(fù)用的問題,這也是Android程序非常重要的特性。
??安卓程序中有4大核心組件:Activity(活動)、Service(服務(wù))、BroadcastReceiver(廣播接收者)、ContentProvider(內(nèi)容提供者)。
Activity
??Activity 是安卓中最基本的模塊,其為用戶操作提供一個可視化界面,在一個安卓程序中,可以包含一個或多個Activity 。Activity 是由 Android 系統(tǒng)進(jìn)行維護(hù)的,它有自己的生命周期。其后面再了解。
Service
??Service是服務(wù)意思,其沒有可視化的用戶界面,主要是在后臺運(yùn)行,其可以在后臺運(yùn)行很久很久,甚至當(dāng)App關(guān)閉掉時,Service依舊可以運(yùn)行。例如:用戶在做其它事情時可以在后臺播放歌曲,在下載視頻時可以切換致其它App,依舊可以下載。這就是服務(wù)的強(qiáng)大之處。(注意:服務(wù)不是線程.其運(yùn)行在主線程中。需要注意)
BroadcastReceiver
??BroadcastReceiver(廣播接收者)是一個專注于接收廣播通知消息,并對其做出相對應(yīng)的出來的組件。在安卓系統(tǒng)中,有著許許多多的廣播,例如系統(tǒng)開機(jī),系統(tǒng)將會發(fā)送一條廣播,電量過低,系統(tǒng)也就會發(fā)送一條廣播,網(wǎng)絡(luò)改變,電量變化等等。當(dāng)然自己的程序也可以發(fā)送廣播。一個Android應(yīng)用可以擁有任意數(shù)量的廣播接收器,以對所有它感興趣的通知信息予以響應(yīng)。BroadcastReceiver是沒有UI(圖形界面)的,我們通常需要NotificationManager來通知用戶。
ContentProvider
??ContentProvider(內(nèi)容提供者) 是 應(yīng)用程序之間共享數(shù)據(jù)的一種接口機(jī)制,它是一種更為高級的數(shù)據(jù)共享方法,可以指定需要共享的數(shù)據(jù),而其他應(yīng)用程序則可以在不知道數(shù)據(jù)來源、路徑的情況下,對共享數(shù)據(jù)進(jìn)行操作。
AndroidManifest.xml
??每一個Android 模塊都必須包含一個清單(Manifest)文件 AndroidManifest.xml。在安卓開發(fā) 開發(fā)前你需要了解的一些資料(一)已經(jīng)說明了一些常用的標(biāo)簽。為什么我們又要在這里提及呢?因為當(dāng)我們創(chuàng)建一個活動(Activity)、服務(wù)(Service)、內(nèi)容提供者(ContentProvider)都 必須 必須 必須 需要在清單文件中聲明!而廣播接受者(BroadcastReceiver)既可以在清單文件中聲明靜態(tài)注冊,也可以在代碼中進(jìn)行動態(tài)注冊。
組件大小單位
??在Android中UI組件其像素單位有:px(像素),in(英寸),mm(毫米),pt(磅,1/72英寸),dp(與設(shè)備無關(guān)的顯示單位),dip(就是dp),sp(用于設(shè)置字體大小)。其中,常用的有px、dp、sp。下面簡單介紹一下。
??在眾多的單位中,px是可顯示的最小的單位,其1dp就代表一個像素,其與物理設(shè)備的顯示屏有關(guān)。
??dp是一種與設(shè)備無關(guān)的顯示單位,其只與屏幕的尺寸有關(guān)。
? sp與dp原理是一樣的,當(dāng)手機(jī)系統(tǒng)設(shè)置的字體大小為普通字體大小時,sp和dp是一樣的。而當(dāng)字體大小設(shè)置為大字體時,sp所顯示的大小將會比dp大。
當(dāng)我們在設(shè)計UI時,最好除了文字大小使用sp單位,其他都使用dp單位。
另外,我們需要注意的是,在xml布局文件中,當(dāng)我們使用dp為單位時,我們?nèi)绻诖a中修改大小,我們需要轉(zhuǎn)換一下,因為 Android中用于設(shè)置大小的函數(shù)都以px為單位。所以我們得將dp值換為px值。
px,sp,dp互相轉(zhuǎn)換的推薦博客:px,sp,dp相互轉(zhuǎn)換
顏色
??在Android中,顏色值都是由透明度alpha和RGB(紅、綠、藍(lán))三原色所定義的,有八位十六進(jìn)制數(shù)和六位十六進(jìn)制數(shù)兩種編碼。例如八位編碼FFEEDDCC,F(xiàn)F表示透明度,EE表示紅色的濃度,DD表示綠色的濃度,CC表示藍(lán)色的濃度。而六位十六進(jìn)制數(shù)則自動省略了最開頭的兩位(表示透明度的)。需要注意的是:在XML文件中默認(rèn)是不透明的,而在代碼中,默認(rèn)是透明的。
??在安卓系統(tǒng)中,已定義12種顏色任開發(fā)者選擇。其具體的類型定義在Color類中??梢灾苯釉诖a中調(diào)用,而在xml文件中,顏色種類更多,使用"@android:color/顏色名"
| Color類中顏色 | 說明 | Color類中顏色 | 說明 |
|---|---|---|---|
| Color.BLACK | 黑色 | Color.WHITE | 白色 |
| Color.GREEN | 綠色 | Color.RED | 紅色 |
| Color.GRAY | 灰色 | Color.YELLOW | 黃色 |
| Color.BLUE | 藍(lán)色 | Color.DKGRAY | 深灰色 |
| Color.MAGENTA | 玫瑰紅 | Color.TRANSPARENT | 透明 |
??Color類顏色:

XML文件
??在前面中,我們多次提到xml。為了防止個別不懂,所以這里簡單介紹一下。XML指可擴(kuò)展標(biāo)記語言,被設(shè)計用于傳輸和存儲數(shù)據(jù)。其結(jié)構(gòu)大致上類似于HTML的標(biāo)簽一樣,由 尖括號 包圍關(guān)鍵字,例如<acitvity />,其具有一個開始標(biāo)簽和一個結(jié)束標(biāo)簽(必須包含結(jié)束標(biāo)簽),其中 被開始標(biāo)簽和結(jié)束標(biāo)簽所包圍的數(shù)據(jù)就是屬于該標(biāo)簽的數(shù)據(jù)。
? 例如:
<!--這是一個用戶信息-->
<user><!--根標(biāo)簽-->
<name type="Chinese">露西</name><!--姓名標(biāo)簽,其中type是姓名標(biāo)簽的屬性-->
<sex>女</sex><!--性別標(biāo)簽-->
<age>16</age><!--年齡標(biāo)簽-->
<remark type="Chinese" /> <!--備足標(biāo)簽,注意這里使用了結(jié)束標(biāo)簽另外一種形式-->
</user><!--user根標(biāo)簽的結(jié)束標(biāo)簽-->
<!--這是一個注釋-->
? XML的一些語法
所以的XML標(biāo)簽都必須要關(guān)閉標(biāo)簽
開始標(biāo)簽和結(jié)束標(biāo)簽對大小寫敏感,必須一致!
標(biāo)簽中嵌套其它元素必須要正確的嵌套,錯誤示范:<user><name> 劉某某 <user><name> 。
XML文檔必須要具有根標(biāo)簽,也就是說,必要要有一個元素是所有元素的父元素。錯誤示范:<name></name><sex></sex> (存在了兩個根標(biāo)簽:name和sex。必須使用一個標(biāo)簽包裹他們才行。)
XML中的屬性值必須加引號進(jìn)去區(qū)分:錯誤示范 <name type=Chinese />(錯誤,type屬性的值沒有加引號)
-
在XML中,某些字符具有特殊意義,例如
<。其無法判斷是開始標(biāo)簽還是值,所以當(dāng)我們在使用<作為值時,需要使用<代替。在XML中,有5個預(yù)定義的實體引用:引用 符號 說明 << 小于 >> 大于 && 和號 '’ 單引號 "” 雙引號
- 在XML中,空格也會保留。
編寫安卓的Hello World(不使用模板)
??=-=簡書里面不能放視頻 ?!?。。?!哎,算了。還是使用截圖吧。
第一步:新建一個項目


第二步:不選擇模板

第三步:添加項目名以及包名等信息(我選擇的是Java,根據(jù)自己情況填寫)

第四步:等待同步完成

第五步:在項目開發(fā)資源文件中創(chuàng)建Acitvity布局文件

或者自己在res目錄中創(chuàng)建layout文件夾。然后再創(chuàng)建一個xml文件。然后在包中創(chuàng)造活動的實體類。也是一樣的。(偷一下懶,這個重點不是在這。)

下面是一些注釋。注意。


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><!--意圖過濾節(jié)點 :只有符合該元素的才能啟動活動-->
<!--指明在App啟動時,啟動該活動-->
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
第七步:運(yùn)行即可

后話
安卓的應(yīng)用程序由各個組件組成。其中安卓的四大核心組件是我們必須所掌握的。
而在編寫第一個Hello World時,推薦自己去配置清單文件。再多說一句:當(dāng)我們創(chuàng)建一個活動(Activity)、服務(wù)(Service)、內(nèi)容提供者(ContentProvider)都 必須 必須 必須 需要在清單文件中聲明!而廣播接受者(BroadcastReceiver)既可以在清單文件中聲明靜態(tài)注冊,也可以在代碼中進(jìn)行動態(tài)注冊。