请选择 进入手机版 | 继续访问电脑版
1. onPause


一般情况下,您不得使用onPause()永久性存储用户更改(比如输入表格的个人信息)。 只有在您确定用户希望自动保存这些更改的情况(比如,电子邮件草稿)下,才能在onPause()中永久性存储用户更改。但您应避免在onPause()期间执行 CPU 密集型工作,比如向数据库写入信息,因为这会拖慢向下一Activity过渡的过程(您应改为在onStop()期间执行高负载关机操作。
您应通过相对简单的方式在onPause()方法中完成大量操作,这样才能加快在您的Activity确实停止的情况下用户向下一个目标过渡的速度。
注意:当您的Activity暂停时,Activity实例将驻留在内存中并且在Activity继续时被再次调用。您无需重新初始化在执行任何导致进入“继续”状态的回调方法期间创建的组件。
2. onStop

当您的Activity收到onStop()方法的调用时,它不再可见,并且应释放几乎所有用户不使用时不需要的资源。 一旦您的Activity停止,如果需要恢复系统内存,系统可能会销毁该实例。 在极端情况下,系统可能会仅终止应用进程,而不会调用Activity的最终onDestroy()回调,因此您使用onStop()释放可能泄露内存的资源非常重要。
尽管onPause()方法在onStop()之前调用,您应使用onStop()执行更大、占用更多 CPU 的关闭操作,比如向数据库写入信息。
例如,此处是将草稿笔记内容保存在永久存储中的onStop()的实现:
  1. [/code]例如,因为用户可能在回到它之前已离开应用很长时间, onStart()
  2. 方法是确认所需系统功能已启动的理想选择:
  3. [code]
复制代码
当系统销毁您的Activity时,它会调用您的 Activity
的 onDestroy()
方法。因为您通常应已使用 onStop()
释放大多数您的资源,到您接收对onDestroy()
的调用时,大多数应用无需做太多操作。 此方法是您清理可导致内存泄露的资源的最后一种方法,因此您应确保其他线程被销毁且其他长期运行的操作(比如方法跟踪)也会停止。
3. onDestory

大多数应用不需要实现此方法,因为本地类引用与Activity一同销毁,并且您的Activity应在onPause()和onStop()期间执行大多数清理操作。 但是,如果您的Activity包含您在onCreate()期间创建的后台线程或其他如若未正确关闭可能导致内存泄露的长期运行资源,您应在onDestroy()期间终止它们。
注意:在所有情况下,系统在调用onPause()和onStop()之后都会调用onDestroy(),只有一个例外:当您从onCreate()方法内调用finish()时。在有些情况下,比如当您的Activity作为临时决策工具运行以启动另一个Activity时,您可从onCreate()内调用finish()来销毁Activity。 在这种情况下,系统会立刻调用onDestroy(),而不调用任何其他 生命周期方法。
Comment:调用recreate时,Activity会终结lifecycle 到onDestroy,就像configuration改变时的样子。
4.处理运行时变更

您可能会遇到这种情况:重启应用并恢复大量数据不仅成本高昂,而且给用户留下糟糕的使用体验。 在这种情况下,您有两个其他选择:
    在配置变更期间保留对象允许 Activity 在配置变更时重启,但是要将有状态对象传递给 Activity 的新实例。如果重启 Activity 需要恢复大量数据、重新建立网络连接或执行其他密集操作,那么因配置变更而引起的完全重启可能会给用户留下应用运行缓慢的体验。 此外,依靠系统通过 onSaveInstanceState()
    回调为您保存的 Bundle
    ,可能无法完全恢复 Activity 状态,因为它 并非设计用于携带大型对象(例如位图),而且其中的数据必须先序列化,再进行反序列化, 这可能会消耗大量内存并使得配置变更速度缓慢。在这种情况下,如果 Activity 因配置变更而重启,则可通过!!!保留 Fragment
    来减轻重新初始化 Activity 的负担!!!
    。此片段可能包含对您要保留的有状态对象的引用。具体可看Android Developer
Comment:创建一个RetainFragment来保存具体的数据,很赞的solution
    自行处理配置变更阻止系统在某些配置变更期间重启 Activity,但要在配置确实发生变化时接收回调,这样,您就能够根据需要手动更新 Activity。
    注意:从 Android 3.2(API 级别 13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会发生变化。因此,在开发针对 API 级别 13 或更高版本系统的应用时,若要避免由于设备方向改变而导致运行时重启(正如 minSdkVersion 和targetSdkVersion 属性中所声明),则除了"orientation"
    值以外,您还必须添加 "screenSize"
    值。即,您必须声明 android:configChanges="orientation|screenSize"
    。但是,如果您的应用是面向 API 级别 12 或更低版本的系统,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重启 Activity)。
Comment:之前有同事问道为何配置了orientation,Activity重启的原因就在这里
-------
题图 By Andrés Nieto Porras
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|翁笔

© 2001-2018 Wengbi.com

返回顶部