一、前言

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

二、活动的生命周期

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

当然很多人现在还看不懂这张图,下面我们会逐一介绍:

1.OnCreate

这个方法是打开活动后第一个执行的事件,当然也是我们必须重写的一个方法,其中它大致负责如下的事情:

l  创建视图

l  初始化变量

l  将静态变量绑定到列表

OnCreate拥有一个Bundle类型的参数bundle,这个参数至关重要,因为我们知道应用的生命周期不归自己管,所以就意味随时可能都会被终止,

所以我们就要能够保存这中间用户操作的数据,并在下次打开后能够恢复回去,而这里的bundle参数就是用来将上一个实例中保存的数据传递进来,

从而恢复用户上次的状态。下面的代码简单的演示了如何从bundle中获取数据:

 protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle); string extraString;
bool extraBool; if (bundle != null)
{
intentString = bundle.GetString("myString");
intentBool = bundle.GetBoolean("myBool");
}
SetContentView(Resource.Layout.Main);
}

当OnCreate结束后,紧接着执行OnStart方法。

2.OnStart

OnStart将在OnCreate后由系统调用,该方法一般只有在需要在视图出现之前执行特地的任务,比如更新视图中显示的值。在该方法完毕之后将执行OnResume方法。

3.OnResume

当活动准备开始与用户交互时会触发该方法,一般只会在需要执行以下的操作时才重写该事件:

l  开始动画

l  开始监听GPS更新

l  显示一些相关的提示和对话框

l  注册广播监听

作为演示,下面是初始化照相机的代码:

 public void OnResume()
{
base.OnResume(); if (_camera==null)
{
// 初始化
}
}

OnResume非常重要,特别是在触发OnPause后。用户又切回应用,那么就需要OnResume进行恢复。所以接着就是OnPause事件。

4.OnPause

当活动被切换到后台时将触发该方法,一般我们需要在该事件做如下的事情:

l  保存用户未提交的数据

l  关闭或清除引用的资源

l  注销广播

l  如果存在正在显示的提示或者对话框,则必须利用.Dismiss()进行清除。

作为演示,下面的代码将把照相机资源进行释放:

 public void OnPause()
{
base.OnPause(); if (_camera != null)
{
_camera.Release();
_camera = null;
}
}

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文件,并写入如下代码:

     [Activity(Label = "Activity_Liftcycle", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
int count = ; private TextView tv; protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main); tv = FindViewById<TextView>(Resource.Id.textView1);
tv.Text = count.ToString();
Button btn = FindViewById<Button>(Resource.Id.button1);
btn.Click += (e, s) =>
{
count++;
tv.Text = count.ToString();
};
}
}

这里不用解释,大家也知道,其实就是一个累加。现在我们F5运行,然后点击几次Add之后如下所示:

然后我们选择模拟器,按下 Ctrl + F12 是不是发现模拟机翻转了,但是你也会发现数字变成了1:

如果你是在使用一个app,翻转之后出现这个样子,你一定会非常奇怪。当然你可能会想到使用静态变量,但是你考虑过一个实际情况没,

保存一个还好,如果很多呢。那会消耗更多的内存,而且也没有意义。所以这里我们就需要重写上面的OnSaveInstanceState方法,以

便保存当前用户的数据,下面将代码修改如下:

     [Activity(Label = "Activity_Liftcycle", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
int count = ; private TextView tv; protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main); //如果存在则恢复之前的状态
if (bundle != null)
{
count = bundle.GetInt("_count");
} tv = FindViewById<TextView>(Resource.Id.textView1);
tv.Text = count.ToString();
Button btn = FindViewById<Button>(Resource.Id.button1);
btn.Click += (e, s) =>
{
count++;
tv.Text = count.ToString();
};
} protected override void OnSaveInstanceState(Bundle outState)
{
base.OnSaveInstanceState(outState);
//保存当前状态
outState.PutInt("_count", count);
}
}

我们接着点击add:

然后翻转:

还有一个OnRestoreInstanceState也可以用来恢复状态,只是它会在OnStart之后执行。意味着它是在所有初始化完成之后进行的,而该方法的参数与OnCreate中的参数是一致的,所以不是常用该方法来恢复状态。

Xamarin.Android活动的生命周期的更多相关文章

  1. Android活动的生命周期

    掌握活动的生命周期对任何Android开发者来说都非常重要,当你深入理解活动的生命周期之后,就可以写出更加连贯流畅的程序. -------------------------------------- ...

  2. android 活动的生命周期

    掌握活动的生命周期非常重要,因为一个正常的android应用,会有很多的活动,如何在这些活动之间进行切换.数据的交互等,就经常会用到活动的生命周期这一块的知识.可以说,只要掌握了活动的生命周期,才能更 ...

  3. .NET跨平台开发之Xamarin.Android介绍与生命周期【2】

    前言 不同于IOS,Xamarin在Visual Studio中针对Android,可以很直接的去设计使用者界面,在本系列中,子浩会针对Android目录结构以及基本控制项进行介绍,包括TextVie ...

  4. 记不住的Android活动的生命周期

    Activity基类定义了管理一个互动的生命周期的一系列事件. Activity生命周期的一系列事件onCreate()——当前活动首次被创建时使用.onStart()——当前活动对用户可见时调用.o ...

  5. android ——活动的生命周期

    在其生命周期内,activity在运行.暂停和停止三种可能的状态间进行转换,不同状态之间互相转换的时候的调用不同的方法,重写这些方法就能在活动切换,被销毁时保存或传输数据,在被启动.被切换出来时接收数 ...

  6. Android笔记——活动的生命周期

    一.活动的重要性 掌握活动的生命周期对任何 Android 开发者来说都非常重要,当你深入理解活动的生命周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面,你会发挥的游刃有余.你的应 ...

  7. Android学习笔记(五)——活动的生命周期

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 为了能写出流畅连贯的程序,我们需要了解一下活动的生命周期. 一.返回栈 Android 中的活动是可以层叠的. ...

  8. Android studio教程:[5]活动的生命周期

    想要学好安卓开发,就必须理解安卓软件的生命周期,明白一个活动的创建.启动.停止.暂停.重启和销毁的过程,知道各个阶段会调用什么函数进行处理不同的情况,这里我就通过一个简单的例子让大家明白一个活动的生命 ...

  9. Android基础知识05—活动的生命周期

    ------ 活动的生命周期 ------ Android是使用任务Task来管理活动的,一个任务就是一组存放在栈里的活动的集合.每当启动一个活动 ,他就会在返回栈中入栈,并处于栈顶位置.而每当我们按 ...

随机推荐

  1. 理解Maven中的SNAPSHOT版本和正式版本

    Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制.在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个 ...

  2. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  3. Sublime的使用

    1.一个可扩展性强的编辑工具 2.如何安装扩展 通过View->Show Console菜单打开命令行. 按图操作: 在控制台输入,然后回车: import urllib.request,os; ...

  4. Node.js:path、url、querystring模块

    Path模块 该模块提供了对文件或目录路径处理的方法,使用require('path')引用. 1.获取文件路径最后部分basename 使用basename(path[,ext])方法来获取路径的最 ...

  5. 如何避免git每次提交都输入密码

    在ubuntu系统中,如何避免git每次提交都输入用户名和密码?操作步聚如下:1: cd 回车: 进入当前用户目录下:2: vim .git-credentials (如果没有安装vim 用其它编辑器 ...

  6. CSS 3学习——box-sizing和背景

    box-sizing 在CSS 2中设置元素的width和height仅仅是设置了元素内容区的宽和高,元素实际的尺寸是margin + border + padding + 内容区. CSS 3(截止 ...

  7. CSS知识总结(八)

    CSS常用样式 8.变形样式 改变元素的大小,透明,旋转角度,扭曲度等. transform : none | <transform-function> <transform-fun ...

  8. ASP.NET中常用的优化性能的方法

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池( ...

  9. 了解 ARDUINO 101* 平台

    原文链接 简介 作为一名物联网 (IoT) 开发人员,您需要根据项目的不同需求,选择最适合的平台来构建应用. 了解不同平台的功能至关重要. 本文第一部分比较了 Arduino 101 平台和 Ardu ...

  10. js分页页码算法

    function get_hs_page(cur_page, total_page) { var result = ""; ; i <= total_page; i++) { ...