同學們好!歡迎大家觀看《跟陶叔學編程》系列節目,這是第一季《零基礎學習Android開發》。在課程內容開始之前,先給同學們介紹一下這個課程的定位。
受眾群體:以非計算機專業零基礎大學生與社會上編程愛好者為主體,兼顧對編程感興趣的初、高中生。如果以前做過一些編程,但是對編程的相關知識還一知半解的,也可以通過個課程進行系統的學習。這個課程不是針對編程競賽的輔導,是對應用軟件編程的基礎教學,是為了幫助編程愛好者能夠開始實踐做出自己想要的東西。
本課程真正地面向零基礎:
- 沒有學習過編程語言。我會完整地講解Java語言的基本概念與用法。
- 沒有接觸過編程開發。我會講解一些計算機基本概念與原理,理清編程與計算機相關知識的關係,幫助打好開發的知識基礎。
- 沒有使用過編程工具。我會介紹集成開發環境的用法與使用經驗,並介紹開發中一些實用工具的使用方法,還提供一些基本的開發組織管理經驗。
學習目標:掌握編程基礎知識與語言用法,瞭解安卓APP開發相關工具與流程,掌握編程相關知識的學習方法以便今後自學提高,明白編程進階方向與路徑為提升層次打好基礎。
學習內容:Java語言基礎學習與使用,Android Studio開發工具及JDK與Android SDK使用,主流開放平臺開發,面向對象思想與重構實踐,版本管理工具使用,學習資源介紹與工具使用。
教學方法:面向問題,實用為先。很多同學在學習編程的過程中可能會被其中海量的知識點嚇到,動不動就來個英文縮寫,什麼API、SDK、XML、IDE之類的,看起來高深莫測的樣子。要掌握這麼多編程的相關知識,我們要有一個乾淨利落的切入角度。首先,我要問同學們一個問題:什麼是知識?知識就是解決問題辦法的總結。同學們接觸到的所有知識都是為了解決某個問題才出現的,你知道了那個問題,明白了別人解決問題的思路,這個解決辦法也就掌握了。很多同學陷入知識的海洋弄得雲裡霧裡辨不清方向,就是因為不知道這些個知識是幹嘛用的,不知道它們是為解決什麼問題而出現的。而計算機技術裡的很多知識更是這樣,為了解決問題而出現,出現就是一大串。你不知道它要解決什麼問題,就等著被繞暈吧。所以我會在講課的過程中把編程中遇到的問題指出來,再告訴你這個問題是怎麼解決的,而這個解決的辦法就是所謂的“知識點”。我會替同學們解答“靈魂三問”:
這有什麼用?這該怎麼用?怎麼更好用?有的同學會說了,一般最先提出的問題應該是:這是什麼鬼?也就是應該靈魂四問:這是什麼鬼?這有什麼用?這該怎麼用?怎麼更好用?但是從我的經驗總結,這是什麼鬼其實一兩句話就說清楚了,基本上所有人也都能夠理解。反倒是這有什麼用最讓大家煩惱,也是它最讓人失去學習的興趣。沒什麼用的知識,對大多數人來說天然就沒有吸引力。所有,我就精簡一下,就是靈魂三問。
同時我講課不會先把一堆概念進行統一的灌輸,而是從開發實例出發:因為我們要做個什麼功能,然後我遇到了什麼問題,通過解決這個問題,之後我們會掌握哪些知識。我不會在課程中堆砌沒用的概念,而是圍繞編程的實際需要給大家指出面臨的問題、揭示解決問題的思路、理解前人提供給我們的知識。這個課程不可能覆蓋編程中所有的知識,但只要大家掌握了這種學習的方法——面向問題的學習方法,今後的學習與工作中接觸到新知識的時候,馬上意識到這是某種問題的解決辦法,並且從問題切入,相信很快就能把新知識理解並加以運用。
總之,這個課程針對實戰編程與主流開發方式,讓同學們課程學習之後基本掌握編程,能夠實現一些自己的需求。本課程定位為什麼沒有針對高考加分的競賽編程學習?因為一來能夠靠競賽成功的畢竟是極少數,二來通過這些年來軟件開發創新實踐,可以發現最重要的是應用方面的需求,如果能夠提出一種創新的應用模式,也就是提出一種廣泛的新需求,並將其通過軟件編程進行實現,是能夠推進社會快速發展的。當然,新需求的實現也離不開底層複雜算法的支持。但是底層算法相對會穩定一些,而做需求的可以量很大很活躍。這樣就像大海一樣,海面上波濤翻滾,海面下就比較安靜。而大量的需求的不斷試錯,將可以最終優勝劣汰出來更多偉大的軟件產品。而我們通過本系列課程的學習,就是希望同學們獲得利用軟件來發明創造的能力,讓你們能把自己的好想法用編程表達出來,而且這種編程是基本符合軟件開發規律的也就是基本具備一定可行性的。說不定哪天新的偉大的軟件就是在你們的手中產生的。另一方面,即使大家成不了比爾.蓋茨、扎克伯格、雷軍這樣的軟件大牛,我也希望同學們通過編程的學習開拓思路,增加看問題的新角度,或者為今後的職業選擇打下一些實用的基礎。
一、淺談編程
1. 編程概念
先了解編程的概念。百度百科上的定義是:編程,就是讓計算機代為解決某個問題,對某個計算體系規定一定的運算方式,使計算體系按照該計算方式運行,並最終得到相應結果的過程。
為了使計算機能夠理解人的意圖,人類就必須將需解決的問題的思路、方法和手段通過計算機能夠理解的形式告訴計算機,使得計算機能夠根據人的指令一步一步去工作,完成某種特定的任務。這種人和計算體系之間交流的過程就是編程。
從這個定義中可以看出編程是人與計算機的交流方式,交流的目的是調用計算機的資源,這些資源包括顯示、聲音播放、計算、存儲、數據庫、網絡通信等。為了讓計算機能夠理解,必須使用編程語言。
2. 編程語言
編程語言大家可能聽過很多,包括彙編語言、C/C++、Pascal、Basic、C#、Java、JavaScript、Python、ASP、PHP等,還有HTML、XML、SQL等。這些語言使用的都是英語,使用中文的編程語言有易語言。甚至有使用文言文的編程語言,名字就叫“文言編程語言”(wenyan-lang)。這是2019年底出現的。2019年還有個“木蘭”語言鬧了笑話的,這是有人把Python套了個皮結果被人揭發了。編程語言可以分為低級語言與高級語言,這裡的高低不是指語言的好壞,而是指語言距離機器的遠近,距離機器近的是低級,反之就是高級。
這裡先說彙編語言。彙編是最接近機器的語言,同學們可能聽說過CPU的指令集。彙編就是直接使用的CPU指令集,在調用指令之前將數據在存儲器中準備好,指令傳給CPU進行運算後,獲得數據決定如何使用,就是彙編語言的基本使用邏輯。
而指令如何傳輸給CPU的,玩過芯片的同學可以很快理解。芯片的針腳很多,分為輸入與輸出(也有的兼做輸入與輸出),在輸入針腳給出要運算的數據與指令的序號後,運算完成後輸出針腳就可以獲得結果。而這些數字結果可能被用於下一步的繼續運算,也可能輸出到輸出設備如顯示器、音箱等,最終向我們呈現出來。
我們一般接觸到語言除了彙編之外的都是高級語言。高級語言中加入了複雜的組織形式,目的是為了接近人類的思考方式,方便開發者使用。當我們用高級語言編寫完程序之後,這些程序都需要被“翻譯”成彙編語言,因為機器只能理解彙編語言。這個過程就叫做“編譯”,英文叫compile。(更準確地說機器只能理解機器碼,也就是數字序列,但是彙編與指令是一一對應關係,這麼說問題也不大)
3. 平臺(Platform)
高級語言為了讓開發者使用更方便,對語言內容進行了豐富,加入了更多邏輯內容。對應地,計算機的資源也不能再像彙編編程時那樣直接了,這些資源被“封裝”起來,封裝的原則是把一些固定在一起的指令組織在一起,成為被高級語言調用的接口,這類接口就是API,Application Programming Interface,即“應用程序編程接口”。而提供這些API的基礎性軟件稱為“平臺”,英文是platform。
平臺可以是操作系統如Windows、ios、Android、Linux、Unix、鴻蒙等,也可以是網絡服務器如ASP服務器、PHP服務器、tomcat服務器等,還可以是互聯網服務開放平臺如微信小程序/小遊戲開放平臺、地圖開放平臺、翻譯開放平臺等。
【說到這裡,我要多說幾句。在我開始學編程的時候,所有的編程相關的資源都是來自歐美的,語言啊、平臺啊、開發工具啊,都是。但是這些年中國自己的資源越來越多了,像騰訊、阿里,還有華為都提供了開放平臺以及相關工具。大家可以從這裡看到國家的進步。可是有人會說國產的很多東西根上是還是源自歐美的某個開源項目,算不得我們的原創產品。這個問題我是這麼看的。本來人類的技術進步就是在共同的基礎上進行發展,如果已經有了一個基礎自己還非要另搞一套,不僅是浪費在思維上也是幼稚的表現。以後同學們在自己編程的時候也要有這麼一個意識,想實現什麼功能,先到網上搜一下是否已經有了這個功能實現的代碼。如果有了就直接拿過來,不需要自己從頭搞一套。所謂“天下文章一大抄”,編程跟寫文章是差不多的,能抄費那勁自己寫幹什麼?有的同學會說知識產權保護,還有打官司什麼的。你去抄那種別人願意讓你抄的不就完了嗎?程序員其實是一個悶騷的團體,他們普遍都喜歡顯擺自己做出來的東西,如果你用了他的東西並且誇他幾句,他會有極大的滿足。網上共享的免費資源其實是很多的,大家只要記住動手之前先搜索一下,省得去做無用功就行了。另一個角度,可以發現,之所以出現這些國產的開放平臺,一方面是國內的技術公司認識到了開放的必要性,希望吸引到開發者為他們豐富平臺上的應用。另一方面,經過這麼多年的發展,我們在軟件技術的應用上佔領了一定的優勢,我們國家創造出了一些領先的軟件需求,這些需求拉動了消費,讓這些公司賺到了錢,不然他們也沒有動力去做開放平臺這些工作。因此前面我說到了發現或創造需求是很重要的,如果哪天因為某個新應用軟件的出現,又會開創出一個新的行業。我在做這個課程的時間,華為的鴻蒙已經公佈,但還沒有開放給普通開發者。如果鴻蒙能夠成功,這應該是國內的軟件行業的一個跨時代的重要事件。對華為的鴻蒙有很多質疑的聲音,有善意的也有惡意的。我希望同學們對鴻蒙熱情關注,保持樂觀。學習技術要有一種開放的心態,對新生事物不要動不動就抗拒。不要使自己有一種“既得利益者”的心態,覺得新東西會威脅自己,也不要有一種“買辦”心態,對自己國家的技術發展抵制或者鄙視。雖然國內的ICT行業,也就是Information and Communication Technology信息與通信技術行業(在我開始學編程的時候還是叫IT行業,現在把通信也加進去了),在發展的過程中曾經出現過不好的事,但要相信瑕不掩瑜,也要自信我們能夠越做越好。而自信的底子就是我們在先進的需求領域是有優勢的,新的需求會帶動創新發展,給整個行業帶來動力。】
好了,轉回來說平臺。還有一些應用軟件,因為提供了編程擴展功能,也可以納入平臺的概念。如Windows Office的Word、PPT、Excel,以及3D製作軟件3DMax、流媒體軟件Flash等都提供編程接口,甚至有專用的編程語言。
跨平臺能力
給大家介紹了這麼多種平臺,我們在開發中最常用的還是操作系統平臺。而這些操作系統平臺每個提供的API都是不同的,甚至不同操作系統的API調用時需要準備的數據的格式都是不同的。這就造成了為一平臺上開發的軟件在另一個平臺上無法運行,比如為Linux開發的程序不能在Windows上運行。
解決這個問題有兩種思路。一種是用虛擬機,在一種操作系統上用軟件模擬另一種操作系統的環境,這樣就可以運行另一種操作系統的程序。另一種思路則是用通用平臺代替底層的操作系統平臺,編程時只使用通用平臺的API,程序運行的時候是處在通用平臺的環境中,並將對通用平臺的API翻譯成對底層操作系統的調用,這種運行過程被稱為“解釋運行”。
按照第二種思路出現了提供“跨平臺開發”能力的平臺,Java2平臺就是典型的提供“跨平臺開發”能力的平臺,它分為J2SE、J2EE、J2ME三個版本,其專用的語言就是Java語言。
4. SDK(軟件開發工具包)
上面我們瞭解到了編程實際上就是用編程語言調用各種平臺提供的API,也瞭解了各種能提供API的平臺,那是否編程語言就直接使用平臺的API呢?答案是否定的。舉例來說,我們要開發Windows程序,可以用C語言,也可以用Pascal語言,還可以Basic語言,而這些語言的語法是不同的,調用API時的格式也是各不相同的,這就需要一個專門的工具去做這個事,這個工具就是SDK,全稱是Software Development Kit,即“軟件開發工具包”。SDK除了完成剛才所說的對API的組織與“翻譯”工作(術語稱為“封裝”,Encapsulation),還提供豐富的常用代碼集合,稱為“庫”,英文為library,縮寫為lib。編程時通過使用庫裡的代碼就可以直接利用前人的工作成果,節省很多的工作量(當然我們也可以製作自己的庫,積累起來為今後的工作提高效率)。此外SDK還提供了很多的開發工具,其中很重要的是編譯器,前面提到了“編譯”的概念,而編譯器則是完成這個工作的專門軟件。我們在使用Java語言編程時,需要用到Java SDK,它的名稱進行了簡化,直接叫JDK。
5. IDE(集成開發環境)
有的同學可能看到過編程的過程,覺得編譯不就是按一下開發工具上的“編譯”按鈕就完成了嗎?跟SDK裡的編譯器有什麼關係?其實你們看到的比較酷炫的開發工具,它的名稱叫做IDE,全稱是Integrated Development Environment,即集成開發環境。它只是將與編程相關的許多工具整合到了一起,給開發者節省了許多配置的時間。IDE的功能主要是3個。一是代碼編輯。這個功能實際上用最簡單的記事本也可以完成,只是缺少很多輔助功能,對開發者的要求會很高。二是編譯與構建。編譯前面說了,構建就是把代碼與使用的資源進行連接,打包成可運行的文件。三是調試。調試是在一個受監控的環境下讓程序運行,這樣就可以隨時觀察程序是否按照預想在運行。後面的2個功能其實都是由SDK提供的,IDE只是把這些工具集合在一起而已。常用的開發工具是Eclipse、Visual Studio .net,這是通用IDE進行配置後可以開發多種平臺多種語言的項目,還有專門的開發工具PyCharm(這是開發Python項目的)、Android Studio(這是專門開發Android項目的,我們的課程就使用它),微信小程序也提供了專用的IDE叫微信開發者工具。
到這裡,我們小結一下。我們接觸了編程的定義,知道了編程是人機交互的方式,人們通過編程語言去指揮計算機進行運算,調用計算機的資源。而計算機的資源是通過API來提供的,整合API的是平臺,為了方便語言使用API,我們要用SDK。我們平常編程用的開發工具是IDE等等。同學們對這些術語不要心裡犯怵,也不要強現在就記住,以後接觸多了自然就理解並記住了。另外,我要給同學們一個建議,要學好編程必須要學好英文。因為大部分資料的原版是英文,雖然有很多漢化的資料,但是在翻譯上往往存在術語不一致的問題反倒耽誤時間。隨著我國的發展,我也曾經想到是不是以後就不用學英文了,畢竟現在AI翻譯也做得不錯了,但是技術的完善還是有比較長的時間。中國人會英語其實也是一種優勢,聽過關於以前中美談判的故事,因為中國代表團的人基本都會英語,美國人私下嘀咕什麼中國人都能知道。可中國人私底下說什麼,美國人要知道就費勁了。為了防中國聽到,美國人都要跑到女廁所去,男的也去。還有一點,其實編程的英語沒有那麼難,同學們接觸多了發現說來說去就是那些單詞,還是比較好學的。
二、第一個Android程序
1. 編程環境準備
好了,通過前面的介紹,我們對編程有了一個整體的瞭解,現在要開始實際的編程了。本課程使用主流的編程語言Java,針對現在應用最廣泛的Android平臺編寫軟件,開發工具用的是Android Studio,使用的開發用電腦上操作系統是Windows 10。同學們編程實踐我多了以後,不排除會涉及其它語言與平臺,但實際上各種語言各種平臺是相通的,基本概念都差不多。同學們把一種語言一種平臺的基礎打好,腦子裡有了知識的框架結構,就可以憑這個結構去找對應的知識點,這樣學新東西上手就很快了。
我們先下載IDE,網址是https://developer.android.google.cn/studio。下載完成後進行安裝。安裝時不用進行配置調整,一路Next就可以了。
因為這是一個集成的開發環境,它把開發時需要的很多工具都一起安裝了。因為我們是對Android平臺進行開發,所以我們需要安裝Android SDK。這個已經自動安裝了。又因為我們是用的Java語言,我們需要安裝Java SDK,即JDK。但是Android Studio裝的是一個精簡版本,即JRE,Java Runtime Environment,即Java運行時。
2. 第一個程序Hello World!
在編程環境準備好之後,我們終於要開始第一次編程了。一般學習編程的第一個程序都是Hello World,因為這個程序既簡單,又能給學習者直觀的印象,還可以引入許多相關知識點。可以說Hello World對每個程序員的印象都是深入骨髓的,就像學英語的人對李雷、韓梅梅的印象一樣。有一個關於程序員的笑話,說的是程序員學書法,他拿著毛筆蘸飽了墨舔好了筆,揮毫寫下了第一幅字:Hello World!
創建項目
我們現在開始做一個Android的Hello World。打開Android Studio(以後我們可以簡稱為AS,也可以用IDE來稱呼它,因為我們的課程不會用別的IDE),因為我們沒有創建任何項目(Android的開發文件用項目Project來進行管理),可以看到Welcom界面:
點擊Start a new Android Studio project,彈出Create New Project對話框:
對話框要求你選擇一個項目模板,選擇“Empty Activity”(這個模板上只有一個文本,沒有別的內容)後點擊“Next”按鈕:
在Name部分將項目取名為“Hellow World”,點擊“Finish”按鈕,項目創建完成,進入IDE主界面:
默認的界面字體比較小,我們可以選擇File>Setting...,找到Editor下的Font進行調整。我習慣的是字體選擇Courier New,大小為20:
認識AS界面
我們回到AS主界面,可以看到主界面由3個部分組成,分別是編輯器、左右邊顯示為標籤的多個工具窗口、下邊的信息輸出窗口。
編輯器就是我們平常敲代碼的地方。AS會提供很多輔助功能,在我們敲代碼時給各種提示、幫助添加引用、自動生成代碼、自動調整格式等。
工具窗口能顯示很多項目的信息,也提供配置的便捷入口。最常用工具窗口是項目窗口,默認在左邊打開的就是它。在這裡可以找到我們要編輯的各種文件。它有幾種不同的顯示形式,默認的是Android。
輸出窗口會給出項目構建、運行、調試時的很多有用的信息。工具窗口與輸出窗口都可以點擊“-”將其隱藏。雙擊編輯器上方的標籤可以獲得最大的編輯界面,再次雙擊就可恢復。
IDE會給編程提供很多方便,不需要我們從零開始去搭建項目。因此我們創建的這個Empty的項目其實並不是什麼都沒有,它已經有了完整的結構。我們在左邊的項目工具窗口中點擊打開app>java文件夾,可以看到有3個文件夾,後面2個文件夾是測試用的,現在先不用管它們,第一個文件中的MainActivity就是代碼文件,也是程序的主入口。在下面的res>layout文件夾的activity_main.xml,點開它會發現我們熟悉的程序的界面。
這個文件就是界面佈局文件。在編輯器裡它有3種視圖,一種是Design,即設計視圖,另一種是Text,即文本視圖,還有一種設計與文本對照這幅圖。
在文本視圖裡我們可以看出來,界面實際上是用標記語言來定義的,這裡自動生成了一個TextView的標記,它在界面上顯示為一個文本。它的android:text部分的內容自動生成的就是“Hello World!”,我們在設計視圖看到的文字,就是由這個標記來規定的。
因為IDE給我們做了很多工作,所以現在這個Hello World項目本身已經是個完整的程序,我們可以直接運行它。點擊工具欄上綠色的三角形Run 'app'。這時會出現一個提示:Error running 'app': No target device found. 這是因為Android的程序需要運行在手機的Android系統上,而我們編程所用的PC上是沒有Android運行環境的,這就需要使用虛擬機來提供一個模擬手機的運行環境。我們先要配置一個Android虛擬機,選擇菜單Tools>AVD Manager(AVD就是Android Virtual Device,安卓虛擬機):
點擊Create Virtual Device...:
可以看到各種設備的列表,我們在Phone中選擇一個手機類型,比如選擇Pixel 2,這個虛擬機不會佔用太大的PC資源,速度相對快一些。點擊Next。
這個對話框是選擇操作系統的鏡像文件,默認的是當前最新的Android系統版本,不用改它。點擊Next,在最後一個確認對話框中點擊Finish即完成虛擬機的配置。
我們再次點擊工具欄Run按鈕。這裡有的同學的機器可能出現一個提示,要求你打開BIOS的Secure Virtual Machine開關,這需要你重啟計算機進入BIOS進行設置。同學們可以在網上找一下相關介紹自行操作,這裡就不多做介紹了。虛擬機啟動後,程序被拷貝過去安裝並開始運行。效果如圖所示:
同學們可以看到這個程序很簡單,就是在界面上顯示了一行Hellow World!。但是簡單歸簡單,這是第一單。從這一刻開始,同學們已經完成了第一個Android程序了,恭喜!
這次課雖然大家一行代碼也沒有敲,但是我們還是學到了許多重要的基礎知識點,這裡總結如下:
- 計算機語言是人們用來調用計算機資源的媒介,語言分為高級語言與低級語言,低級語言更接近機器,高級語言更接近人類思維。
- 計算機資源被不同的平臺進行了組織,並以API的形式提供出來,供計算機語言進行調用。在平臺與各種語言之間還有SDK進行銜接工作。
- IDE是我們開發時直接用到的工具,它集成了許多工具,使得編程的效率有了很大提高。使用IDE也使得編程的底層複雜性對開發者屏蔽,讓開發者專注於功能的實現。
- Android的官方開發IDE是Android Studio,一般使用Java語言進行編程。
閱讀更多 跟陶叔學編程 的文章