做好了 Activity 的視覺設計後(其實還沒有真正開始做,要到第 2-5 節動手實踐才能看得到),接着就要讓程式和使用者互動了。現在必須要編寫 Java 程式,由程式控制視覺元件的行為,實作與使用者互動的功能。
回顧建立 Android 項目的最後兩步:使用者先選擇使用空白的 Activity(BlankActivity),下一步向導程式就會詢問這個 Empty Activity 的 Activity 名稱及其 Layout(布局檔案)的名稱(參見下圖,目前都采用預設值)。Activity 名稱會成為此項目中 Java 主程式的類名稱及其檔案名(Java 主程式的類名稱需與檔案名相同)。并且這個 Activity會成為程式的主界面,也就是程式執行時第一個顯示的界面,等于是整個程式的起點。是以預設的名稱MainActivity就是主Activity的意思。

此外,Activity 名稱也會記錄在項目的AndroidmManifest.xml 檔案中。當使用者啟動程式時,Android 系統會根據 AndroidManifest.xml 的内容找到所要啟動加載的Activity 名稱(目前預設 MainActivity 會第一個被啟動)。
新項目建立後,Android Studio會自動生成一個 MainActivity.java 的 Java 程式(檔案名會按你在建立項目時設定的 Activity 名稱而不同),其内容如下:
Android 啟動任何一個 Activity時,都會完成一些必要的初始工作,然後調用該Activity 的 onCreate() 方法。
由于任何一個 Activity 都是繼承(extends)自 Android 原始定義的 Activity 類或 AppCompat Activity 類(後者是能與舊版系統相容的 Activity 類,如前面程式中的第6行),是以Android 原始的 Activity 類早就很體貼地為使用者把 onCreate() 方法寫好了,一些該做的事都做了。唯一它不知道的就是使用者的界面要設計成什麼樣子,以及針對使用者對手機的操作要做出怎樣的響應。是以 Android 原始 Activity 的 onCreate() 立意良好,但不能直接“繼承”使用。
既然是這樣,就自己編寫 onCreate()吧!它的寫法很簡單,就是先調用父類的 onCreate() 把該做的事做好,然後把界面顯示出來就行了。這就是程式第 9~12 行所做的事。它編寫了一個叫 onCreate() 的方法,這個方法和父類的方法同名,是以會覆寫(override)父類的同名方法,當 Android 調用 MainActivity 的 onCreate() 方法時,就會調用到這個方法而不會去調用父類的同名方法。
程式第10行的super就是指定要調用父類的onCreate(),然後調用 setContentView() 把界面(view)的内容(content)顯示出來。其中,參數 savedInstanceState 是把目前系統所記載的該 Activity 之前的狀态傳進來,這是因為 onCreate() 不一定是程式第一次執行才被調用,當程式被系統強制停止後再次恢複時也會被調用,此時就要把中斷前被系統所儲存(save)的執行狀态(Instance State)(如輸入到一半的位址等)傳給 onCreate(),這樣那些輸入到一半的資料才不會遺失。
當 onCreate() 方法結束後,就會傳回系統。接下來就要等到有特定的事件發生,如使用者單擊了某個按鈕,或者在文字輸入字段中輸入了資料時,Android 系統才會通知 MainActivity 來處理。如果要處理這些事件,就必須在 MainActivity.java 中加入對應的方法,讓系統在發生事件時自動調用這些方法來處理。
###setContentView():載入布局檔案
在 onCreate() 方法中,除了先調用父類的同名方法進行必要的工作外,還調用了setContentView() 方法。
這個方法會把 Activity 所對應的布局檔案(也就是視窗界面)顯示到螢幕上,傳入的參數 R.layout.activity_main 就是布局檔案的資源 ID,通過這個 ID可以找到對應的 activity_main 布局檔案。接着說明資源 ID 的工作原理。
當使用者把視覺和程式分開設計時會産生一個問題,那就是程式和視覺元件如何聯系起來呢?因為它們是分開的,那麼如何由程式擷取這些視覺資源呢?關鍵在于R.java 和資源 ID。使用 Android Studio 建立的新項目(如第 1 章沒寫代碼的那個程式),其 R.java 類檔案中就已經建立了所有資源的 ID。
建立資源時(如加入新的布局檔案、在布局中加入元件、加入圖像檔案、加入字元串等),Android Studio 會自動在項目的 R.java 中建立代表這些資源的資源 ID,其格式為“R.資源類.資源名稱”。每個資源在 R.java 中都有一個對應的資源 ID。是以,在程式中可以用“R.資源類.資源名稱”的格式存取 res 檔案夾下的各項資源。
這就是在調用 setContentView()時,傳入 R.layout.activity_main 這個資源ID就可以加載 res 中對應的 activity_main.xml 布局檔案的原因。
從R.java的内容可以看到,資源ID都是以?nal聲明的,是固定的常數,其值是由Android Studio設定的,請勿自行更改!