1. 從系統架構到Hello World

来源:http://www.cnblogs.com/Kidezyq/archive/2016/04/02/5348083.html
-Advertisement-
Play Games

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

   

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.淺複製VS深複製 本文中的複製也可以稱為拷貝,在本文中認為複製和拷貝是相同的意思。另外,本文只討論js中複雜數據類型的複製問題(Object,Array等),不討論基本數據類型(null,undefined,string,number和boolean),這些類型的值本身就存儲在棧記憶體中(stri ...
  • 相信大家對於JSON應該不陌生,度娘對這個名詞的解釋大致如下: “JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。因為採用獨立於語言的文本格式,也使用了類似於C語言家族的習慣,擁有了這些特性使JSON成為理想的數據交 ...
  • 第4章,jQuery中的事件和動畫 註意:使用的jQuery版本為1.7.1 jQuery中的事件 JavaScript中通常使用window.onload方法,jQuery中使用$(document).ready()方法。 1、執行時機 window.onload方法在網頁所有元素都載入完畢之後才 ...
  • 1 設置延時, 超過該延時未移入彈窗則彈窗隱藏 Tooltip.prototype.init = function{中的 var triggers = this.options.trigger.split(' ')後面加上 2 控制不消失代碼 在Tooltip.prototype.enter = f ...
  • × 目錄 [1]列寬 [2]列數 [3]列間距[4]列rule[5]跨列[6]列填充[7]多列 前面的話 CSS新增了多列佈局特性,可以讓瀏覽器確定何時結束一列和開始下一列,無需任何額外的標記。簡單來說,就是CSS3多列佈局可以自動將內容按指定的列數排列,這種特性實現的佈局效果和報紙、雜誌類排版非常 ...
  • 第八章 1、 當父元素設置position:relative的時候,子元素設置position:absolute。這個子元素設置在父元素的任何位置。 第九章 1、 對可視區進行糾正,通知瀏覽器使用移動設備的寬度作為可視區的寬度,禁止用戶放大縮小 <metaname="viewport" conten ...
  • 一,移動端寬度設置viewport視圖視窗,<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">,視窗寬度=設備寬度,預設縮放=1,不允許用戶縮放。 二,flexbox,彈性盒子模型: ...
  • 首先來瞭解什麼包含塊,css包含塊是css標準佈局中的一個重要的概念,它是絕對定位的基礎。包含塊就是為絕對定位元素提供坐標偏移和顯示範圍的參照物,即確定絕對定位的偏移起點和百分比長度的參考。 由於ie瀏覽器在解析多層包含時會存在一些問題,在ie瀏覽器中只有當絕對定位的元素擁有層特征時才能準確解析,層 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...