Xamarin.Android開發

使用 Visual Studio 生成第一個 Xamarin.Android 應用程序,並進一步瞭解使用 Xamarin 進行 Android 應用程序開發的基礎知識。在此過程當中,會介紹生成和部署 Xamarin.Android 應用程序所需的工具、概念和步驟。html

第 1 部分:快速入門

在本指南的第一部分,用戶將建立一個應用程序,該應用程序可將用戶輸入的字母數字電話號碼轉換爲數字電話號碼,而後呼叫該號碼。android

第 2 部分:深刻了解

在本文檔的第二部分,用戶將回顧生成的應用程序,並從根本上了解 Android 應用程序的工做原理。git

查看項目中的項,查看每一個文件夾及其用途:github

  • 屬性 – 包含 AndroidManifest.xml 文件,該文件描述了對 Xamarin.Android 應用程序的全部要求(包括名稱、版本號和權限)。 Properties 文件夾還包括.NET 程序集元數據文件 AssemblyInfo.cs。 最好在此文件中填寫一些應用程序相關的基本信息。編程

  • 引用 – 包含生成和運行應用程序所需的程序集。 若是展開「引用」目錄,可查看對 .NET 程序集(如 System、System.Core 和 System.Xml)的引用以及對 Xamarin 的 Mono.Android 程序集的引用。windows

  • 資產 – 包含應用程序須要運行的文件(包括字體、本地數據文件和文本文件)。 此處包括的文件可經過生成的 Assets 類訪問。 有關 Android 資產的詳細信息,請參閱 Xamarin 使用 Android 資產指南。api

  • 資源 – 包含應用程序資源,例如字符串、圖像和佈局。 能夠經過生成的 Resource 類訪問代碼中的這些資源。 Android 資源指南提供有關「資源」 目錄的更多詳細信息。 應用程序模板在 AboutResources.txt 文件中還包含有「資源」的簡明指南。瀏覽器

一、資源

「資源」目錄包含 4 個文件夾(drawable、layout、mipmap 和 values),還有一個名爲 Resource.designer.cs 的文件 。緩存

下表總結了這些項:app

  • drawable – 可繪製目錄包含可繪製資源,如圖像和位圖。

  • mipmap – mipmap 目錄包含適用於不一樣啓動器圖標密度的可繪製文件。 在默認模板中,drawable 目錄包含應用程序圖標文件「Icon.png」 。

  • layout – 佈局目錄包含 Android 設計器文件 (.axml),該文件定義每一個屏幕或活動的用戶界面。 該模板建立名爲 activity_main.axml 的默認佈局 。
  • values – 此目錄包含存儲簡單值(如字符串、整數和顏色)的 XML 文件。 該模板建立名爲 Strings.xml 的文件,用於存儲字符串值。

  代碼中使用:

string info = this.Resources.GetString(Resource.String.button_bundle_info);
  • Resource.designer.cs – 也稱爲 Resource 類,此文件是一個分部類,存放分配給每一個資源的惟一 ID。 它由 Xamarin.Android 工具自動建立,並在必要時從新生成。 不該手動編輯此文件,由於 Xamarin.Android 將覆蓋對其進行的任何手動更改。

二、應用基礎知識和體系結構基礎知識

Android 應用程序不具備單一入口點;也就是說,應用程序中沒有操做系統可調用來啓動該應用程序的任何代碼行。 相反,當 Android 實例化應用程序的一個類時,會啓動該應用程序,在此期間 Android 將整個應用程序的進程加載到內存中。

設計複雜應用程序或與 Android 操做系統交互時,Android 的這一特有功能極其有用。 可是,這些選項也使 Android 在處理 Phoneword 應用程序等基本方案時變得複雜。 出於此緣由,分兩種狀況來探索 Android 體系結構。 本指南剖析使用 Android 應用最多見入口點(第一個屏幕)的應用程序。 瞭解 Android 多屏幕中,討論了以不一樣方式啓動應用程序,全面探討了 Android 體系結構的複雜性。

在仿真器或設備中首次打開 Phoneword 應用程序時,操做系統會建立第一個活動 。 活動是特殊的 Android 類,對應於單個應用程序屏幕,負責繪製和支持用戶界面。 Android 建立應用程序的第一個Activity時,會加載整個應用程序

活動負載

因爲 Android 應用程序中沒有線性發展(能夠經過多個點啓動應用程序),Android 採用一種獨特方式來跟蹤哪些類和文件組成應用程序。 在 Phoneword 示例中,將向名爲「Android 清單」 的特殊 XML 文件註冊組成應用程序的全部部分。 「Android 清單」 的做用是跟蹤應用程序的內容、屬性和權限,並將這些信息告知 Android 操做系統。 能夠將 Phoneword 應用程序看成單一活動(屏幕)和由 Android 清單文件捆綁在一塊兒的資源文件和幫助程序文件的集合,如如下關係圖所示:

資源幫助程序

如下幾個部分將探索 Phoneword 應用程序各部分的關係;使你能更好地理解上面的關係圖。 此探索先從用戶界面開始,會討論 Android 設計器和佈局文件。

三、用戶界面

activity_main.axml 是應用程序中第一個屏幕的用戶界面佈局文件 。 .axml 指示這是 Android 設計器文件(AXML 表示 Android XML。 名稱 Main 對 Android 而言是任意的 – 可將佈局文件命名爲其餘名稱。 在 IDE 中打開 activity_main.axml 時,會顯示名爲「Android Designer」的 Android 佈局文件的可視編輯器 :

TranslateButton 的 ID 設置爲 @+id/TranslateButton

設置 TranslateButton 的 id 屬性時,Android Designer 會將 TranslateButton 控件映射到 Resource 類,併爲其分配 TranslateButton 的資源 ID 。 經過將可視控件映射到類,能夠找到並使用 TranslateButton 和應用代碼中的其餘控件。 當你剖析爲控件提供支持的代碼時,會更詳細地瞭解這一內容。 此時,只需知道控件的代碼表示形式是經過 id 屬性連接到設計器中控件的可視表示形式便可

源視圖

在設計界面上定義的全部內容都會轉換成 XML,以供 Xamarin.Android 使用。 Android 設計器提供源視圖,此源視圖包含從可視化設計器生成的 XML。 能夠切換到設計器視圖左下角的「源」 面板以查看此 XML

四、活動和活動生命週期

Activity 類包含爲用戶界面提供支持的代碼。 activity負責響應用戶交互,並建立動態用戶體驗。 本部分將介紹 Activity 類,討論活動生命週期,並剖析爲 Phoneword 應用程序中的用戶界面提供支持的代碼。

  • Activity 類

Phoneword 應用程序只有一個屏幕(活動)。爲屏幕提供支持的類稱爲 MainActivity,位於 MainActivity.cs 文件中。 名稱 MainActivity 在 Android 中沒有特別的意義 – 雖然約定是命名應用程序 MainActivity 中的第一個活動,但 Android 並不在乎將其命名爲其餘名稱。

打開 MainActivity.cs 時,能夠看到,MainActivity 類是 Activity 類的子類 而且活動標有 Activity 屬性:

Activity 屬性向 Android 清單註冊活動;這能讓 Android 知道此類是該清單所管理的 Phoneword 應用程序的一部分

Label 屬性設置將顯示在屏幕頂部的文本。【在values文件夾下的string.xml中管理】

MainLauncher 屬性告知 Android 在啓動應用程序時顯示此活動。 瞭解 Android 多屏幕指南中所述,當你嚮應用程序添加更多活動(屏幕)時,此屬性會變得很重要。

  • 活動生命週期

在 Android 中,活動會根據與用戶的交互經歷生命週期的不一樣階段。 能夠對活動進行建立、啓動和暫停、恢復和銷燬等操做。 Activity 類包含方法,系統會在屏幕生命週期的特定時間點調用這些方法。 

經過重寫 Activity 生命週期方法,能夠控制活動的加載方式和與用戶的互動方式,甚至還能夠控制活動從設備屏幕消失後會發生的狀況。 例如,能夠重寫上圖中的生命週期方法,以執行如下重要任務:

  • OnCreate – 建立視圖、初始化變量,並執行在用戶能看到活動以前其餘必須完成的準備工做。 只有將活動加載到內存時,纔會調用此方法一次。【向用戶顯示屏幕以前】

  • OnResume – 執行每當活動返回到設備屏幕時必須發生的任何任務。【從主屏幕再次回到app,非第一次】

  • OnPause – 執行每當活動離開設備屏幕時必須發生的任何任務。【單擊home鍵,離開app時】

向 Activity 中的生命週期方法添加自定義代碼時,重寫 該生命週期方法的基實現 。 能夠利用現有的生命週期方法(已在其中附加了一些代碼)並使用本身的代碼來擴展該方法。 從方法內調用基實現,確保原始代碼在新代碼以前運行。 下一部分對此提供示例說明。

活動生命週期是 Android 中一個重要且複雜的部分。 完成_入門_系列後,若是想要了解有關活動的詳細信息,請閱讀活動生命週期指南。 本指南下一步的重點是活動生命週期的第一個階段 - OnCreate

OnCreate

protected override void OnCreate (Bundle bundle)
{
    base.OnCreate (bundle);

    // Set our view from the "main" layout resource
    SetContentView (Resource.Layout.Main);
    // Additional setup code will go here
}

Bundle:從字符串值到各類可打包類型的映射

OnCreate中加載在 Android Designer 中建立的用戶界面。 若要加載 UI,請調用 SetContentView 並向其傳遞佈局文件的資源佈局名稱:activity_main.axml 。 佈局位於 Resource.Layout.activity_main

當 MainActivity 開始運行後,會基於 activity_main.axml 文件的內容建立一個視圖 。

準備好佈局文件後,能夠開始查找控件。 若要查找控件,請調用 FindViewById,並傳入控件的資源 ID。

 // Get our UI controls from the loaded layout
            EditText phoneNumberText = FindViewById<EditText>(Resource.Id.PhoneNumberText);
            TextView translatedPhoneWord = FindViewById<TextView>(Resource.Id.TranslatedPhoneword);
            Button translateButton = FindViewById<Button>(Resource.Id.TranslateButton);

如今佈局文件中已具備對控件的引用,能夠開始對其進行編程,以響應用戶交互。

響應用戶交互

在 Android 中, Click 事件偵聽用戶的觸控。 在此應用中,Click 事件將由 lambda 處理,不過也可改用委託或命名事件處理程序。

translateButton.Click += (sender, e) =>
            {
                // Translate user's alphanumeric phone number to numeric
                string translatedNumber = PhoneTranslator.ToNumber(phoneNumberText.Text);
                if (string.IsNullOrWhiteSpace(translatedNumber))
                {
                    translatedPhoneWord.Text = string.Empty;
                }
                else
                {
                    translatedPhoneWord.Text = translatedNumber;
                }
            };

爲不一樣的屏幕密度設置圖標

Android 設備具備不一樣的屏幕大小和分辨率,不是全部圖像都能清晰顯示在屏幕上。

考慮到這一點,最好將不一樣分辨率的圖標添加到 Resources 文件夾。 Android 提供了不一樣版本的 mipmap 文件夾來處理不一樣密度的啓動器圖標,包括針對中等密度屏幕的 mdpi、針對高密度屏幕的 hdpi,以及針對超高密度屏幕的 xhdpi、xxhdpi 和 xxxhdpi 。 不一樣大小的圖標存儲在相應的 mipmap- 文件夾中 。

各文件夾下:

ic_launcher:桌面圖標【能夠在設置->更多->應用程序中查看】,

ic_launcher_background:背景圖,

ic_launcher_foreground:前景圖,

ic_launcher_round:圓形圖【屏幕上的】,

並不是每一個人都具備可用於建立自定義圖標和啓動圖像(讓應用不同凡響)的設計器。下面是幾種生成自定義應用圖像的備選方法:

  • Android Asset Studio – 是一個基於 Web 的瀏覽器生成器,針對全部類型 Android 圖標,帶有其餘有用社區工具的連接。 在 Google Chrome 中性能最佳。

  • Visual Studio – 能夠用於直接在 IDE 中爲應用建立簡單圖標集。

  • Glyphish – 可免費下載和購買的高質量預生成圖標集。

  • Fiverr – 從各類設計器中進行選擇以便爲你建立圖標集(最低 5 美圓)。 能夠漫無目標,不過若是須要動態設計的圖標,這是很好的資源。

有關圖標大小和要求的詳細信息,請參閱 Android 資源指南。

應用程序基礎知識

可訪問性

API級別

一、Android資源

 

 

新增長資源:eg,my_image_name .png【約定用下劃線,小寫】,並將其生成操做設置爲:Android資源

 

二、活動生命週期方法

一個Activity活動就是一個界面的佈局。參考:onResume何時執行,執行幾回的問題

程序正常啓動時:onCreate()->onStart()->onResume();
onCreate()在活動第一次建立時被調用,主要用於加載佈局
onStart()這個方法在活動由不可見變爲可見的時候調用。
onResume這個方法在活動準備好和用戶進行交互的時候調用。此時的活動必定位於返回棧的棧頂,而且處於運行狀態。

 

三種調用的場景:
一個Activity啓動另外一個Activity: onPause()->onStop(),    再返回:onRestart()->onStart()->onResume()
程序按back 退出: onPause()->onStop()->onDestory(),再進入:onCreate()->onStart()->onResume();
程序按home 退出: onPause()->onStop(),                    再進入:onRestart()->onStart()->onResume();

OnCreate

OnCreate是建立活動時要調用的第一個方法。 OnCreate始終會重寫,以執行活動可能須要的任何啓動初始化,如:

  • 建立視圖
  • 初始化變量
  • 將靜態數據綁定到列表

OnCreate採用一個綁定參數,該參數是在綁定不爲 null 時用於存儲和傳遞狀態信息和活動之間的對象的字典,這表示活動正在從新啓動,應從上一個實例還原其狀態。

OnStart

OnCreate 完成後 , 系統始終會調用 OnStart。 若是活動在活動可見以前須要執行任何特定的任務,例如刷新活動中視圖的當前值,則活動可能會重寫此方法。 調用此方法以後Android 將當即調用OnResume

OnResume

當活動準備好開始與用戶交互時,系統將調用OnResume 【Activity 開始跟用戶交互以前會調用 onResume()】。 活動應重寫此方法以執行以下任務:

  • 斜向上幀速率(遊戲開發中的常見任務)
  • 開始動畫
  • 偵聽 GPS 更新
  • 顯示任何相關的警報或對話框
  • 鏈接外部事件處理程序

 

OnPause

當系統要將活動放入背景中或活動被部分遮蓋時,將調用OnPause 。 若是活動須要,則應重寫此方法:

  • 提交永久性數據的未保存更改

  • 銷燬或清理使用資源的其餘對象

  • 增長幀速率和暫停動畫

  • 註銷外部事件處理程序或通知處理程序(即綁定到服務的程序)。 必須執行此操做以防止活動內存泄露。

  • 一樣,若是活動顯示了任何對話框或警報,則必須用.Dismiss()方法對其進行清理。

在調用OnPause後,可能會調用如下兩個方法:

一、OnResume:if the Activity is to be returned to the foreground.

二、OnStop:if the Activity is being placed in the background

OnStop

當用戶再也不顯示該活動時,將調用OnStop 。 發生如下狀況之一時,會發生這種狀況:

  • 正在啓動新活動,並覆蓋此活動。
  • 現有活動將進入前臺。
  • 正在銷燬活動。

OnDestroy

OnDestroy是在將其銷燬並從內存中徹底刪除以前,在活動實例上調用的最終方法。

Most Activities will not implement this method because most clean up and shut down has been done in the OnPause and OnStop methods【大多數Activity不會實現/重寫這個方法】

The OnDestroy method is typically overridden to clean up long running resources that might leak resources.【一般會重寫OnDestroy方法來清理長時間運行的可能會泄漏的資源,例如 在OnCreate中啓動的後臺線程】

OnRestart

There are no general guidelines for what kind of logic should be implemented in OnRestart. This is because OnStart is always invoked regardless of whether the Activity is being created or being restarted, so any resources required by the Activity should be initialized in OnStart, rather than OnRestart

【對於應該在OnRestart中實現哪一種邏輯,沒有通用的指導原則。這是由於不管正在建立活動仍是從新啓動活動,都始終調用OnStart,所以活動所需的任何資源都應該在OnStart中初始化,而不是在OnRestart中初始化】

三、Back vs. Home

程序按back 退出: onPause()->onStop()->onDestory(),再進入:onCreate()->onStart()->onResume();
程序按home 退出: onPause()->onStop(),                    再進入:onRestart()->onStart()->onResume();

按Back鍵會銷燬程序,home不會,只是退到後臺線程。

四、Managing State Throughout the Lifecycle

在中止或者銷燬時,系統提供一種保存狀態(實例狀態)的機會,三種方式:

  • android採用稱之爲Bundle的字典(key/value) 來保存原始值
  • Creating a custom class that will hold complex values such as bitmaps.
  • 繞過配置更改生命週期,並承擔維護活動狀態的所有責任。

4.一、Bundle介紹

Bundle不適合與保存複雜數據(如 位圖)

活動提供一些方法來幫助在捆綁包中保存和檢索實例狀態:

  • OnSaveInstanceState–此操做由 Android 在活動被銷燬時調用。 若是活動須要保留任何鍵/值狀態項,則這些活動能夠實現此方法。

  • OnRestoreInstanceState–此OnCreate方法在方法完成後被調用,併爲活動提供了在初始化完成後恢復其狀態的另外一種機會。

1.OnSaveInstanceState

當活動正在中止時,將調用OnSaveInstanceState 。 它將接收一個捆綁參數,活動可在其中存儲其狀態。 當設備遇到配置更改時【例如 改變屏幕方向,橫屏豎屏】,活動可使用Bundle傳入的對象經過重寫OnSaveInstanceState來保留活動狀態。

保存活動中的暫時性數據【eg 計數器】,而控件的Text值不會改變。

參考:onSaveInstanceState()和onRestoreInstanceState()使用詳解

 

 當系統開始中止您的Activity時,它會調用onSaveInstanceState()(1),以便您能夠指定要保存的其餘狀態數據,以防Activity必須從新建立實例。若是Activity被破壞而且必須從新建立相同的實例,則系統將(1)中定義的狀態數據傳遞給onCreate()方法(2)和onRestoreInstanceState()方法(3)。

注意
一、若是是用戶自動按下Home鍵,是不會觸發onSaveInstanceState()和onRestoreInstanceState()的。
二、每次用戶旋轉屏幕時,您的Activity將被破壞並從新建立。當屏幕改變方向時,系統會破壞並從新建立前臺Activity,由於屏幕配置已更改,您的Activity可能須要加載替代資源(例如佈局)。即會執行onSaveInstanceState()和onRestoreInstanceState()的。

2.OnRestoreInstanceState

還原狀態,通常在OnCreate中還原狀態,而不用重寫OnRestoreInstanceState。

4.2 保存複雜數據

經過重寫OnRetainNonConfigurationInstance並返回包含要保存的數據的Java.Lang.Object實例來保存數據。 使用OnRetainNonConfigurationInstance保存狀態有兩個主要優勢:

  • OnRetainNonConfigurationInstance返回的對象對更大、更復雜的數據類型執行良好的工做,由於內存會保留此對象。

  • OnRetainNonConfigurationInstance方法將按需調用,而且僅在須要時調用。 這比使用手動緩存更經濟。

 

五、Service

  • 綁定服務

實現和使用綁定服務

爲了使 Android 應用程序使用綁定的服務,必須實現如下

  1. 新建服務。擴展Service類並實現生命週期回調方法 –此類將包含執行服務所需工做的代碼。【eg:一個告訴用戶服務啓動的時間和運行時間的方法api】
  2. 建立一個實現IServiceConnection接口的類,這個接口提供供Android 調用的回調方法(OnServiceConnected),以便在服務鏈接發生更改時通知客戶端,eg:客戶端已鏈接或斷開鏈接到服務.。服務鏈接還將提供對對象(Binder)的引用,客戶端可以使用該對象直接與服務交互。 
  3. 建立一個實現IBinder接口的類, IBinder接口提供了客戶端用來與服務進行通訊的 API。 Binder 能夠提供對綁定服務的引用、容許直接調用方法或Binder 能夠提供一個客戶端 API,用於封裝和隱藏應用程序中的綁定服務。 IBinder必須提供遠程過程調用所需的代碼。 不須要(或建議)直接實現IBinder接口。 相反,應用程序應該擴展Binder類型,它提供IBinder所需的大部分基本功能。
  4. 啓動Activity並綁定到服務。一旦 service connection, binder, and service 被建立,Android 應用程序負責啓動該服務並將其綁定到它。

相關文章
相關標籤/搜索