第4章(1) Android項目的基本結構,第4章android

來源:互聯網
上載者:User

第4章(1) Android項目的基本結構,第4章android

分類:C#、Android、VS2015;建立日期:2016-02-06 第4章 UI設計基礎

第3章雖然通過百度地圖應用展示了你可能感興趣的內容,但是,如果你是一個初學者,一開始就看懂和理解代碼可能會非常費勁。為瞭解決此問題,從這一章開始,本模組將從最基本的內容講起,帶你逐步進入用C#進行Android應用開發的樂園。 4.1 Android項目的基本結構

要用C#開發Android應用程式,首先需要對項目的基本結構有一個感性認識。如所示:

1、AndroidApp入口

Android應用程式使用的是單一入口,來源程式中並不能一眼看出程式從哪開始運行,當應用程式載入到記憶體中時,Android作業系統會自動從內部自訂的入口處開始運行該應用程式。這種獨特的架構可讓程式員設計的代碼直接和Android作業系統互動,但其缺點也很明顯:即使一個非常簡單的程式,也會變得很複雜。

為了方便找到程式進入點,當建立一個Android項目時,預設情況下,在MainActivity.cs檔案的特性聲明中通過“MainLauncher = true”表示程式從這個Activity開始執行:

[Activity(Label = "myDemos", MainLauncher = true)]

public class MainActivity : Activity

{

     //……

}

注意MainActivity.cs的首碼,一般表示它控制的是布局檔案Main.axml(但不是必須這樣做)。比如,如果把Main.axml改為First.axml,那麼它對應的Activity類最好命名為FirstActivity.cs,換言之,首碼只是為了方便查看它和介面的對應關係而已,這僅僅是一種命名習慣,而不是對檔案命名的必然要求。

實際上,你可以把“MainLauncher = true”放到任何一個繼承自Activity的類中。總之,你將其放到哪個類的特性聲明中,程式就從哪個Activity開始執行。 2、組件(Components)

在Android應用程式中,每個組件都是一個獨立的模組,但並不是所有組件都是使用者進入程式的真實入口,其中一些要依賴於其它組件。

Android內建了四種不同的應用程式組件:Activity、Service、Content Provider和Broadcast recevicer。除此之外,還可以自訂群組件並將其儲存到項目的Components檔案夾下。

在後面的章節中,還會專門介紹這些內容,這裡你只需要記住真正掌握Android應用開發技術,必須理解這些組件的含義和具體使用場合即可。 3、附件(Assets)

Assets檔案夾包含了運行App需要的所有原始檔案。該檔案夾下可儲存任意類型的檔案:text、xml、fonts、music、video、……等。

下面的代碼示範了如何讀取Assets下的.txt檔案:

using Android.App;using Android.OS;using Android.Widget;using System.IO;namespace MyTestProj{    [Activity(Label = "Activity1")]    public class Activity1 : Activity    {        protected override void OnCreate(Bundle savedInstanceState)        {            base.OnCreate(savedInstanceState);            base.OnCreate(savedInstanceState);            var textView1 = new TextView(this);            string content;            using (StreamReader sr = new StreamReader(Assets.Open("readme.txt")))            {                content = sr.ReadToEnd();            }            textView1.Text = content;            SetContentView(textView1);        }    }}

4、資源(Resources)

一個Android App由代碼、資源檔以及自訂的組件構成。

資源檔儲存到Resources檔案夾下,包括圖片,音頻檔案,以及任何與程式可見內容相關的東西。例如,自訂的動畫、菜單、風格、顏色以及由.axml檔案(帶設計介面)或.xml檔案(不帶設計介面)描述的使用者互動頁面的布局等。(1)基本概念

Resources檔案夾下儲存的資源不包括代碼檔案,而是指隨項目一起編譯和打包的除了代碼檔案之外的其他檔案,如聲音、視頻、映像、字串、布局檔案等。

將資源單獨組織的優點是:代碼分離,這樣就可以適用於多平台,同時也能在編譯時間進行檢查,並在編譯通過後為鍵入C#代碼提供智能提示。

使用資源可使修改程式的特徵變得很容易,同時不必修改代碼。而且通過可選擇的資源集合,能為不同的裝置配置最佳化程式(例如不同的國家語言和不同的螢幕尺寸等)。

系統搭建工具會自動為Android項目使用的每一個資源都定義一個唯一的整型ID,程式通過ID獲得代碼中的資源或者.xml或.axml中的其它資源的引用。例如,程式包含了一個名叫logo.png (儲存在 Resources/drawable/ 目錄下)的圖片檔案,工具就會產生一個叫做Resource.drawable.logo的資源ID,程式中可以用這個ID引用該圖片。

分隔資源的一個重要能力是為不同的裝置配置提供可選擇的資源檔。例如,在XML中定義UI字串,就可以把這些字串翻譯成其它的國家語言,並在分隔的檔案中分別儲存。然後,根據追加到資來源目錄名中的國家語言修飾符(例如res/values-fr/是法語字串的值)和使用者對國家語言的設定,Android系統就會提供適當的國家語言字串到UI中。

Android支援很多不同的修飾符以支援可選的資源。這些修飾符都是被加入到資來源目錄名中的簡短字串。這樣定義是為了定義裝置的特定配置,以保證這個目錄下的資源可能會被使用到。(2)常用資源

項目中常用的資源檔夾如下。(a)圖片資源

Drawable:儲存通用的圖片檔案。

drawable-ldpi:儲存低解析度手機專用的圖片檔案。

drawable-mdpi:儲存中等解析度手機專用的圖片檔案。

drawable-hdpi:儲存高解析度手機專用的圖片檔案。

drawable-xdpi:儲存超高解析度手機專用的圖片檔案。

drawable-xxdpi:儲存超超高解析度手機專用的圖片檔案。(b)布局檔案

layout檔案夾:用於儲存所有介面檔案(包括帶設計介面的.axml檔案和不帶設計介面的.xml檔案),如果你高興,可隨時將.xml更換為.axml,反之亦然。

Main.axml:預設的App主表單布局檔案,有Design和Source兩種模式。(c)字串資源檔

Values檔案夾:存放用字串描述的資源檔資訊(strings、integers、colors等),這些都是文本資源,在檔案夾中有一些約定的檔案名稱。(具體內容待以後詳解)(d)預設的資源類型

下表列出了預設的所有資源類型:

5、引用資源的方式

當將資源檔添加到項目中時,管道會自動將該資源描述添加到資源中,並自動產生對應的類(儲存在Resource.designer.cs檔案中),自動產生的類會為每個資源自動分配一個唯一的ID。

有兩種存取和管理資源的方式:

  • 用C#代碼引用資源。
  • 用xml或者axml引用資源。
方式1--在C#代碼中引用資源

格式:@[<PackageName>.]Resource.<ResourceType>.<ResourceName>

例如:

SetContentView(Resource.Layout.Main);EditText phoneNumberText = FindViewById<EditText>(Resource.Id.PhoneNumberText);
方式2--在xml(或者axml)中引用資源

格式:@[<PackageName>:]<ResourceType>/<ResourceName>

例如(見Main.axml檔案):

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"         android:orientation="vertical"         android:layout_width="fill_parent"         android:layout_height="fill_parent">    <ImageView android:id="@+id/myImage"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:src="@drawable/flag" /></LinearLayout>
6、備用資源(Alternate Resources)

備用資源也是儲存在Resources檔案夾下,子檔案夾的格式為:

<ResourceType>-<Qualifier>

即:<資源類型>-<限定標識符>

例如:drawable-hdpi

當有多個限定符時,各限定符之間用短劃線分隔。

限定符必須按下表列出的順序出現(該表實際是按優先順序從高到低排列):

例如,v11的目標是API level 11 (Android 3.0)裝置。.列出了Android的判斷規則:

7、使用權限設定與管理(AndroidManifest.xml)

清單(Manifest)可以定義應用程式及其組件的結構和中繼資料。

AndroidManifest.xml檔案包含在每個安卓應用程式中,該檔案向系統描述了本程式所包括的組件、所實現的功能、所能處理的資料、要請求的資源等。

該檔案的功能類似於網站中的Web.conig檔案。

在AndroidManifest.xml檔案中添加或刪除許可權時,最常用的是通過VS2015主菜單下的項目屬性來設定與許可權(Permissions)相關的屬性:

設定後,它會自動更新項目中Properties檔案夾下的AndroidManifest.xml檔案。如果項目的Properties檔案夾下不存在該檔案,系統會自動建立它。

在Android系統能夠啟動一個程式組件之前, 系統必須通過讀取程式的AndroidManifest.xml檔案來知道這個組件是否存在。因此對於Java開發人員要求程式必須在這個檔案中聲明它所有的組件。

除了聲明程式組件外,這個設定檔還做一些其它的工作,例如:

  • 確定程式需要哪些使用者權限,例如網路訪問或者讀取使用者的連絡人。
  • 聲明程式需要的最小的 API Level 這個要參照程式都使用了哪些API。
  • 聲明程式使用或要求的硬體和軟體特性,例如相機,藍芽服務,或者多點觸屏。
  • 程式需要連結的API類庫(除Android framework API之外的類庫),例如 Google Map類庫。

但是,如果用C#來開發,“直接在AndroidManifest.xml檔案中聲明”並不是必需的,因為用帶有智能提示的特性聲明來聲明它,然後讓編譯器自動產生合適的代碼添加到這個檔案中更方便。

當然,如果你希望直接在該檔案中添加聲明,也可以這樣做。換言之,C#開發給你提供了多種聲明清單的方式,你只需要按自己的習慣去選擇一種合適的方式即可。這些方式有:

  • 在AndroidManifest.xml檔案中直接添加聲明。
  • 通過項目的屬性視窗選擇,然後讓編譯器自動將合適的代碼添加到AndroidManifest.xml檔案中。
  • 在AssemblyInfo.cs檔案中聲明,然後讓編譯器自動自動將合適的代碼添加到AndroidManifest.xml檔案中。
  • 通過在類上方添加特性聲明來聲明,然後讓編譯器自動自動將合適的代碼添加到AndroidManifest.xml檔案中。

通過這些方式,你就擁有了最大的靈活性,同時也是代碼看起來簡潔而直觀,8、CPU架構(CPU Architectures)

VS2015偵錯模式(Debug)使用的是可適應多種CPU架構的模式,發布模式(Release)用於選擇某種具體型號的手機,然後部署。(1)如何指定支援的CPU架構

在調試狀態(Debug)下,下面的兩個選項預設是選中的:

這兩個選項選中後。可防止調試時指定某種具體的CPU架構(CPU Architectures),即在下面的配置中,下面這些選項是不可更改的:

通常情況下,實際發布應用程式時需要明確配置使用的CPU體繫結構或架構。當更改為發布(Release)模式時,它會自動不勾選“Use Shared Runtime”和“Use Fast Delployment…”複選框,這樣一來,中的選項就可選了。

Xamarin.Android提供下面的架構:

  • armeabi – 基於ARM的CPU系列,提供了不低於ARMv5TE結構的指令集。注意armeabi不是安全執行緒的而且不能用於多CPU的裝置。
  • armeabi-v7a – 這種CPU支援硬體浮點運算和多CPU(SMP)裝置。注意armeabi-v7a的機器碼無法在ARMv5裝置上運行。
  • arm64-v8a –這是一種基於64-bit ARMv8架構的CPU。
  • x86 – 這種CPU提供x86 (or IA-32)指令集。該指令集等價於奔騰Pro(Pentium Pro),包括MMX, SSE, SSE2,以及SSE3指令集。
  • x86_64 CPUs提供64-bit的x86指令集。

在Release模式下,Xamarin.Android預設指定的是armeabi-v7a,其效能比armeabi高。如果發布目標是64-bit ARM平台(例如Nexus 9),此時需要選擇arm64-v8a。如果發布到x86裝置,就選擇x86,如果發布目標是64-bit的CPU架構,就選擇x86_64。

注意:由於在64位架構上可運行32位程式(例如Nexs 9就是64-bit ARM裝置),因此,發布到64位手機裝置上的時候,不是必須選擇arm64-v8a或x86_64,仍然可以繼續選擇32位架構,這樣做的優點是可避免應用程式佔用過多的記憶體。(2)多平台目標(Targeting Multiple Platforms)

面向多平台的優點是可同時調試多種CPU,缺點是這會導致.apk檔案很大,如果希望減少.apk檔案的大小,發布時只選擇一個平台就行了。

注意:雖然在Xamarin.Android 5.1.x或更高版本中也可以體驗64位的功能,但實際發布時並不使用它。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.