Android起源與發展: Android操作系統最初在2003年的時候由Andy Rubin開發,主要支持手機。2005年8月由Google收購註資。2007年11月,Google與84家硬體製造商、軟體開發商及電信營運商組建開放手機聯盟共同研發改良Android系統。隨後Google以Apach ...
Android起源與發展:
Android操作系統最初在2003年的時候由Andy Rubin開發,主要支持手機。2005年8月由Google收購註資。2007年11月,Google與84家硬體製造商、軟體開發商及電信營運商組建開放手機聯盟共同研發改良Android系統。隨後Google以Apache開源許可證的授權方式,發佈了Android的源代碼。第一部Android智能手機發佈於2008年10月。Android逐漸擴展到平板電腦及其他領域上,如電視、數位相機、游戲機等。2011年第一季度,Android在全球的市場份額首次超過塞班系統,躍居全球第一。 2013年的第四季度,Android平臺手機的全球市場份額已經達到78.1%。2013年09月24日谷歌開發的操作系統Android在迎來了5歲生日,全世界採用這款系統的設備數量已經達到10億台。
Android的系統架構:
主要分為四層架構和五個部分
Linux內核層:該層主要為Android系統硬體提供了底層驅動。如顯示驅動、音頻驅動、照相驅動、藍牙驅動、wifi驅動、電源管理等等。
系統運行庫層:這一層通過C/C++來提供一些特性支持。如SQLite提供資料庫的支持,OpenGL|EL提供了3D繪圖的支持,Webkit庫提供了瀏覽器內核的支持等等。
應用框架層:這一層主要提供了開發者在開發應用程式的時候可能用到的API支持。Android自帶的一些核心應用也是使用這些API完成的。
應用層:幾乎所有安裝在手機上的程式都屬於這一層。包括手機上自帶的簡訊、聯繫人功能,已經在應用商店下載的程式以及自己開發的程式。
Android的四大組件:
Activity:所有應用程式的門面,凡是在應用中看得到的東西,都是存儲在Activity中的
Service:不可見,可以在後臺默默運行。即使應用程式退出,仍然可以運行。
BroadCast Receiver: 運行應用接收來自各個地方的消息(比如電話、簡訊)。也可以通過該組件向其他地方發送消息。
Content Provider: 為應用程式之間共用數據提供了可能。
Hello World:
下麵就開始Android之路的第一個Hello World程式。
環境搭建的步驟大致包括下麵三步:
1. 安裝jdk
· 2. 去Android開發者官網下載綁定eclipse、SDK、SDT的開發工具。
3. 解壓完2中下載的文件之後需要點擊裡面的SDK Manager管理工具,進行相關其他版本的Android SDK的下載,下載的文件會自動放入SDK文件夾。
以上三步全部弄完之後打開eclipse,會發現eclipse的工具欄中增加了Android相關的圖標:
圖片從左到右依次是SDK Manager 和 啟動Android 模擬器的圖標。我們點擊第二個圖標創建一個android模擬器並啟動,啟動之後效果如圖:
這時可以在eclipse裡面打開device視窗,就可以看到正在運行的設備情況,當然也可以切換到DDMS視圖,能夠清楚的看到設備相關更詳細的情況。
說了這麼多開始進行第一個Hello World的程式開發:
直接new android application 然後一路next,到需要選擇Activity類型的時候選擇Blank Activity:
其實Hello World已經大功告成了。運行Android Application然後選擇剛剛創建的Android模擬器作為運行設備,最終出現的運行結果界面如下:
感覺有點酷!下麵我們就來分析代碼的構成:
可以看到裡面有很多目錄,瞬間覺得傻眼。不過不要急,其實我們需要關註的目錄就那麼幾個:
首先bin、lib目錄可以直接跳過,這裡面一般是存放jar包的。一般來說bin目錄是程式在編譯時自動生成的文件以及當前程式編譯好可直接安裝的apk包,lib目錄下一般存放引入的第三方包。
src目錄下一般使我們的源代碼
gen目錄下主要有一個R.java 文件,這裡面我們在項目中添加的所有資源都能在這裡找到對應的ID。建議千萬不要手動去修改該文件。
assets目錄,這個目錄用的不多,一般用來存放需要隨程式打包的文件,在程式中可以動態讀取這裡面的內容。如果程式中使用WebView載入本地網頁的話,所有網頁相關的文件也需要放入到這個目錄下。
res目錄,這個目錄裡面的文件有點多。簡單的講就是程式中用到的所有圖片、佈局文件、字元串等資源文件都要在這個目錄下。其實R.java中自動生成的代碼就是根據這裡面的資源文件生成的。當然這些資源文件也有一定的放的規律:比如圖片一般放到drawable子目錄下,layout子目錄下一般存放佈局文件,values子目錄下一般存放字元串文件。
AndroidManifest.xml:整個項目的核心配置文件。前面所講的四大組件、應用程式許可權添加、指定程式運行的最低版本和相容版本等的配置都必須在這裡面進行。
project.properties:這個文件非常簡單,只是指定的項目編譯的SDK版本。
從AndroidManifest.xml探究android程式是如何進行關聯的:
AndroidManifest.xml文件的源碼如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.helloworld" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 7 <uses-sdk 8 android:minSdkVersion="12" 9 android:targetSdkVersion="14" /> 10 11 <application 12 android:allowBackup="true" 13 android:icon="@drawable/ic_launcher" 14 android:label="@string/app_name" 15 android:theme="@style/AppTheme" > 16 <activity 17 android:name="com.example.helloworld.MainActivity" 18 android:label="@string/app_name" > 19 <intent-filter> 20 <action android:name="android.intent.action.MAIN" /> 21 22 <category android:name="android.intent.category.LAUNCHER" /> 23 </intent-filter> 24 </activity> 25 </application> 26 27 </manifest>AndroidManifest.xml
可以看到裡面註冊了一個Activity,我們找到Activity的相關代碼:
1 package com.example.helloworld; 2 3 import android.os.Bundle; 4 import android.app.Activity; 5 import android.view.Menu; 6 7 public class MainActivity extends Activity { 8 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_main); 13 } 14 15 @Override 16 public boolean onCreateOptionsMenu(Menu menu) { 17 // Inflate the menu; this adds items to the action bar if it is present. 18 getMenuInflater().inflate(R.menu.main, menu); 19 return true; 20 } 21 22 }MainActivity.xml
前面說過Activity是一切應用程式的門面,那麼在程式運行的時候是如何找到首先運行那個Activiy的就取決於AndroidManifest.xml中的intent-filter標簽中的兩句話。
再繼續看MainActivity的代碼可以發現所有Android的Activity必須繼承自Activity類。Activity類中有一個onCreate方法,該方法在Activity創建的過程中必須要被執行。
在MainActivity中通過setContentView(R.layout.activity_main); 來指定該Activity顯示的佈局。 這個佈局其實對應的是前面所講的res/layout目錄下的activity_main.xml。
該文件的源代碼如下:
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 tools:context=".MainActivity" > 10 11 <TextView 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:text="@string/hello_world" /> 15 16 </RelativeLayout>activity_main.xml
可以看到在該佈局文件中生命了一個TextView標簽,這個是Android的一種顯示文本的控制項,其中該控制項的android:text屬性指定顯示的文本內容。出於國際化和可服用的考慮,我們不推薦使用硬編碼字元串。所以可以看到該文件中指定的控制項顯示值為@string/hello_world。這其實表明這個字元串來自字元串資源文件:/values/strings.xml中的hello_world:
1 <?xml version="1.0" encoding="utf-8"?> 2 <resources> 3 4 <string name="app_name">Hello World</string> 5 <string name="action_settings">Settings</string> 6 <string name="hello_world">Hello world!</string> 7 8 </resources>strings.xml
其實可以發現AndroidManifest.xml 中也有對字元串資源的引用。
好了,至此終於瞭解了整個程式是整樣關聯運行的。簡單的來說必須要有AndroidManifest.xml 文件,這個文件配置了整個項目的Activity的相關信息,而Activity和該配置文件中引用到的相關資源文件,又需要在res路徑下進行配置。引用的方式:如果在java文件中通過類似R.string.hello_world的形式,而在xml中則通過 @string/hello_world 的形式進行引用。最後需要說明下res目錄下以drawable開頭的目錄的作用,這些子文件其實對應不同的分別率,目的是為了相容更多的設備,但有時美工可能只能提供一個版本的圖片,則是後全部放到drawable-hdpi目錄下即可。
過渡到下一個學習階段的兩點小技能:
1. 感覺第一個程式運行界面有點小丑,很重要的一個原因是因為上面還有一個標題欄,其實只要在onCreate方法的setContentView方法調用之前添加一句代碼就可以去掉這影響美觀的標題欄:
1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 requestWindowFeature(Window.FEATURE_NO_TITLE); 5 setContentView(R.layout.activity_main); 6 }onCreate
改動之後的運行結果如下:
2. 啟用logCat。起這個名字的絕對對tomcat有一定的鐘情。不然連記日誌都要用cat。Android的日誌記錄工具感覺使用超方便,功能巨強大。
主要日誌級別如下:
verbose:對應最低級別瑣碎型的日誌。
其他級別的從低到高依次是:debug--->info--->warn--->error.
而android的日誌使用方式簡單粗暴,記錄日誌的方法都是靜態方法,方法的名稱取不同日誌級別的第一個字母(剛好都不一樣)。傳入的參數第一個是tag,第二個是具體日誌信息。eg:
Log.v("HelloWorld", "This is verbose log of MainActivity!");
當然android還有一個很方便的列印出改行日誌處的調用堆棧信息的方法wtf(what the fAck?),這個方法感覺功能異常強大。
如果僅僅是能列印日誌的話,還不能說對以後代碼的調試有多少作用,不過eclipse裡面可是集成了一個很牛的android日誌查看神器,就是前面所說的需要打開的logCat視窗:
在這裡可以自定義過濾器,以及根據級別過濾等等。以後查看日誌就能更加有針對性了。
好了,Android之路的第一步結束!