Android游戏:Activity的生命周期与状态转换

大腿Plus Android游戏开发评论2,661阅读模式

作为一个开发者,要对程序的生命周期有所了解。Unity3D的生命周期我想就不用我多说了吧,在刚开始学习Unity的时候我想,老师都提起过,各种面试题也都会有相应的题目。今天呢我想说的是安卓Avtivity的生命周期,网上也有好多类似的文章,说明了Activity生命周期,我想说的就是和Unity进行对比,这样大家对于Android原生的东西就有一个更直观的认识。

首先先看一下下面的Activity的生命周期流程图。文章源自大腿Plus-https://www.zhaoshijun.com/archives/569

Android游戏:Activity的生命周期与状态转换-图片1

然后就是Unity脚本的生命周期流程图。文章源自大腿Plus-https://www.zhaoshijun.com/archives/569

Android游戏:Activity的生命周期与状态转换-图片2

从两张流程图不难看出,他们有很多相似的地方,下面我就说一下我的理解,首先,activity和unity脚本都有初始化的方法,onCreate和Awake都是在程序刚启动的时候执行的,onStart和Start都是在程序开始后第一帧执行的。也都有Pause方法和Destroy方法。虽然我们没有在activity里看到Update方法,但是当activity实现了Runnable接口也会有一个类似Update的run方法。文章源自大腿Plus-https://www.zhaoshijun.com/archives/569

说完了activity的生命周期,下面再说一下activity的各种状态之间的切换,要想了解状态之间的切换,要先知道有几种状态。文章源自大腿Plus-https://www.zhaoshijun.com/archives/569

1、活动(Actived)状态:Activity位于Activity栈的栈顶,它是可见的、具有焦点的前台Activity,这时它可以接受用户输入。文章源自大腿Plus-https://www.zhaoshijun.com/archives/569

2、暂停(Pause)状态:在某些情况下,Activity是可见的,但是没有获得焦点,此时它就是暂停状态。当一个透明的或者非全屏的Activity位于该Activity之前时,就会达到这种状态,此时该Activity虽然(部分)可见,但没有获得焦点,不能接受用户的输入事件。文章源自大腿Plus-https://www.zhaoshijun.com/archives/569

3、停止(stop)状态:当一个Activity不可见的时候,它就处于停止状态。文章源自大腿Plus-https://www.zhaoshijun.com/archives/569

4、非活动(Killed)状态:当一个Activity被终止之后,在被启动之前它就处于非活动状态,已经被Destroy掉。处于非活动状态的Activity已经从Activity栈中移除了,因此,在它们可以被重新显示和使用之前,需要被重新启动。文章源自大腿Plus-https://www.zhaoshijun.com/archives/569

上面是activity的四种状态,那么我们在操作的时候对Activity状态转化的影响是什么样的呢?文章源自大腿Plus-https://www.zhaoshijun.com/archives/569

1、启动Activity,进入活动状态:系统会先调用onCreate()方法,然后调用onStart()方法,最后调用onResume()方法,Activity进入运行状态(活动状态)。文章源自大腿Plus-https://www.zhaoshijun.com/archives/569

2、当前Activity被其他Activity覆盖其上(但该Activity仍然可见),进入暂停状态:系统会调用onPause()方法,暂停当前Activity的执行,Activity进入暂停状态。

3、当前Activity由暂停状态回到活动状态:系统会调用onResume()方法,Activity恢复到活动状态。

例如back掉覆盖在当前Activity上面的透明或非全屏的Activity后,当前的Activity会回到活动状态。

4、当前Activity由活动状态进入停止状态:

(1)、当前Activity跳转到新的Activity界面;

(2)、按Home键回到主屏;

(3)、按锁屏键。

(4)、设备休眠。

这4中情况中,当前Activity退居后台,而且均不可见,该状态转化过程中,系统会先调用onPause()方法,然后调用onStop()方法,当前Activity进入停止状态。

5、Activity从停止状态恢复到运行状态:系统会先调用onRestart()方法,然后调用onStart()方法,最后调用onResume()方法,再次进入运行状态。
该条分别针对第4条的4种情况:

(1)、其他的Activity回退到该Activity;

(2)、按完Home键后又从主屏点击应用返回Activity;

(3)、锁屏以后,又通过解锁返回Activity;

(4)、设备休眠后,解锁返回Activity。

这3中情况中Activity状态转化一样,都是从停止状态恢复到运行状态,Activity先调用onRestart()方法,然后调用onStart()方法,最后调用onResume()方法。

6、Activity进入非活动状态,系统先调用onPause()方法,然后调用onStop()方法,最后调用onDestory()方法,结束当前Activity。此时的Activity已经从Activity栈中移除了,因此,在它们可以被重新显示和使用之前,需要被重新启动。有三种情况会使Activity进入非活动状态:

(1)、用户主动退出当前Activity:例如按Back键,或者清除内存进程(有时onDestrory()方法不一定会执行)。

(2)、当前Activity处于暂停(被覆盖)状态或者停止状态(不可见),即第2步和第4步,系统内存不足kill掉了当前的Activity。该情况是我们不可控的,处于暂停状态的Activity只有在极端情况下才会被系统主动终止。

(3)、主动调用Activity的finish()方法。

7、Activity进由非活动状态进入活动状态:

当前Activity处于非活动状态,而后用户退回、或者主屏点击图标返回、或者解锁屏返回到当前Activity:需要重新开始生命周期,再次调用onCreate()方法、onStart()方法、onResume()方法,进入运行状态。

其实Unity的状态和安卓的activity状态也是一样的,只不过没有activity那么灵活。但是在会unity的同时去了解安卓,这些知识是必不可少的,只要懂其中一种,想学另外一种,我觉的大同小异,差别不会很大的。

我的微信
微信扫一扫
weinxin
shijun_z
我的QQ
QQ扫一扫
weinxin
846207670
 最后更新:2023-10-24
大腿Plus
  • 本文由 大腿Plus 发表于 2017年6月23日 10:28:30
  • 转载请务必保留本文链接:https://www.zhaoshijun.com/archives/569

发表评论