关闭和重启应该在你的Activity当中是一个很重要的流程,因为它或许让你的用户感觉到你的app总是活跃的并且不会失去他们的进展。下面介绍一些你的Activity会关闭和重启时主要情况:
- 当用户打开最近使用app窗口,并且从你的app转到使用另一个app。你的app中当前在前台运行的Activity会被stop。如果用户从主界面或最近使用app窗口上点击你的app的图标,那么,那些被stop的Activity会重新启动。
- 当用户在你的app中执行开启一个新的Activity的操作,当前的Activity会被stop。如果用户点击返回按钮,那么,被stop的 Activity会被重启。
- 当用户在使用你的app时接到一个电话。
Activity类提供了两种生命周期方法,分别是 onStop()和
onRestart(),这两种方法让你能够准确地编写你的Activity崽遇到stopped和restarted的情况时,该如何操作。不同于paused状态的是,stopped状态必须保证当前Activity的用户界面完全不可见,并且用户焦点在另一个单独的Activity(或者一个完全单独的app),而paused状态只需要识别到当前的用户界面被局部遮掩。
注解:因为当你的Activity被stop时,系统会保留你的Activity的实例,所以,或许你不需要实现onStop()
和onRestart()
方法(甚至onStart()方法也不必实现。因为大多数Activity比较简单,你只需要使用onPause()方法来暂停进行中的活动和从系统资源断开)
图
Figure 1. 当用户退出你的Activity,系统会调用onStop()方法来关闭Activity(1)。之后,如果用户返回你的Activity,系统调用onRestart()方法(2),紧接着调用onStart()方法(3),再接着调用onResume()
方法(4)。于是我们注意到,无论是什么情况让Activity关闭,系统总是先调用onPause()方法,再调用
onStop()方法来关闭Activity。
Stop Your Activity
当你的Activity调用onStop()方法时,那么,它就不再可见,并且释放此时用户不需要用到的所有资源。一旦你的Activity处于stopped状态,如果当系统需要恢复系统内存时,系统可能会销毁你的Activity中的实例。在极端情况下,系统甚至会在 without calling the activity's final
onDestroy()
callback的情况下直接终止你的应用进程。因此,调用onStop()方法来释放资源是非常重要的。
虽然onPause()方法在
onStop()方法之前调用
,但是你应该在onStop()方法中去执行较大的,较占用CPU性能的操作,比如写入数据库操作就应该在
onStop()中执行。
举个例子,下面这个onStop()方法实现了将草稿内容持久性的存储:
代码
当你的Activity被是stop,你的Activity对象被保存在内存中,并且当它resumes时,它会被召回。You don’t need to re-initialize components that were created during any of the callback methods leading up to the Resumed state. 系统也会跟踪layout中每个View的当前状态,所以,如果用户输入文本到文本框中,内容会被保留,因此你不需要主动保存和恢复它。
Note:即使当你的Activity处于stopped状态时,系统销毁了它,它仍然将View对象(比如EditText中的文本内容)的状态保留在Bundle里(一个bolb键值对),并且在用户导航回你的Activity的相同的实例时会被恢复。(下一节课程将会讲到更多关于使用Bundle来存储其他状态的数据来以防万一你的Activity被销毁和重新创建)
Start/Restart Your Activity
学员评论