Activity生命周期

1.Activity交互机制

Android针对Activity的管理使用的是栈机制,Activity栈保存了已经启动并且没有终止的Activity,并遵循“先进后出”的原则。也就是说在某一个时刻只有一个Activity处在栈顶,当这个Activity被销毁后,下面的Activity才可能处于栈顶,或者是有一个新的Activity被创建出来,则上一个Activity被压下去。Android按照一种层次管理所有的Activity。因为Activity直接涉及用户交换界面的处理,而任意时刻与用户交互的界面只有一个,所以Android针对Activity的管理采用了具有层次感的栈的数据结构。

2.Activity状态

Activity生命周期是指Activity从创建到销毁的过程,在这一过程中,Activity一般处于4种状态,即Active/Running、Paused、Stop、Killed。

  • Active/Running。此时Activity一定处于屏幕的最前端,可以被看到,并且可以与用户进行交互。对于Activity栈而言,它处于栈顶位置
  • Pasued。此时Activity在屏幕上仍然可见,但是它已经失去了焦点,用户不能与之进行交互。暂停状态的Activity是存活的,它仍然维持着其内部的状态和信息,但是系统可能会在手机内存极低的情况杀掉该Activity。
  • Stop。此时Activity在屏幕上完全不能被用户看见,也就是说,这个Activity已经完全被其他Activity所遮住。处于停止状态的Activity,系统仍然保留有其内部的状态和成员信息,但是它经常会由于手机系统内存被征用而被系统杀死收回。
  • Killed。Activity被系统杀死回收或者未启动。

这四种状态的转换如图1所示。

图1.Activity的4种状态之间的转换关系

如上图所示。Activity启动后处于Active/Running状态,此时的Activity处于屏幕的最上面,用户可与之进行交互。Android系统为了保证此时的Activity处于Active/Running状态,在内存紧张时,可能会终止其他状态的Activity。对于处于Stop状态的Activity,当手机系统内存被其他应用程序征用时,Stop状态的Activity首先被杀死。

3.Activity生命周期的事件回调函数

图2.Activity生命周期及经历的状态改变

所有的Activity都必须实现onCreate()方法,在该方法中可以对Activity进行一些初始化设置。注意所有的Activity生命周期方法的实现都必须先调用其父类的方法。例如:

public void onPause(){
    super.onPause();
    ...
}

Activity生命周期可以分为全生命周期、可视生命周期、前台生命周期。

一个Activity的全生命周期自第一次调用onCreate()开始,直至调用onDestroy()为止。Activity在onCreate()中设置所有“全局”状态以完成初始化,而在onDestroy()中释放所有系统资源。比如我们在Activity的onCreate() 方法中创建一个线程,在onDestroy()中释放该线程。

一个Activity的可视生命周期从onStart()开始到onStop()结束。在此期间,用户可以在屏幕上看到该Activity。在这两个方法中,你可以管理该Activity的资源。比如你可以在onStart()中注册一个BroadcastReceiver来监控UI变化,而在onStop()中取消该注册。当单击Home按钮时,当前Activity处于不可见状态;当再次进入之前不可见的Activity时,系统会调用onRestart()方法,之后调用onStart()方法,该方法的调用可用来进行Activity从不可见到可见过程的处理。onStart()和onStop()方法可以随着应用程序是否为用户可见而被多次调用。

一个Activity的前台生命周期自onResume()调用开始,至相应的onPause()调用为止。在此期间,Activity位于前台最上面,可与用户进行交互。Activity会经常在暂停和恢复之间进行状态转换——比如当设备转入休眠状态或有新的Activity启动时,将调用onPause()方法;当Activity接收到新的Intent的时候会调用onResume()方法。

表4.1Activity生命周期事件回调函数

函数描述可被杀死下一个
onCreate()在Activity第一次被创建的时候调用。可在此处做初始化设置——创建视图、绑定数据至列表等。如果曾经有状态记录,则调用此方法时会传入一个表示Activity以前状态的包对象作为参数。继以onStart()onStart()
onRestart()在Activity停止后,再次启动前被调用。继以onStart()onStart()
onStart()

当Activity正要变得为用户所见时被调用

当Activity转向前台时继以onResume();

当Activity变为隐藏时继以onStop()

onResume()或onStop
onResume()在Activity开始与用户进行交互之前被调用。此时Activity位于堆栈顶部,用户可见。继以onPause()onPause()
onPause()

当系统将要启动另一个Activity或者弹出对话框时调用。此方法主要用于将所有持久性数据写入存储之中,这一切动作应该在短时间内完成,因为下一个Activity必须等到此方法会返回才会继续。

当Activity重新回到前台时继以onResume();当Activity变为用户不可见时继以onStop()

onResume()或onStop()
onStop()当Activity不再为用户可见时调用此方法。这可能发生在它被销毁或者另一个Activity回到运行状态并覆盖它时。如果Activity再次回到前台跟用户交互则继以onRestart();如果关闭Activity则继以onDetroy()onRestart()或onDestroy() 
onDestroy()在Activity销毁前调用,这可能发生在Activity结束(调用乐它的finish()方法)或者因为系统需要临时空间而销毁该Activity实例时。可以用isFinishing()方法来区分这两种情况

onPause()是三个中唯一一个在进程被杀死之前可能不会调用onStop()和onDestroy()的方法,因此你应该用onPause()的方法将所有持久性数据写入存储之中。

此外为了获取Activity被杀死前的状态,可以在Activity被销毁前使用onSaveInstanceState()方法。它会将一个以键值对方式记录的Activity动态状态的Bundle对象传递给该方法。当Activity再次启动时,这个Bundle会传递给onCreate()方法或伴随着onStart()方法调用的onRestoreInstanceState()方法,所以它们两个都可以恢复之前保存的状态。onSaveInstanceState()方法和onRestoreInstanceState()方法并不是生命周期方法,它们并不是总会被调用。比如Android会在Activity系统主动销毁之前调用onSaveInstanceState(),但用户动作(比如按下了Back键)造成的销毁则不可调用。在用户不打算回到该Activity的情况下,也没有保存其状态的必要。因为onSaveInstanceState()不总是被调用,所以你应该只用它来为Activity保存一些临时的状态,而不能用来保存持久性数据,对于持久性数据,可通过onPause()方法来实现。

表4.2 onSaveInstanceState()和onRestoreInstanceState()方法
方法描述是否可被终止
onSaveInstanceState()Android系统在资源不足而终止Activity前被调用,用以保存Activity的状态信息,供onCreate()和onRestoreInstanceState()方法恢复使用
onRestoreInstanceState()恢复onSaveInstanceState()保存的Activity状态信息,在onStart()和onResume()方法之间使用

 

 

1.只有一个Activity的情况。Activity1

(1)按Back键。先后调用:onPause()--onStop()--onDestroy()这个三个方法。

(2)按Home键。当浏览新闻时,突然想听歌,按下Home键,然后打开音乐播放器。先后调用onPause()--onSaveInstanceState()--onStop()这三个方法。而当我们再次启动Activity1应用程序时,系统将先后分别执行onRestart()--onStart()--onResume()这三个方法。

2.两个Activity的情况。

由Activity1——>Activity2,Activity2完全覆盖Activity1。系统先后执行了Activity1的onPause()--Activity2的onCreate--onStart()--onResume()--Activity1的onSaveInstanceState()--onStop。系统在执行完Activity1的onPause()之后,先将Activity2显示出来,再执行Activity1的onStop()操作。在执行完Activity1的onPause()后,Activity1便不显示在屏幕的最前面了。

(1)由Activity1——>Activity2——>Back

系统先后执行了Activity2的onPause()--Activity1的onRestart()--onStart()--onResume()--Activity2的onStop()--onDestroy()。按下Back键之前,由于处在Activity栈顶的是Activity2所以当执行完Back键后,处于栈顶的Activity2被系统销毁,执行了onDestroy()方法。由于之前的Activity1只是处于停止状态,并没有被销毁,所以此课Activity1处于栈顶,出现在屏幕的最前端。

(2)由Activity1——>Activity2——>Home

系统先后执行了Activity2的onPause()--onSaveInstanceState()--onStop()这三个方法,如同Activity1——>Home一样。此课不同的是处于栈顶的是Activity2而不是Activity1,当我们再次打开该应用程序时,出现在我们眼前的是Activity2的界面。

(3)由Activity1——>Activity2——>Activity1

系统先后执行了Activity2的onPause()--Activity1的onCreate()--onStart()--onResume()--Activity2的onSaveInstanceState()--onStop。系统在执行完Activity2的onPause之后,先将Activity1显示出来,再执行Activity2的onSaveInstanceState()操作。在执行完Activity2的onPause()后,Activity2便不再显示在屏幕的最前端。

(4)由Activity1——>Activity2——>Activity1——>Back

系统销毁了Activity1,但是此刻Activity栈里还有两个Activity,而处于栈顶的是Activity2,所以屏幕显示的是Activity2的内容。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值