这是关于在应用中保存数据和应用状态系列文章中的第一篇。在安卓 SDK 中有许多机制可以用来保存数据,决定使用哪一种和何时触发该操作常让人困惑。当创建个人应用程序的时候你想要做的第一件、最容易的事就是保存一些用户输入的、明确需要保存的数据。下面是一些常用来持久化存储的方法:
- 数据保存最基本的方法就是保存到外置存储设备的文件上。这种存储可以被用户和所有的应用程序获得,当设备当作外置存储挂在的时候也可以看到。即使你的应用卸载了该文件也会一直保留,除非你用 GetExternalFileDir 方法获得保存文件的文件夹。这最适用于被用户编辑过的文件,即使应用卸载了也最好一直保留着,例如图片和文档。
- 你也可以把文件保存为内部存储,这对于你的应用程序是私有的。这种情况下,用户和其他应用程序都得到这些文件,并且当你应用卸载的时候文件将被删除。这最适用于保存一些简单的数据,避免了处理数据库的开销。
- 另外,你也可以把用户的配置保存成键/值对,使用 Preference API 来创建 SharedPreferences 文件。你可以创建一个 PreferenceActivity 或者包含 PreferenceFragment 的 Activity 保存参数配置,他们的布局中都有 Preferences 对象来代替 View 对象。
- 最后,如果你要保存的数据结构很复杂,每个应用都有自己的私有的 SQLLite 数据库来保存数据。如果你的应用被卸载,这些数据也将被销毁。
另外,有些情况需要保存应用程序的当前状态,因为某个事件被触发。例如:
- 当设备被旋转的时候,当前的 Activity 被重新创建,布局也被调整。
- 当你的应用被用户或者其他应用放到后台去运行的时候,例如手机接到一个电话。另外,用户打开了应用程序的另一个 Activity,当前的 Activity 也会被放到后台。任何在后台运行的 Activity 当内存不足的时候都可能被回收,当需要的时候再被重新创建。
- 当用户明确地关闭了应用。
以上的情况,你都需要持久化保存用户输入的数据。当 Activity 被放到后台或者在销毁的过程中,onPause 方法总是被调用,紧接着是 onStop 即使 UI 被完全隐藏。所以最好在 OnPause 方法中保存数据。随后,当用户再次接触之前的 Activity,如果它仍在内存中 onRestart,onstart 和 onResume 方法将被调用,如果已经被回收了就需要被重新常见,那么 onCreate、onStart、和 onResume 将被调用。所以如果你想在所有情况下都再次显示之前的数据,你应该在 onResume 方法中恢复 UI。
如果不需要永久的保存数据而只想保存 UI 的状态,你可以在 onSaveInstanceState 方法中把数据保存在 Bundle 中。该方法不能用来保存数据,因为它不是 Activity 生命周期的一部分,仅仅当 Activity 需要重新创建或者被放到后台的时候被 UI 事件触发,被永久销毁的时候该方法不被调用。所以它仅用于保存一些暂时性 View 状态。有些数据已经被安卓 SDK 保存了,但你可能需要保存些额外的信息,例如,假如你有些自定义的控制,当用户按返回键回到 Activity 的时候,UI 的状态需要被恢复,如果 Activity 仍在内存中,保存有状态信息的 bundle 对象可以在 onRestoreInstanceState 方法中获得,如果 Activity 被回收了需要重新创建,可以在 onCreate 方法中获得 bundle 对象。