美文网首页
Activity 介绍

Activity 介绍

作者: wind_sky | 来源:发表于2019-07-29 16:18 被阅读0次

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

    Activity的生命周期:

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

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

    • 继续 :此 Activity 位于屏幕前台并具有用户焦点。(有时也将此状态称作“运行中”。)

    • 暂停 :另一个 Activity 位于屏幕前台并具有用户焦点,但此 Activity 仍可见。也就是说,另一个 Activity 显示在此 Activity 上方,并且该 Activity 部分透明或未覆盖整个屏幕。 暂停的 Activity 处于完全活动状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,并与窗口管理器保持连接),但在内存极度不足的情况下,可能会被系统终止。

    • 停止 :该 Activity 被另一个 Activity 完全遮盖(该 Activity 目前位于“后台”)。 已停止的 Activity 同样仍处于活动状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,但未与窗口管理器连接)。 不过,它对用户不再可见,在他处需要内存时可能会被系统终止。

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

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

    Activity 生命周期.png

    Activity生命周期如上图所示。

    • Activity 的整个生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。 Activity 应在 onCreate() 中执行“全局”状态设置(例如定义布局),并释放 onDestroy() 中的所有其余资源。例如,如果有一个在后台运行的线程,用于从网络上下载数据,它可能会在onCreate() 中创建该线程,然后在 onDestroy() 中停止该线程。

    • Activity 的可见生命周期发生在 onStart() 调用与 onStop() 调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。 例如,当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用 onStop()。可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。 例如,我们可以在 onStart() 中注册一个 BroadcastReceiver 以监控影响 UI 的变化,并在用户无法再看到显示的内容时在 onStop() 中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用 onStart()onStop()

    • Activity 的前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。 Activity 可频繁转入和转出前台 — 例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()。 由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。

      image.png

    【是否能事后终止?】列表示系统是否能在不执行另一行 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() 方法,也应调用它的超类实现,以便默认实现能够恢复视图状态。

    相关文章

      网友评论

          本文标题:Activity 介绍

          本文链接:https://www.haomeiwen.com/subject/actbrctx.html