zoukankan      html  css  js  c++  java
  • 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 }

     

     

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

     

     

    三、生命周期中状态管理

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

     

    通过这张图我们可以看出,在应用从恢复到销毁过程中将会触发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中的参数是一致的,所以不是常用该方法来恢复状态。

  • 相关阅读:
    对C++类的继承和派生的理解
    排序算法 之 归并排序
    排序算法 之 冒泡排序
    排序算法 之 选择排序
    排序算法 之 插入排序
    排序算法 之 快速排序
    进程和线程
    C++ 之 强制转换
    C++ 之 智能指针
    C++ STL 之 分配器(allocator)
  • 原文地址:https://www.cnblogs.com/ShaYeBlog/p/4609429.html
Copyright © 2011-2022 走看看