你正在一條熟悉的路上慢跑,突然被一個念頭擊中——下一款殺手級的移動應用。一路上你甚至不再關心時間,只想讓你的想法立即變為現實。但究竟如何下手呢?你還不是一名程序員,要想成為程序員,也得需要幾年的時間,而時間就是金錢,而且......甚至,有人可能已經把它做出來了。就這樣,你的設想胎死腹中了。
現在想象一個不同的世界,在那里,創建應用無需多年的編程經驗,藝術家、科學家、人道主義者、衛生保健工作者、律師、消防員、馬拉松運動員、足球教練,以及社會各界人士都可以自己創建應用。想象一下,在這個世界里,不必雇用程序員,就可以將想法轉化為應用的原型;你可以創建自己專屬的應用,利用移動計算技術來滿足你個人的需求。
這就是App Inventor的世界,谷歌公司的新型可視化編程工具,用于構建移動應用。事實證明,基于可視“塊”語言的編程方法,即便是對孩子來說,也是成功的。App Inventor大大降低了為Android手機和設備開發應用的門檻。想象一下,視頻游戲里的角色變成你和你的朋友;或者一款“買牛奶”的應用,當你在下午3點以后路過某個超市時,它會提醒你;或者一款測驗應用,其實是一種別出心裁的求婚形式,發給你的另一半“問題4:你愿意嫁給我嗎?如果愿意,按下按鈕發送短信。”真的有人用這種App Inventor應用來求婚,而對方居然說是!
## **移動電話專用的塊語言**
App Inventor是一個可視化,可拖拽的編程工具,用于在Android平臺上構建移動應用。利用基于web的圖形化的用戶界面生成器,可以設計應用的用戶界面(外觀),然后像玩拼圖玩具一樣,將“塊”語言拼在一起,來定義應用的行為。
插圖0-1顯示了一款應用的早期版本中使用的塊語言,創作者Daniel Finnegan是一名從未學過編程的大學生。你能說出這個應用的功能嗎?

**圖 0-1 用App Inventor塊語言來定義應用的功能**
這是一款短信“應答機”應用。開車時啟動它,就可以對收到的短信進行自動回復。
可以看到,比起傳統的程序代碼,這些塊語言更易于理解,因此你立即受到吸引,結合自己的實際經驗,你可能會問:能不能把收到的短信大聲讀出來?我可以定制我的回復嗎?我能否建一個應用,像“美國偶像”那樣,讓人們用短信來投票?以上所有問題的答案都是肯定的。這本書將要告訴你怎樣做到。
## **用App Inventor做什么?**
### **玩**
為手機寫應用充滿了樂趣,而App Inventor更增加了探索和發現的樂趣。只需在Web瀏覽器中打開App Inventor,連上手機,并像圖0-1中那樣把一些塊拼在一起,立即就能在手機上看到你的應用,并與之交互了。于是你開始編程,你會發郵件給朋友們,讓他們發短信來測試你的應用;或者用剛寫好的應用來控制一個LEGO NXT機器人;再或者拔下手機,走到戶外,去驗證一下應用中是否正確地使用了位置傳感器。
### **建立原型**
對應用有想法了,是嗎?快速地創建一個原型,而不是隨手記在餐巾紙上,或干脆讓它隨風飄散。原型是想法的模型,不夠完整,也不夠精致。用文字來表達一個想法,就像寫一篇散文給朋友或愛人;而建一個App Inventor的原型,就像寫首詩歌給風險投資人。這樣一來,對于移動應用的開發來說,App Inventor就像一張電子餐巾紙。
### **構建個性化應用**
在當前的移動應用世界里,我們被迫接受那些推送過來的應用。你沒抱怨過嗎?我們期待個性化的應用,或者至少讓我們能夠調整它的功能。使用App Inventor,可以創建貼近自己需求的應用。例如,第三章的MoleMash(打地鼠)游戲中,有一個隨機移動的地鼠,每次觸碰到它都可以得分,你可以把地鼠的形象替換成你喜歡的,比如你兄弟姐妹的照片,而不必在乎別人是否喜歡;第八章的測驗應用,詢問與美國總統有關的問題,但你可以輕松地修改問題,任何話題都可以,從你最喜愛的音樂到家族史。
### **開發完整的應用**
App Inventor不只是一個原型系統或界面設計器,也可以用于創建各類完整的應用。它所使用的塊語言提供了所有基礎的編程指令,如循環及條件,只是以“塊”的方式來呈現。
### **教學**
無論你是中學生還是大學生,App Inventor都是一個偉大的教學工具。它的偉大不僅僅是對計算機科學而言,對與數學、物理、創業以及幾乎任何其他學科來說,它都是一個了不起的工具。重要的是在創造中學習,而不是死記公式,例如,你創建了一個尋找最近醫院(或商場)的應用;又比如,用馬丁?路德?金和馬爾科姆?X的視頻或演講片段來創建一個多媒體測驗應用,遠比寫一段黑人歷史的文章來得生動。我們堅信App Inventor以及本書將成為你學習中貫穿始終的偉大工具。
## **為什么要用App Inventor**
很多人說App Inventor之所以易用,是因為它可視化的操作界面,以及可拖拽的塊語言。但這究竟意味著什么呢?為什么App Inventor會易于使用?
### **無需記憶并輸入指令**
對于新手來說,編程最大的挫折在于兩點,一是要輸入代碼,二是面對計算機彈出的令人費解的錯誤消息。這種挫折讓很多初學者來不及體會解決邏輯性問題的樂趣,就中途放棄了。
### **你有多種選擇的可能性**
在App Inventor中,組件和塊被分門別類地放在不同的抽屜中,觸手可得。編程的過程,就是找到這些塊,并把它們拖到程序中,來實現你預設的功能,無需記住那些指令或查閱手冊。
### **限定塊之間的匹配**
與那些挫敗程序員的神秘的錯誤信息相比,App Inventor的塊語言從一開始就排出了很多犯錯的機會。例如,某功能塊要求輸入數字,就無法輸入文字。這雖然不能消除所有的錯誤,但肯定是有幫助的。
### **直接處理事件**
使用傳統編程語言時,程序的執行就像照著菜譜做菜一樣,是順序執行一系列的指令。但使用圖形界面的應用,特別是移動應用,事件可能隨時發生(例如,接收短信或電話),多數程序都不采用菜譜的形式,取而代之的是對事件的處理。事件處理程序的工作方式是:“當某事件發生時,程序要做這件事。”在傳統的語言如Java中,你要了解類、對象,以及一種叫做偵聽器的特殊對象,每個偵聽器代表一個事件。在App Inventor中,用“when”塊來表示事件,像“當用戶點擊按鈕...”或“當收到短信時...”這樣的事件。
## **你可以創建怎樣的應用?**
用App Inventor可以創建各種不同類型的應用。發揮你的想象力,就可以創建出各種既有趣又實用的應用。
### **游戲**
人們往往從簡單的應用開始,像第3章的“打地鼠”游戲,或第2章的在朋友臉上繪畫的應用。隨著不斷進步,可以開始按照自己的想法做一些更復雜的游戲,如吃豆人與太空侵略者等。你甚至可以使用手機的傳感器,通過傾斜手機讓游戲中的角色移動(第5章)。
### **教育軟件**
App Inventor不僅限于制作簡單的游戲,也可用于創建信息和教育類應用。第8章的“測驗”應用可以幫助學生們在考試前更好地復習,第10章的“出題”應用,允許用戶為自己出一份考卷(想想那些長途旅行的家長們會多么喜歡這個應用!)。
### **位置感知應用**
因為App Inventor提供了訪問GPS位置傳感器的功能,因此可以構建一個定位應用——知道自己在哪兒;也可以建一個停車應用,幫你記住停車位置(第7章);或者一個找人應用,在音樂會或大型會議時,顯示你的朋友或同事的位置;或者一個定制的游覽應用,為你所在學校、工作場所或博物館預置游覽路線。
### **高科技應用**
您可以創建以下應用:掃描條碼、交談、傾聽(文字識別)、播放音樂、制作音樂(第9章)、播放視頻、檢測手機的方向和加速度、拍照以及撥打電話。從技術上講,智能手機就像一把瑞士軍刀,并且谷歌的工程師們一直致力于讓App Inventor的技術更易于掌握。
### **短信息應用**
“開車不發短信”(第4章)只一個短信處理類應用的簡單案例,還可以編寫應用,定時向親友們發送“想念你”一類的問候,或像“廣播中心”(第11章)那樣的應用,幫助協調大型活動。需要這樣的應用嗎?讓你的朋友用短信來投票,就像“美國偶像”節目那樣。這些應用都可以用App Inventor來完成。
### **控制機器人的應用**
第12章展示了如何創建應用來充當LEGO機器人的控制器。把手機當做遙控器,或者為機器人編寫一個“大腦”伴隨它到處游走。機器人與手機之間依靠藍牙通信,App Inventor的藍牙組件也可以創建類似的應用,來控制其他的藍牙設備。
### **復雜應用**
App Inventor大大降低了編程的門檻,幾小時內就可以創建出很炫的高科技應用,但這門語言的功能并不簡單,它同樣提供了循環、條件以及其它程序及邏輯結構,來實現邏輯較為復雜的應用。在嘗試創建應用的過程中,你會驚奇地發現這些邏輯問題是多么的有趣。
### **基于web的應用**
App Inventor也提供了應用與Web之間的通信手段。可以寫一個應用從Twitter或RSS訂閱上抓取數據,或者打開亞馬遜書店的Web頁面,通過掃描條碼來查詢一本書的線上價格。
## **什么人能夠創建應用?**
App Inventor免費提供給任何人使用。它在線運行(不是桌面程序),可以在任何瀏覽器中訪問。你甚至不需要手機:內置的Android模擬器可用于應用的測試。截至2011年1月,App Inventor已經擁有了幾萬個活躍用戶以及幾十萬個應用。
是誰創建了這些應用?他們是程序員嗎?有些人是,但大多數人不是。其中最有說服力的例子是David Wolber教授的一門課程。Wolber教授是本書的作者之一。在舊金山大學(USF),App Inventor是計算機科學通識課的一部分,主要針對商務和人文學院的學生。許多參加這門課的學生對數學是既恨又怕,而這門課恰恰滿足了學生們懼怕數學的核心需求,絕大多數學生連做夢也沒想到他們會編寫計算機程序。
盡管毫無經驗可言,但學生們依然學會了App Inventor并成功地創建了偉大的應用。英語專業的學生首創了“開車不發短信”應用;兩個通信專業的學生創建了“Android,我的車在哪兒?”;而一個國際研究專業的學生創建了“廣播中心”應用(第11章)。有一天晚上,在下班后,一個藝術專業的學生去敲Wolber教授辦公室的門,詢問怎么寫一個while循環,此時此刻他意識到,App Inventor已經極大地改變了技術的格局。
媒體也開始關注這一意義非凡的變化。《紐約時報》稱App Inventor為“DIY應用創建軟件”;《舊金山大學記事》撰文報到了USF學生們的工作:“Google讓大正成為應用的生產者”。《無線》雜志描寫了Daniel Finnegan——“開車不發短信”的作者,并寫到“Finnegan的故事有力地說明:編程普及的時代正在來臨。”
如他們所說,這只貓已經跳出來(第一章應用里有一只小貓)。現在App Inventor已經在高中開課;在“挑戰技術創新”的課后項目中(面向舊金山灣區的高中女生),在西雅圖湖畔學校,以及幾所大學的入門課上,都有App Inventor的一席之地。有數千名愛好者、商人、婚介人以及能工巧匠們正漫游在App Inventor的網站和論壇上([http://appinventor.googlelabs.com/forum/](http://appinventor.googlelabs.com/forum/))。想要開始行動嗎?不必擁有編程經驗!
## **本書中使用的慣例**
本書采用了如下的通用慣例:
粗體綠色文本:代表程序塊
斜體:表示email地址、URL地址、文件名、路徑名,強調首次出現的術語。
等寬字體:表示Python代碼,組件、屬性、變量及函數的名稱。
 這個圖標表示:測試環節以及測試說明。
 這個圖標表示:提示、建議或一般性注釋。
## **如何使用本書**
本書可作為初高中及大學課程的教科書,或有志向的開發者的入門書。全書分為兩部分:第一部分是一整套創建具體應用的教程,第二部分是App Inventor指南(手冊),后者的編排更像是一部經典的編程教科書。隨著學習的不斷深入,教程的復雜性也在增加,從第一章的“Hello,貓咪!”——每次點擊都讓小貓發出叫聲,到一個支持Web的應用:通過掃描書上的條碼,就可以從Amazon Web Service上獲得相關信息(第13章)。
從理論上將,最好是按教程的順序來學習,但如果你覺得很輕松,那么也可以跳著看。本教程手把手地教你創建應用的每一個具體步驟,并提供塊語言的截圖來幫助理解,你還可以參考App Inventor指南部分的章節,將有助于鞏固對概念的理解。
手頭最好有本參考書,因為App Inventor的開發環境占滿了電腦屏幕,留給顯示教程的空間極其有限。我們設想人們將書放在手邊,并跟隨教程完成每個應用的學習和創建過程。然而我們同樣希望人們能在遠離電腦的情況下,花時間來系統地閱讀更多App Inventor指南中的章節。
對于教師和學生來說,這本書可以作為計算機科學入門課程的教科書,或者任何一門靠創造來學習的課程的參考資料。依我們的經驗,“閱讀教程→討論→創作”這樣的順序會取得最好的效果。所以,第一步先讓學生完成教程中的一兩個應用,不必要求太高,只要能按部就班地完成就好;第二步可以指定App Inventor指南中的某個章節,在課堂上進行討論和演說,來減緩學習的進度;第三步要鼓勵學生探索:讓學生按照每一章末尾的改進建議,在沒有具體指導的前提下,對應用做出修改;最后,指定一個創造性的任務,讓學生對應用提出自己的想法,然后實現它們。
每章的文件及例子的完整代碼都可從這里下載:[http://examples.oreilly.com/0636920016632/](http://examples.oreilly.com/0636920016632/)。
## **致謝**
創建App Inventor開發工具的動機是教育,基于這樣的動機,我們堅持認為,通過主動學習,程序可以成為那些閃光的強大思想的載體。因此,App Inventor是不斷發展的計算機及教育事業的一部分,這一事業始于20世紀60年代Seymour Papert及MIT的Logo小組的努力,他們設計了眾多的活動和計劃,來支持計算思維,其影響一直延續至今。
App Inventor的設計借鑒了此前的計算機輔助教育的研究成果,并立足于谷歌在線開發環境。可視化編程框架與MIT的scratch編程語言密切相關,在具體實現上依賴于Open Blocks,它由MIT的Scheller教師培育項目發布,并源自MIT 的Ricarose Roque的研究論文。我們感謝Scheller項目的Eric Klopfer與Daniel Wendel讓Open Blocks成為現實,并感謝他們在工作中所提供的協助。將視覺化的塊語言翻譯為Android上的實現的編譯器使用了Kawa語言框架,而Kawa是Scheme編程語言的方言,由Per Bothner開發,并由自由軟件基金會發布,它是GNU操作系統的一部分。
作者要感謝谷歌和App Inventor團隊在USF、米爾斯學院及MIT所給予我們的工作的支持以及教學上的努力。特別感謝App Inventor技術主管Mark Friedman,項目經理Karen Parker,與工程師Sharon Perl和Debby Wallach。
我們還需特別感謝O'Reilly的編輯們,Courtney Nash、Brian Jepson,還有Kathy Riutzel、Brian Kernighan、Debby Wallach以及Rafiki Cai,感謝他們的反饋和見解。
最后,我們還要感謝我們各自的配偶的支持:Ellen的丈夫Keith Golden,Hal的妻子Lynn Abelson,Liz的丈夫Kevin Looney,David的妻子Minerva Novoa。新媽媽Ellen還要感謝保姆Neil Fullagar的幫助。
- 簡介
- 序言
- 前言
- 第 1 章 Hello 貓咪
- 第 2 章 油漆桶
- 第 3 章 打地鼠
- 第 4 章 開車不發短信
- 第 5 章 瓢蟲快跑
- 第 6 章 巴黎地圖旅游
- 第 7 章 安卓,我的車在哪?
- 第 8 章 總統測驗
- 第 9 章 木琴
- 第 10 章 出題及答題
- 第 11 章 廣播中心
- 第 12 章 遙控機器人
- 第 13 章 亞馬遜掌上書店
- 第 14 章 理解應用的結構
- 第 15 章 軟件工程與應用調試
- 第 16 章 應用中的存儲
- 第 17 章 創建動畫應用
- 第 18 章 程序中的決策:條件塊
- 第 19 章 數據列表編程
- 第 20 章 循環
- 第 21 章 定義過程
- 第 22 章 數據庫
- 第 23 章 傳感器
- 第 24 章 與Web API通信