1. 從系統架構到Hello World


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之路的第一步結束!

   

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com