Activity 介绍

2019-07-29  本文已影响0人  wind_sky

在Android开发中,Activity可以说是最常用的组件了,用户可以与Activity提供的界面进行交互。关于Activity的知识也是Android开发人员的基础能力。

Activity的生命周期:

通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要。 Activity 的生命周期会直接受到 Activity 与其他 Activity、其任务及返回栈的关联性的影响。

Activity 基本上以三种状态存在:

如果 Activity 处于暂停或停止状态,系统可通过要求其结束(调用其 finish() 方法)或直接终止其进程,将其从内存中删除。(将其结束或终止后)再次打开 Activity 时,必须重建。

注:我们在实现生命周期方法时,首先要调用超类的方法,然后再执行操作。

Activity 生命周期.png

Activity生命周期如上图所示。

【是否能事后终止?】列表示系统是否能在不执行另一行 Activity 代码的情况下,在 方法返回后 随时终止承载 Activity 的进程。 有三个方法带有“是”标记:(onPause()onStop()onDestroy())。由于 onPause() 是这三个方法中的第一个,因此 Activity 创建后,onPause() 必定成为最后调用的方法,然后才能终止进程 — 如果系统在紧急情况下必须恢复内存,则可能不会调用 onStop()onDestroy()。因此,我们应该使用 onPause() 向存储设备写入至关重要的持久性数据(例如用户编辑)。不过,我们应该对 onPause() 调用期间必须保留的信息有所选择,因为该方法中的任何阻止过程都会妨碍向下一个 Activity 的转变并拖慢用户体验。

在【是否能在事后终止?】列中标记为“否”的方法可从系统调用它们的一刻起防止承载 Activity 的进程被终止。 因此,在从 onPause() 返回的时间到 onResume() 被调用的时间,系统可以终止 Activity。在 onPause() 被再次调用并返回前,将无法再次终止 Activity。

保存Activity的状态:

当Activity暂停或停止的时候,它的状态会得到保留,是指Activity对象仍保存在内存中,有关其成员和状态的所有信息都在活动状态。不过当系统为了回收内存而销毁Activity时,Activity对象会被销毁,用户在返回Activity时会重建Activity,之前的状态也不在了。这时可以实现另一个回调方法onSaveInstanceState()来完成状态的保存。

系统会先调用 onSaveInstanceState(),然后再使 Activity 变得易于销毁。系统会向该方法传递一个 Bundle,我们可以在其中使用 putString()putInt() 等方法以名称-值对形式保存有关 Activity 状态的信息。然后,如果系统终止应用进程,之后用户返回刚才的 Activity,则系统会重建该 Activity,并将 Bundle 同时传递给 onCreate()onRestoreInstanceState()。我们可以使用上述任一方法从 Bundle 提取我们保存的状态并恢复该 Activity 状态。如果没有状态信息需要恢复,则传递给我们的 Bundle 是空值(如果是首次创建该 Activity,就会出现这种情况)。

:无法保证系统会在销毁应用的 Activity 前调用 onSaveInstanceState(),因为存在不需要保存状态的情况(例如用户使用“返回”按钮离开 Activity 时,因为用户的行为是在显式关闭 Activity)。 如果系统调用 onSaveInstanceState(),它会在调用 onStop() 之前,并且可能会在调用 onPause() 之前进行调用。

同时,即使什么都不做,也不实现 onSaveInstanceState()Activity 类的 onSaveInstanceState() 默认实现也会恢复部分 Activity 状态。具体地讲,默认实现会为布局中的每个 View 调用相应的 onSaveInstanceState() 方法,让每个视图都能提供有关自身的应保存信息。Android 框架中几乎每个控件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改。例如,EditText 保存用户输入的任何文本,CheckBox 保存复选框的选中或未选中状态。我们只需为想要保存其状态的每个控件提供一个唯一的 ID(通过 android:id 属性)。如果控件没有 ID,则系统无法保存其状态。

注:我们还可以通过将android:saveEnabled 属性设置为 "false" 或通过调用 setSaveEnabled() 方法显式阻止布局内的视图保存其状态。您通常不应将该属性停用,但如果您想以不同方式恢复 Activity UI 的状态,就可能需要这样做。

由于 onSaveInstanceState() 的默认实现有助于保存 UI 的状态,因此如果为了保存更多状态信息而替换该方法,应始终先调用 onSaveInstanceState() 的超类实现,然后再执行任何操作。 同样,如果重写onRestoreInstanceState() 方法,也应调用它的超类实现,以便默认实现能够恢复视图状态。

上一篇下一篇

猜你喜欢

热点阅读