您的位置:首页 > 移动开发 > Android开发

Xamarin.Android开发实践(三)

2015-06-30 09:11 483 查看

一、前言

用过Android手机的人一定会发现一种现象,当你把一个应用置于后台后,一段时间之后在打开就会发现应用重新打开了,但是之前的相关的数据却没有丢失。可以看出app的“生命”是掌握在系统手上的,而不像Windows上开发的程序。

二、活动的生命周期

这里我们借助一张图帮助我们理解:

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方法。

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当然下面还会介绍专门用来保存用户状态的事件。

三、生命周期中状态管理

首先我们先用一张图来形容:

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之后如下所示:

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中的参数是一致的,所以不是常用该方法来恢复状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: