2012年12月15日 星期六

Android教學(2)-Project

建立Project


在Eclipse中建立Android Project,可以從File->New->Android Application Project建立,或是在左側Package Explorer右鍵建立。在建立Project時需要填入名稱等等資訊,其中比較重要的是Package Name與Compile with SDK的版本。其他沒有特別需求的話,通常就next連點直接使用預設的設定了。

Package Name是手機中用來辨識程式身分的名字,格式必須要有兩個以上的字串以點隔開,例如com.example.test。使用相同的Package Name的程式會被當做是同一個程式。一般來說重複安裝的話會被當做更新把舊的程式蓋掉,但若是使用不同的Keystore建立的程式則會安裝失敗,必須要手動刪除舊的程式才能把新的程式安裝進去。

Compile 所使用的SDK版本則直接影響到可以使用的函式。舊版的SDK自然無法使用新版所增加的功能,在新版使用淘汰的函式時,則會出現刪除線建議不要使用,但是一般還是能夠正常運作。如果使用到Google Map等不包含在原生Android SDK的功能時,要另外選擇Google API的版本。


執行Project


建立Project後,這個專案就可以立刻編譯執行了。點下上方的Run按鈕,Eclipse會編譯程式,並透過內建的debug keystore產生apk檔,之後再將這個apk檔安裝進手機然後開啟。

第一次執行會詢問要使用的執行方式,自然是選擇Android Application。之後Eclipse會找尋已開啟的模擬器或是接上的手機來安裝程式並執行,若是都沒有的話預設會自動開啟AVD中適合版本的模擬器,同時有多台設備或是沒有適合的模擬器可以開啟的話則會跳出介面選擇要執行的設備。可以點Run按鈕旁邊的小三角形選擇Run Configurations設定,可以避免不小心開啟模擬器。

若是要在實機上開發,需要到手機的設定->開發人員選項 打開USB偵錯(舊版Android是放在設定->應用程式管理中),Windows還需要另外安裝手機的驅動程式,這樣在開啟程式時,就能夠選擇手機來進行開發。要確認手機是否有正確接上,也可以到DDMS中的Devices看是否有抓到手機。




Project內容

src

是主要程式碼所放置的地方,內建有一個MainActivity,裡面的onCreate是預設的程式進入點。

gen

裡面最重要的是R.java,用來管理程式內的資源。在程式中可以透過R取得各種資源,如圖片,音樂,排版方式等。

R.java由系統自動建立,不要更改裡面的內容!

若是資源有問題,例如圖片換了程式卻沒更新,可以把gen砍掉讓系統重新建立R.java,或是從Project->clean來重置。

bin

當程式編譯過,會將產生的檔案放在bin中。如果想找別人幫忙測試程式,可以從bin中找到apk檔,就可以透過一般安裝apk檔案進手機的方式來讓別人安裝你的程式。但是這個apk檔是透過debug keystore所產生的,無法用於上架,要上架的話需要透過自己的keystore產生apk檔。


res

這邊存放的是各種資源,並且自動產生R.java來管理這些資源。

res中的檔案名稱只能使用 . _ 小寫字母 數字。

drawable用來放圖片。由於android的解析度種類各式各樣,在這邊分成l/m/h/xh dpi,一般比較常見的解析度是240*400 / 320*480 / 480*800 / 640*960,但是會根據機器的不同而有不一樣的數值。解析度是Android最討厭的地方,常常一張圖放上去,結果每支手機看起來都不一樣。想更了解解析度可以看Google Developer。

一般情況下,假如有一張480*800的圖片,丟進hdpi來使用的話會剛好符合全螢幕,但是同一張圖片丟到xhdpi的話則會太小留下黑邊。系統會自動根據自己的解析度來找尋適合的圖片,如果只有其中一個資料夾有放圖片的話則會自己將圖縮放,但是要達到最好的效果,最好還是各種dpi都放入對應解析度的圖片。

layout放的是排版方式,可以透過圖形化介面以拖拉的方式來排放元件,或是直接更改xml的內容來編排layout。內建的activity_main.xml是預設的排版方式,裡面只有一個Layout與一個"Hello world!"的TextView。

values中主要是程式中會使用到的各種字串。雖然一般來說常常會直接把字串寫死,不透過values來使用,但是values可以用來處理多國語言的問題。如果想提供多種語言,就可以另外建立對應的values資料夾,例如繁體中文是values_zh_rtw,就另外在res中建立這個資料夾並且把本來values裡的內容複製過去,再把內容更改為中文的版本。這樣使用繁體中文的手機就會到values_zh_rtw中尋找字串,而其他語言的手機則是到預設的values中尋找。

附帶一提,音樂與影片要放在raw資料夾,而預設是沒有這個資料夾的,要自己建立。

 

AndroidManifest


這個檔案裡面是各種註冊的資訊,包括package name,版本,權限,程式起始點,還有Activity,Service,BroadcastReceiver等等的註冊。之後常常會需要到AndroidManifest進行註冊,在講到的時候會再說明。


下一次要來講layout與view。

2012年12月8日 星期六

Android教學(1)-開發環境

前言:這是一系列Android教學文的第一篇,從如何開始寫Android到各種Android功能的使用方式。這系列的文章預設是給有程式基礎的人看的,最好是有java基礎,略懂物件導向與繼承,但是只會寫C/C++的話應該也還能對付著學。若是想從Java開始學,可以參考
良葛格學習筆記。

要學一項新的技術,最麻煩的往往是不知從何開始。以前要開發Android App步驟很多很麻煩,先灌JDK設定參數,抓Eclipse跟Android SDK,再安裝ADT。不過最近最新釋出的Android SDK 4.2幫你把東西都包好了!!

要開始寫Android的程式,只要到Google developer下載最新的Android SDK下來解壓縮,就可以直接用包在裡面的Eclipse開始動手了!!在Google developer中也能找到Android的文件。若是在寫程式時碰到不會用的函式或類別,可以到這邊查詢用法,不過一般來說直接Google會比較快XD。

Eclipse


Eclipse是現在最常見的IDE之一,主要是拿來寫Java程式,但是配合不同的plug in,也可以撰寫C/C++/Python/Java Script等不同的程式語言。在寫程式時Eclipse也提供了很多方便的功能,例如自動排版(Ctrl+Shift+f),自動完成(Alt+/)或是Debug 提示等等。當然他的自動偵錯只限於語法錯誤,程式邏輯的問題是找不出來的,不過在需要import或是實作implement的函式時就可以偵測並且幫你補上該寫的部份。

Android SDK Manager 

在Eclipse中可以透過Android SDK Manager管理目前所安裝的Android開發版本。Android的版本眾多,市面上目前從2.x到4.x都有,而下載下來的SDK裡面只有最新的4.2版,若是要撰寫或是編譯其他版本的Android程式,就要透過Android SDK Manager下載對應版本的SDK。

AVD Manager 

AVD Manager全名是Android Virtual Device Manager,用來建立管理Android模擬器。可以透過他來建立Android模擬器以運行Android app。在建立模擬器時,要選擇模擬器的硬體規格,Android版本,SD卡大小等等參數。之後就能夠開啟Android模擬器了。模擬器的版本也差很多,某些版本的模擬器在使用相機或影片等功能時會無法運作。

模擬器打開來基本上跟實際的手機差不多,也可以直接開啟裡面安裝的APP,或是透過手機裡本來就有的設定來管理App。在操作上則是透過滑鼠,在上面點擊拖曳就等同於用手指觸控。

雖然Android模擬器的效能很差,但是在沒有實機的時候還是能拿來頂著用,而且在開發跟簡訊,電話,GPS等功能相關的App時,透過模擬器開發可以更方便的測試這些功能。





DDMS

DDMS是Android SDK所提供的Debug工具,可以用來監測模擬器和實機的運作狀態,底下是DDMS內所提供常用的工具。如果不小心關掉或是找不到的話,可以到Window->Open perspective開啟DDMS,還有到Window->Show View開啟下面的功能。

LogCat 

LogCat可以用來看手機內所發出的Log,不管是系統所發或是自己主動發出的Log。LogCat在寫程式Debug時幾乎可以說是必備的工具。在寫程式時,除了可以透過Log瞭解程式運行的狀態,最重要的是,當程式當掉,我們可以透過系統的Log找出原因。LogCat也提供過濾的功能,可以直接搜尋類型,tag或內容。

當程式Crash時,第一件事就是到LogCat看為什麼Crash!

一般來說,當程式整個當掉,系統會噴出一堆Log告訴你程式是怎麼當的。因為Java的物件繼承關係很密切,所以Log中會把每一層的資訊都顯示出來,不過最重要的資訊是
1.Cause By xxxException
2.at 你的package name (你的某個class:行數)

at package name(class:行數)告訴你程式在那裡當掉,雙擊還可以直接跳到那一行。
Cause By xxxException告訴你程式為什麼當掉,有經驗的程式設計師在看到Exception的類型時就能夠判斷是那裡出錯。最常見的Ecxeption有NullPointerException(使用到空的物件),ClassNotFoundException(在Android中常常是忘了在Android Manifest中宣告Activity或Service),ClassCastException(物件轉型轉錯)等等。若是程式當掉不知道怎麼修,把Exception丟上Google也往往能找到答案。


Devices

在Devices可以看到目前開啟的模擬器與實機,還有裡面正在運行的程式狀態。在這邊可以強制停止程式,也可以透過相機的icon截取螢幕截圖。在同時有多台設備時,也是在這邊選擇DDMS其他功能要顯示與操作的目標。



Emulator Control 

Eulator Control用來對模擬器進行操作,這邊提供的是發送簡訊,打電話給模擬器,或是發送GPS的經緯度座標給模擬器。



File Explorer

可以看見設備中的檔案系統,也可以從手機刪除/下載/上傳檔案。不過要操作的話可能要對Linux的系統架構有些了解,才能夠找到檔案的位置。





開發環境就介紹到這邊,下一篇來講建立執行Android Project與其內容架構。

2012年12月2日 星期日

Android開課心得

前一陣子,我在學校開辦給社會大眾的Android課程擔任講師,現在終於告一段落了。在上完課之前我就一直想說要來發篇心得,沒想到拖到今天。

上這個課程除了教會學生怎麼寫Android APP,我自己也從學生那邊學到了很多。學生來自各行各業,常常會用不同於資工人的角度來問問題。有的問題是我從來不曾考慮到
的,觸發了我一些想法,有的讓我很想直接丟"Let me google for you"給他,也有的問題會讓人很想吐槽,尤其是關於程式語法的問題。



上這個課最累的地方是要兼顧所有人的學習情況。因為學生來自各處,大概有八成是已經在程式界工作的,也有外校的學生來上課。他們程度相差很大,有的Java很熟只是想學Android,有的寫過VB,還有根本狀況外不會寫程式的。

為了盡可能讓所有人都有收穫,我在前面兩小時講課的時候講得比較深入,而在最後一小時的練習則開一些比較簡單的程式給他們實作。這樣可以讓大家都能實作出程式,而強的人也能學習到更深入的東西,不過意見調查表上說我教太難的也出現過好幾次。

我是覺得Android的東西很雜,教的東西本來就很難全盤吸收,所以主要還是讓學生知道有這個東西,大概要怎麼用。有概念的話,之後開發的時候就可以很容易找到教學或範例,不管是從書上或是Google。



每次練習實作的時候,我基本上就只會開出要求,讓他們自己發揮。同時我也會在底下巡看大家實作的情況,同時有問題也可以問我。基本上效果不錯,同時我也能透過他們實作的程式跟他們的問題來判斷他們的程度。

大部分的學生都至少能把實作簡單的部份給完成,有的強者還會自己練習我放在補充的部分。不過也有少數裝死的同學。之前某期有個同學每次都躲在最後面,實作的時候就開Eclipse裝忙,我到後來才發現他完全沒跟上的時候已經來不及沒救了。我一直告訴他們有問題就盡量問,不過遇到這種上課完全沒聽又死都不問的,我真的不知道他花錢來上課幹嘛。



下面是我自己做的投影片。我自己做投影片都做得非常精簡,通常都是幾點重點的說明再加上片段的範例程式碼,之後上課的時候再來詳細的介紹。

初學者直接看這些投影片的話應該會不知道在幹嘛。但是對於有一定Android基礎的人,裡面的範例程式碼應該會滿好用的,因為我把範例的程式碼切得很乾淨,只要知道Android的程式架構,知道該把程式擺在哪邊,通常複製貼上就能作用了。至少我自己在寫程式的時候也常常翻投影片來複製貼上XD。

我上課是上比較舊的Android 2.2版本,主要是因為相容性的關係,4.x的程式常常不能在2.x的手機上跑,但是2.x的基本上可以相容於新版本。當然還是有一些例外,例如menu之類的,這些我會在上到的時候補充。之後我也會把這些上課內容打成網誌,希望能對大家有所幫助。