文章目錄
前言
上一節我們通過一個Demo熟悉了Eclipse的基本使用、如何在模擬器和手機中運行以及如何打包成APK,但沒具體編寫代碼,相信很多同學已經按耐不住了吧,這一節我們會動手編寫代碼來熟悉Android SDK的情況和JAVA的一些特性。
聲明
本系列文章不是教程,僅為筆記,如有不當之處請指正。
歡迎轉載,轉載請保留原出處:http://www.cnblogs.com/rayee
本文
我們先瞭解一下編寫程式都要涉及到哪些東西,熟悉一下SDK的基本組件,然後編寫一個很簡單的小程式。
一、分析Demo
在上一節建立的工程Demo下,開啟src/com.android.demo下的DemoActivity.java,如下所示:
Demo程式的代碼就只有13行,我們依次來分析一下:
package com.android.demo;/** 申明這個檔案的代碼屬於包“com.android.demo” */import android.app.Activity;/** 從Android SDK中引用Activity組件 */import android.os.Bundle;/** 從Android SDK中引用Bundle組件 */public class DemoActivity extends Activity {/** 建立類DemoActivity,繼承Activity,它就擁有Activity的特性了 */ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) {/** 重寫基類的同名函數,程式運行候建立Activity時被調用 */ super.onCreate(savedInstanceState);/** 調用基類的同名函數 */ setContentView(R.layout.main);/** 設定試圖,用於顯示介面 */ }}
第1行,聲明代碼屬於哪個包,這裡的包名得與檔案所在的包對應上,否則會報錯。
第3、4行,引用組件。這裡的“引用”並不像其他語言的include那樣將檔案包含進來,只是告訴編譯器,後面會使用到這裡面的成員。
關於Package 與 Import的詳細說明,>>請到這裡查看。
第6行,建立一個類DemoActivity,繼承Activity。JAVA是一門完全物件導向的語言,所有東西都要封裝在類裡面,之前不熟悉物件導向的朋友估計會很不習慣(話說我之前用PHP做WEB開發,哪裡都能寫實現…)。DemoActivity類繼承了Activity的特性,就屬於一個“Activity”了(前面提過,Activity是Android中的基本組件之前,非常之基礎,任何有介面的程式都有它)。
想深入瞭解“物件導向”的同學,>>請到這裡查看。
第9行,重載onCreate函數。有編程經驗的同學看到on首碼就知道這個函數是個回呼函數,屬於小受受,只能“被”,它在Activity這個介面開始建立時被調用。
第10行,調用基類的同名函數。基類還有些事情要處理呢,得通知他。
第11行,指定用哪個視圖來顯示介面。從字面上可以看到setContentView(R.layout.main),採用R.layout.main作為試圖,那麼R.layout.main代表什嗎?我們要修改的話從哪裡下手呢呢?
我們在上一節介紹工程檔案的時候介紹過一個由IDE自動維護的檔案夾gen,裡面有個R.java檔案,有同學可能明白了,這裡就是引用裡面的內容,如下所示:
R.layout.main就是R.layout類裡面的一個屬性,值為0x7f030000,一個資源ID,那麼它指向哪裡呢?
可以看到,真正的視圖布局檔案在這裡。上一節講過,res檔案夾下的資源會自動在R.java裡面產生記錄,現在看到確實是如此。至於那個資源ID是根據什麼規則產生的,那就沒研究了,反正他自動維護,我們樂得清閑。
一會兒我們要修改程式介面就可以從這裡入手。
Demo程式的代碼部分就這麼多,是不是覺得其實並沒那麼難?呵呵。
█ 學過JAVA的同學可能會有疑問了:怎麼沒有入口函數呢?
我們編寫Android程式是在Android SDK下進行的,SDK在背後完成了很多工作,包括程式從哪裡運行、怎麼渲染視圖等等,我們只需要寫程式的邏輯部分、視圖部分,對於這個程式裡的代碼來說,DemoActivity類就相當於一個入口了(姑且稱之為入口Activity吧),這和原生的JAVA編程是有一點不一樣哈。
█ 喜歡動腦經的同學會想:一個程式可能有多個介面,就有多個Activity,那麼怎麼知道該選擇哪個Activity為入口呢?
上一節還提到過一個全域設定檔AndroidMainifest.xml,我們開啟看看:
我們可以看到,在這個檔案裡面配置了所有Activity的資訊,DemoActivity裡面有兩個intent-filter,<action android:name="android.intent.action.MAIN" />,<category android:name="android.intent.category.LAUNCHER" />,發現了LAUNCHER字樣,可以猜測這個就是入口標記,我們一會兒驗證一下。
二、建立一個Activity
我們建立一個Activity,脫離自動產生的DemoActivity試試
在src下的com.android.demo上點擊右鍵 –> New –> Class
Name處填寫類的名稱,在這裡我們填寫launcherActivity,Superclass處我們填寫android.app.Activity,就是Activity的基類,其餘的不用修改,點擊”Finish“,結果如所示:
可以看到,launcherActivity建立好了,還自動產生了部分代碼,真方便。
糟了,DemoActivity類是大寫字母開頭的,我們的是小寫l開頭,還是統一一下吧:
在launcherActivity.java中直接修改類的名稱,將l修改為L,發現IDE報錯了(因為JAVA是區分大小寫,類名必須和檔案名稱一樣),把滑鼠移動到錯誤的地方,彈出修改建議,我們選擇”Rename compilation unit to…“,如所示:
報錯消失了,檔案名稱也變為大寫開頭了,真方便…
依瓢畫葫蘆,把Bundle組件引入進來,import android.os.Bundle;
然後重載onCreate方法。這個必須重載,我們得在裡面設定視圖呀,操作如下:
LauncherActivity檔案上點擊右鍵,Source –> Override/ Implement Methods...,勾選onCreate,點擊”OK“,代碼就自動產生好了:
三、建立布局
這個Activity還沒有視圖,我們建立一個:
在res/layout上點擊右鍵,New –> Other
選擇Android XML Layout File,點擊”Next“,在下一個頁面輸入布局名稱”launcher“,點擊”Finish“,布局檔案就建立好了:
現在的SDK內建了可視化布局,直接往上拖就行了,不過想要做出好看的介面,還需要深入瞭解Android介面布局,以後遇到再詳細講解。
可點擊標註處切換可視化介面或XML編輯介面,很多XML頁面開啟都有這個切換按鈕,可以進行切換。
這裡我們要做一個啟動介面,中間加個載入表徵圖,一行文字即可。詳細過程不多敘述(因為我都還沒完全學會如何布局,不敢誤人子弟),最終介面如下所示:
XML檔案內容如下,可複製粘貼到檔案裡:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <FrameLayout android:id="@+id/frameLayout1" android:layout_width="match_parent" android:layout_height="match_parent" > <ProgressBar android:id="@+id/progressBar1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="120dip" android:text="Welcome ..." android:textAppearance="?android:attr/textAppearanceLarge" /> </FrameLayout></LinearLayout>
在LauncherActivity類的onCreate方法中加上設定視圖的代碼:
setContentView(R.layout.launcher);
這樣JAVA代碼就編寫好了,但還沒完,我們還需要在AndroidMainifest.xml檔案中添加這個Activity的配置資訊,同時將DemoActivity配置中的intent-filter移動到LauncherActivity配置中,驗證一下是否真的是入口標誌,最終的配置資訊如下:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.demo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".DemoActivity" android:label="@string/app_name" > </activity> <activity android:name=".LauncherActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
一個新的Activity就編寫完成了,按照上一節的方法運行看看是否正確:
可以看到,我們親自編寫的Activity運行起來了。正如我們所料,intent-filter段中的那個配置資訊確實是起到了標記入口Activity的作用。
程式運行了半天還是一直載入,怎麼回事呢?因為程式中沒後續動作了。接下來我們修改程式讓它跳轉到DemoActivity中。
四、Activity之間的跳轉
這需要在LauncherActivity類中修改代碼,思路是在onCreate被調用、設定好視圖後,等待一段時間,再跳轉到DemoActivity。開始編碼:
Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {// TODO Auto-generated method stubIntent goIntent = new Intent();goIntent.setClass(LauncherActivity.this, DemoActivity.class);startActivity(goIntent);}}, 3*1000);
這裡我們建立了個計時器timer,添加了個任務,在3秒鐘後執行。跳轉的代碼位於第6、7、8行:
建立一個Intent,設定好起始地點(LauncherActivity),目的地點(DemoActivity),開始跳轉(startActivity)。
這段代碼位於setContentView(R.layout.launcher);之後,最終代碼如下所示:
package com.android.demo;import java.util.Timer;import java.util.TimerTask;import android.app.Activity;import android.content.Intent;import android.os.Bundle;public class LauncherActivity extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.launcher);Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {// TODO Auto-generated method stubIntent goIntent = new Intent();goIntent.setClass(LauncherActivity.this, DemoActivity.class);startActivity(goIntent);}}, 3*1000);}}
儲存,再次運行,看歡迎頁面是否在3秒鐘後跳轉到了首頁面。
五、遺留的問題
在這一節,又接觸了一些新東西,之前沒說明,可能有些同學早就產生疑問了,這裡集中講一下:
█ 第二個import語句引入的Bundle是什麼,後面一直沒用過?
Bundle的字面意思為:捆、束,一組東西,在Android中用來傳遞資料,表現為Key-Value索引值對,可以從一個Activity傳遞資料到另一個Activity。在這個例子中我們還沒用到它,但onCreate函數的參數必須要它,所以,必須import…
█ 最後又用到了個Intent,是什嗎?
Intent,意圖,和Bundle類似,也是包含一組東西,但不僅僅是資料,還包含操作類型、操作對象等資訊。在上面的例子中startActivity函數只需要一個goIntent就能實現跳轉功能,就是因為goIntent包含了操作所需的東西,如果需要傳遞其它資訊,還需要更複雜的設定。
結尾
這一節我們編寫了一個完整的小程式,雖然它實際上沒什麼用…
仔細想想接觸到的東西還是挺多,物件導向、繼承、資源引用、全域配置、Activity的建立、布局檔案的建立、Activity之間跳轉。
今天還是沒能寫出牛叉的程式,可能同學們覺得太慢了,但只要每天堅持學習幾個知識點,學習新的東西,不間斷的堅持下去,一定會成為大牛的!
下一節我們寫個牛叉的:基站定位,會學習到SDK中其它API的調用,HTTP通訊,JSON解析等相關知識。
如果你喜歡看到這些文字,請點擊右下角的”推薦“支援我一下,謝謝!