Xamarin.Android開發實踐(三)

原文:Xamarin.Android開發實踐(三)html

1、前言

用過Android手機的人必定會發現一種現象,當你把一個應用置於後臺後,一段時間以後在打開就會發現應用從新打開了,可是以前的相關的數據卻沒有丟失。能夠看出app的「生命」是掌握在系統手上的,而不像Windows上開發的程序。app

 

2、活動的生命週期

這裏咱們藉助一張圖幫助咱們理解:

 

固然不少人如今還看不懂這張圖,下面咱們會逐一介紹:

 

1.OnCreate

這個方法是打開活動後第一個執行的事件,固然也是咱們必須重寫的一個方法,其中它大體負責以下的事情:ide

l  建立視圖post

l  初始化變量動畫

l  將靜態變量綁定到列表url

 

OnCreate擁有一個Bundle類型的參數bundle,這個參數相當重要,由於咱們知道應用的生命週期不歸本身管,因此就意味隨時可能都會被終止,spa

因此咱們就要可以保存這中間用戶操做的數據,並在下次打開後可以恢復回去,而這裏的bundle參數就是用來將上一個實例中保存的數據傳遞進來,3d

從而恢復用戶上次的狀態。下面的代碼簡單的演示瞭如何從bundle中獲取數據:code

 
 1 protected override void OnCreate(Bundle bundle)  2 {  3 base.OnCreate(bundle);  4  5 string extraString;  6 bool extraBool;  7  8 if (bundle != null)  9  { 10 intentString = bundle.GetString("myString"); 11 intentBool = bundle.GetBoolean("myBool"); 12  } 13  SetContentView(Resource.Layout.Main); 14 }

 

 

當OnCreate結束後,緊接着執行OnStart方法。xml

 

2.OnStart

OnStart將在OnCreate後由系統調用,該方法通常只有在須要在視圖出現以前執行特意的任務,好比更新視圖中顯示的值。在該方法完畢以後將執行OnResume方法。

 

3.OnResume

當活動準備開始與用戶交互時會觸發該方法,通常只會在須要執行如下的操做時才重寫該事件:

l  開始動畫

l  開始監聽GPS更新

l  顯示一些相關的提示和對話框

l  註冊廣播監聽

 

做爲演示,下面是初始化照相機的代碼:

 
1 public void OnResume() 2 { 3 base.OnResume(); 4 5 if (_camera==null) 6  { 7 // 初始化 8  } 9 }
 

 

OnResume很是重要,特別是在觸發OnPause後。用戶又切迴應用,那麼就須要OnResume進行恢復。因此接着就是OnPause事件。

 

4.OnPause

當活動被切換到後臺時將觸發該方法,通常咱們須要在該事件作以下的事情:

l  保存用戶未提交的數據

l  關閉或清除引用的資源

l  註銷廣播

l  若是存在正在顯示的提示或者對話框,則必須利用.Dismiss()進行清除。

 

做爲演示,下面的代碼將把照相機資源進行釋放:

 
 1 public void OnPause()  2 {  3 base.OnPause();  4  5 if (_camera != null)  6  {  7  _camera.Release();  8 _camera = null;  9  } 10 }

 

 

5.OnStop

當該活動長時間沒有在顯示給用戶下就會觸發,通常會由如下緣由觸發:

l  當一個新的活動打開,並覆蓋該活動時

l  一個已存在的活動切換到前臺時

l  活動被銷燬時

 

OnStop不是每次都會被執行,若是內存低下時,系統將不會執行該事件,而是直接關閉該應用,因此你們在OnPause事件中就要保存好因此的參數等等。而不能依賴該事件。

 

6.OnDestroy

該事件是整個活動生命週期中最後一個,可是不少狀況下並不會執行到這個事件,因此不多重寫該方法。

 

7.OnRestart

當用戶經過Home按鈕將該用戶切換到後臺,並在以後又打開該應用則會觸發該事件。通常也不多重寫該方法。

 

小節:

經過上面的介紹,咱們能夠明白活動中不是全部的事件都是有用的,其中比較經常使用的是OnCreate,OnResume,OnPause固然下面還會介紹專門用來保存用戶狀態的事件。

 

 

3、生命週期中狀態管理

首先咱們先用一張圖來形容:

 

經過這張圖咱們能夠看出,在應用從恢復到銷燬過程當中將會觸發onSaveInstanceState方法,而在應用打開後則會觸發onRestoreInstanceState方法。下面咱們經過一個實際的例子來講明:

 

咱們先經過一個簡單的例子來揭示,若是咱們不保存當前用戶的狀態會出現什麼狀況:

首先新建一個Android項目,而後打開Main.axml,拖拽一個Text(Large),並在下方拖拽一個Button,設置Button的Text爲add,而後生成一遍。

 

打開MainActivity.cs文件,並寫入以下代碼:

 
 1     [Activity(Label = "Activity_Liftcycle", MainLauncher = true, Icon = "@drawable/icon")]  2 public class MainActivity : Activity  3  {  4 int count = 1;  5  6 private TextView tv;  7  8 protected override void OnCreate(Bundle bundle)  9  { 10 base.OnCreate(bundle); 11  SetContentView(Resource.Layout.Main); 12 13 tv = FindViewById<TextView>(Resource.Id.textView1); 14 tv.Text = count.ToString(); 15 Button btn = FindViewById<Button>(Resource.Id.button1); 16 btn.Click += (e, s) => 17  { 18 count++; 19 tv.Text = count.ToString(); 20  }; 21  } 22 }
 

 

 

這裏不用解釋,你們也知道,其實就是一個累加。如今咱們F5運行,而後點擊幾回Add以後以下所示:

 

而後咱們選擇模擬器,按下 Ctrl + F12 是否是發現模擬機翻轉了,可是你也會發現數字變成了1:

 

若是你是在使用一個app,翻轉以後出現這個樣子,你必定會很是奇怪。固然你可能會想到使用靜態變量,可是你考慮過一個實際狀況沒,

保存一個還好,若是不少呢。那會消耗更多的內存,並且也沒有意義。因此這裏咱們就須要重寫上面的OnSaveInstanceState方法,以

便保存當前用戶的數據,下面將代碼修改以下:

 
 1     [Activity(Label = "Activity_Liftcycle", MainLauncher = true, Icon = "@drawable/icon")]  2 public class MainActivity : Activity  3  {  4 int count = 1;  5  6 private TextView tv;  7  8 protected override void OnCreate(Bundle bundle)  9  { 10 base.OnCreate(bundle); 11  SetContentView(Resource.Layout.Main); 12 13 //若是存在則恢復以前的狀態 14 if (bundle != null) 15  { 16 count = bundle.GetInt("_count"); 17  } 18 19 tv = FindViewById<TextView>(Resource.Id.textView1); 20 tv.Text = count.ToString(); 21 Button btn = FindViewById<Button>(Resource.Id.button1); 22 btn.Click += (e, s) => 23  { 24 count++; 25 tv.Text = count.ToString(); 26  }; 27  } 28 29 protected override void OnSaveInstanceState(Bundle outState) 30  { 31 base.OnSaveInstanceState(outState); 32 //保存當前狀態 33 outState.PutInt("_count", count); 34  } 35 }
 

 

 

咱們接着點擊add:

 

而後翻轉:

 

還有一個OnRestoreInstanceState也能夠用來恢復狀態,只是它會在OnStart以後執行。意味着它是在全部初始化完成以後進行的,而該方法的參數與OnCreate中的參數是一致的,因此不是經常使用該方法來恢復狀態。

相關文章
相關標籤/搜索