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中的参数是一致的,因此不是经常使用该方法来恢复状态。

相关文章
相关标签/搜索