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()方法来实现。
方法 | 描述 | 是否可被终止 |
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的内容。