1. 概述
Activity是Android中特有的概念,一般的编程语言都是从Main函数作为入口,但是Android可以从任何注册过的Activity进入程序,大多数Android只有一个专门的Activity作为入口,但是,如果程序挂了,或者被操作系统终止了的时候,系统会试着重启程序最后打开的Activity。另外,系统可能会暂停处于不活跃状态的Activity,当内存不够用的时候会回收掉它们。如果想要程序重启的时候能够正确的恢复数据,那就需要精心考虑。
Activity的生命周期是一组事件方法,当状态改变时会被系统调用。这些方法允许开发者为了满足状态和资源的管理去实现一些功能。
对于开发者来说极其重要的是要考虑哪些方法需要暴露出来去实现,如果这些考虑的不好可能会导致程序不稳定,挂掉,资源浪费,以及操作系统的不稳定。
2.生命周期
Android系统使用一个优先级队列来协助管理Activity的运行。基于规定的一个特殊Activity,会被系统指定一个优先级,这个优先级帮助Android识别不再使用的Activity,帮助系统回收内存和资源,下面的图表说明了Activity生命周期的各种状态:
活跃状态或运行状态 --
Activity在前台时被认为是活跃或运行,或者说在Activity栈的顶端。这时这个Activity的优先级最高,正因为如此,只有在极端的情况下它才会被系统终结掉,比如这个Activity想用更多内存但系统却没有那么多的时候,会引起UI无响应。
暂停状态 --
当设备将要sleep,或者这个Activity还可见但是部分被新的Activity挡着了,非全屏享有或者透明的Activity被认为是暂停的。暂停的Activity仍然是活着的,它们保留着所有的状态和成员信息,而且依旧挂载在窗口管理器下,这时这个Activity的优先级在栈中是第二高的,只有在为了保证第一优先级的Activity的资源稳定和可响应时才可能牺牲第二高优先级的Activity。
停止 --
被完全遮挡的Activity才认为是停止状态的,或者在后台的。停止的Activity仍然尽可能长时间的保留它们的状态和成员信息,但是优先级是最低的,意味着,如果上面两个状态的资源满足不了时,这个状态的Activity会被killed掉。
3.多任务
Android上的UI和多任务功能和其他移动平台不太一样。Android中,如果用户用设备的后退键导航后退的话,意味着要被离开的Activity会被系统销毁并回收资源。如果要使用多任务的能力,用户必须按Home键让当前正在执行的Activity从前台转向后台。
4.生命周期的事件函数
Android SDK,Xamarin.Android的框架提供了一个状态管理模型,状态改变时,系统会通知Activity,而后调用相应的函数事件。
OnCreate --
当Activity第一次创建的时候被调用。一个Activity应该重写这个事件来做一些主要内容视图和一些其他初始化内容的安装,比如创建view,绑定数据等。这个事件还有一个Bundle的入参,是一个在Activity之间存储状态信息的dictionary对象。如果bundle不是空值,那表示这个activity正在恢复。Activity也可以用Intent对象的扩展容器来恢复之前保存的数据或者其他Activity传过来的数据。比如下面的代码演示了如何从bundle和Intent获取值:
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
string intentString;
bool intentBool;
string extraString;
bool extraBool;
if (bundle != null)
{
//if the activity is being resumed...
intentString = bundle.GetString("myString");
intentBool = bundle.GetBoolean("myBool");
}
//Check for the values in the Intent Extras...
extraString = Intent.GetStringExtra("myString");
extraBool = Intent.GetBooleanExtra("myBool", false);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
}
OnStart --
当Activity快要被用户看到时被调用。如果想在Activity在可见之前做一些操作的话,则重写这个事件,比如刷新当前的view的值,或者在游戏中提高游戏帧率的情况下。
OnPause --
当Activity将要进入后台时这个事件被调用。如果想要将未保存的数据持久化、清理其他对象消费的资源、或者减小游戏的帧率等的时候,重写这个事件。实现这个事件时应该尽快return,因为在这个事件return之前不会有连续的Activity被恢复。下面的例子说明了如何重写OnPause事件来保存数据
protected override void OnPause()
{
Intent.PutExtra("myString", "Hello Xamarin.Android OnPause");
Intent.PutExtra("myBool", true);
base.OnPause();
}
OnResume --
当Activity在暂停状态时用户又启动它时会调用这个事件。调用时,Activiity会被移动到Activity栈的最顶端,并且可以接收用户的输入。如果想在开始接收用户输入时执行操作可以重写这个事件。
OnStop --
OnRestart --
当Activity在Stopped之后,被S再次Start之前,调用这个事件。OnStart总是跟着这个事件执行。如果想在OnStart被调用前立即做点什么则实现这个事件。如果Activity被发送到前台并且OnStop被调用,而Activity的进程还没有被系统销毁的时候,OnRestart事件应该被重写。一个比较好的例子是:当用户在一个Activity上按了Home键时,OnPause,OnStop会连接被调用,但是Activity还没有被销毁,然后用户用任务管理器或者类似的恢复程序时,在Activity重新激活时,OnStart会被系统调用,
OnDestroy --
OnSaveInstanceState --
这个事件当改变发生时,生命周期框架中给Activity一次机会去保存数据,比如当屏幕的朝向改变时。下面的代码说明了如何重写这个事件来保存数据。
protected override void OnSaveInstanceState(Bundle outState)
{
outState.PutString("myString", "Hello Xamarin.Android OnSaveInstanceState");
outState.PutBoolean("myBool", true);
base.OnSaveInstanceState(outState);
}
5.小结