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

  • 相关阅读:
    ORACLE 查看进程数,已执行任务数, 剩余任务数,删除指定任务
    ORACLE 收集统计整个用户数据
    解决Hystrix dashboard Turbine 一直 Loading…… 及其他坑
    利用 Maven 构造 Spring Cloud 微服务架构 模块使用 spring Boot构建
    AES加解密
    JAVA POI XSSFWorkbook导出扩展名为xlsx的Excel,附带weblogic 项目导出Excel文件错误的解决方案
    JAVA 文件的上传下载
    shell启停服务脚本模板
    JAVA 设计模式之 原型模式详解
    JAVA 设计模式之 工厂模式详解
  • 原文地址:https://www.cnblogs.com/ShaYeBlog/p/4609429.html
Copyright © 2011-2022 走看看