新接觸一門程式或者開發框架,我一般都要先弄清楚程式的入口在哪裡,程式怎麼運行的;建立一個項目後,各個文件夾有什麼作用以及如何使用等等。理清楚這些東西對以後開發是很有好處的,古話說得好,工欲善其事,必先利其器。本文主要總結android程式的入口點和程式的運行流程(初識),android項目中各文件夾 ...
新接觸一門程式或者開發框架,我一般都要先弄清楚程式的入口在哪裡,程式怎麼運行的;建立一個項目後,各個文件夾有什麼作用以及如何使用等等。理清楚這些東西對以後開發是很有好處的,古話說得好,工欲善其事,必先利其器。本文主要總結android程式的入口點和程式的運行流程(初識),android項目中各文件夾的含義,以及它們的使用。
剛接觸android程式,配置好開發andriod的環境,建立一個項目,框架自帶的經典hello程式,然後就可以在虛擬設備上進行運行了。但是對程式從哪裡開始運行的,下一步應該執行哪個函數,以及各個項目文件夾乾什麼的,裡面存儲什麼,都有什麼作用等等這些都是一臉懵逼的。經過這幾天的摸索,對這些概念有那麼一點點理解,下麵進行總結一下,有不對的地方,敬請各位android大牛進行指出,感激不盡。
1 Android程式的入口
1.1 Activity類
在andriod的應用程式中,用戶所感知的都是一個個應用界面,在android程式裡面每個應用界面對應一個 Activity類,這類似於.NET Winform項目中的Form窗體。與WinForm中的Form一樣,Activity類也是一個基類,每個視圖界面都是繼承Activity的。下麵看一下Activity的擴展類的代碼。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
//執行邏輯代碼
}
}
當Activity進行創建的時候,它會執行onCreate
函數,當然,在Activity不同的生命周期中,會執行相應的函數。onCreate
函數會在創建的時候被調用,同樣的,當這個Activity界面不可見的時候,又會調用onStop
函數。這和WinForm又有些類似,這些函數對應Winform窗體的FormLoad
和FormClosing
事件,但是不一樣的,FormClosing
事件內部可以取消該窗體的關閉,而Activity卻不可以,這也是很好理解,因為在android程式中,你自己點擊後退鍵,那是肯定會回到前一個界面,當前界面會消失。
我們可以在程式建立許多個Activity界面類,和我們的WinForm程式一樣,也可以建立多個Form窗體界面,那麼問題來了,這麼Activity界面,程式在啟動的時候,應該啟動哪一個?
1.2 AndroidManifest.xml配置文件
在WinForm程式中,程式的啟動一般是Program類中的Main
負責啟動第一個程式界面,而在android程式中則是使用配置文件來配置入口的Activity界面。下麵是AndroidManifest.xml
配置文件中的代碼。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
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>
該配置文件是每一個android項目都必須要有的,下麵解釋部分節點的含義。
- uses-permission :表示用戶需要授權該程式的許可權,上面xml中配置的需要用戶授予訪問網路的許可權。
- application : 這個配置節點很重要,它的子節點
activity
就是配置android程式的入口,android:name=".MainActivity"
配置了程式的初始視圖界面為MainActivity
(這個MainActivity類在src文件夾中)。而action
和category
節點配置也很關鍵,action節點中的android.intent.action.MAIN
表明這個Activity是整個應用程式的入口點;而category中的android.intent.category.LAUNCHER
意思是把這個Activity歸屬到載入器類,即把這個Activity標註為自動會載入和啟動的Activity,這樣程式啟動時候就先載入這個Activity了。
目前理解的andriod程式運行是這樣的。至於內部如何實現的,目前涉獵不深,暫不明白。(望高手指點)
首先,載入程式需要的一個資源,接著讀取配置文件,找到application節點中配置的入口Activity視圖,然後載入該Activity視圖進行顯示。
2 項目文件夾的含義
新建一個android的項目之後,就會出現如下的目錄結構。
主要的目錄有src、gen、assets、bin、res。
- src:存放項目的源代碼。
- gen:該文件是創建項目時候自動生成的,裡面包了一個R.java的靜態類,它裡面包括很多靜態類(內部類),每個靜態類中的靜態成員名稱都對應res文件夾中的一個資源名稱,保存著該資源的索引,方便在代碼中進行獲取資源。
- assets:assets文件夾裡面都保存原始的文件格式,在代碼中通過AssetManager來進行訪問。
- bin:存放編譯後的apk和資源文件。
- res:存放項目需要的資源文件,比如字元串,佈局,皮膚等,這裡面每個資源的索引都保存在R.java類中。
2.1 src
src文件主要存放著項目的java源代碼,比如Activity視圖類,還有其他邏輯處理代碼。
2.2 gen
gen目錄中的R.java文件保存著res文件中的資源索引。索引都是int類型的。
從上往下看,array類保存數組的資源索引,drawable:保存圖片索引,id:保存佈局文件中控制項id,layout:保存佈局文件的索引,string:保存字元串資源的索引。
註意,R.java
這個類是保存著當前項目中工程師定義的資源索引,而android.R.java
,是保存著android內部預定義好的資源索引。
2.3 res
res中有許多文件夾,不同的文件存放不同的資源。
- drawable:存放圖片資源,每添加一個圖片資源,
R.drawble
類中對應添加一個圖片索引。不同的drawable文件夾存放不同解析度的圖片。 - layout:存放界面的佈局,每一個佈局文件對應
R.layout
裡面的佈局索引,索引名稱與佈局文件名稱一致。 - values:裡面存放xml資源文件,每個xml文件可以存放字元串、數組、樣式等數據。xml文件可以按照自己需要進行新建。
string.xml文件中存放了兩個字元串數據,那麼在R.string
類中會保存兩個字元串數據的索引,索引名稱和字元串資源中的name標簽的值一致。
添加一個數組資源,在R.array
類中會添加一個數組資源索引,索引名稱和標簽中name屬性值一致。
佈局中文件每個控制項的id也會被添加到R.id
類中去。其中在為控制項指定id時有兩種方式,一種是@id/btn
,另外一種是@+id/btn
,前一種是R.id類中已經有了這個id定義,後一種是新增一個btn的id索引。
2.4 assets
assets文件夾主要保存原始的文件格式,比如我需要在代碼中訪問載入一個html文件,或者一個txt文檔,那麼就需要把html文件和txt文檔保存到assets文件下。
3 項目文件夾中各種資源的使用
第2節已經搞清楚了各種文件夾中存放何種資源,那麼本小節總結一下如何在程式代碼中訪問這些資源文件。(所有的資源索引都已經自動更新到R類中)
3.1 使用佈局文件
佈局文件類似wpf的界面佈局文件,如果沒有程式使用它,那它僅僅只是一個xml文件,我們需要把這個文件通過Activity的setContentView
方法進行渲染之後,它才會顯示到該Activity視圖上,這種設計方式實現了UI和業務邏輯代碼的分離。
在Activity的onCreate
方法中,調用佈局文件,渲染界面。
setContentView(R.layout.activity_main);//實現界面的渲染
Activity的setContentView
方法,帶一個參數,該參數就是佈局文件的索引。該方法通過佈局文件索引實現界面綁定。
獲取佈局文件中的控制項
TextView myView=(TextView) this.findViewById(R.id.textView1);
3.2 獲取values文件夾下的各種資源
訪問字元串資源
String sstr=this.getResources().getString(R.string.app_name);//獲取app名稱
訪問數組資源
int []myarray=this.getResources().getIntArray(R.array.my_array);
3.3 獲取assets文件夾下的資源
在assets文件中保存一個html頁面,我們需要在代碼利用WebView控制項載入這個html頁面.
代碼如下:
myWebView.loadUrl("file:///android_asset/myblog.html"); //註意獲取文件的路徑格式
4 總結
將項目中的各個部分的作用弄清楚對於剛接觸android編程的新手我來說是很重要,這是基礎性的東西,明白了這個才能夠更好的深入android的學習。