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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...