Xamarin.Android活動的生命周期


一、前言

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

 

二、活動的生命周期

這里我們借助一張圖幫助我們理解:

 

當然很多人現在還看不懂這張圖,下面我們會逐一介紹:

 

1.OnCreate

這個方法是打開活動后第一個執行的事件,當然也是我們必須重寫的一個方法,其中它大致負責如下的事情:

l  創建視圖

l  初始化變量

l  將靜態變量綁定到列表

 

OnCreate擁有一個Bundle類型的參數bundle,這個參數至關重要,因為我們知道應用的生命周期不歸自己管,所以就意味隨時可能都會被終止,

所以我們就要能夠保存這中間用戶操作的數據,並在下次打開后能夠恢復回去,而這里的bundle參數就是用來將上一個實例中保存的數據傳遞進來,

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

 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 }
View Code

 

 

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

 

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 }
View Code

 

 

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 }
View Code

 

 

5.OnStop

當該活動長時間沒有在顯示給用戶下就會觸發,一般會由以下原因觸發:

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

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

l  活動被銷毀時

 

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

 

6.OnDestroy

該事件是整個活動生命周期中最后一個,但是很多情況下並不會執行到這個事件,所以很少重寫該方法。

 

7.OnRestart

當用戶通過Home按鈕將該用戶切換到后台,並在之后又打開該應用則會觸發該事件。一般也很少重寫該方法。

 

小節:

通過上面的介紹,我們可以明白活動中不是所有的事件都是有用的,其中比較常用的是OnCreate,OnResume,OnPause當然下面還會介紹專門用來保存用戶狀態的事件。

 

 

三、生命周期中狀態管理

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

 

通過這張圖我們可以看出,在應用從恢復到銷毀過程中將會觸發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 }
View Code

 

 

這里不用解釋,大家也知道,其實就是一個累加。現在我們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 }
View Code

 

 

我們接着點擊add:

 

然后翻轉:

 

還有一個OnRestoreInstanceState也可以用來恢復狀態,只是它會在OnStart之后執行。意味着它是在所有初始化完成之后進行的,而該方法的參數與OnCreate中的參數是一致的,所以不是常用該方法來恢復狀態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM