如何在Android应用程序中保存数据


这是关于在应用中保存数据和应用状态系列文章中的一篇。在安卓SDK中有许多机制可以用来保存数据,决定使用哪一种和何时触发该操作常让人困惑。当创建个人应用程序的时候你想要做的第一件、最容易的事就是保存一些用户输入的、明确需要保存的数据。下面是一些常用来持久化存储的方法:

数据保存最基本的方法就是保存到外置存储设备的文件上。这种存储可以被用户和所有的应用程序获得,当设备当作外置存储挂在的时候也可以看到。即使你的应用卸载了该文件也会一直保留,除非你用getExternalFileDir方法获得保存文件的文件夹。这最适用于被用户编辑过的文件,即使应用卸载了也最好一直保留着,例如图片和文档。

你也可以把文件保存为内部存储,例如getFilesDir方法。这对于你的应用程序是私有的。这种情况下,用户和其他应用程序都得到这些文件,并且当你应用卸载的时候文件将被删除。这最适用于保存一些简单的数据,避免了处理数据库的开销。

另外,你也可以把用户的配置保存成 键/值对,使用Preference API来创建SharedPreferences文件。你可以创建一个PreferenceActivity或者包含PreferenceFragment的Activity保存参数配置,他们的布局中都有Preferences 对象来代替View对象。

最后,如果你要保存的数据结构很复杂,每个应用都有自己的私有的SQLLite数据库来保存数据。如果你的应用被卸载,这些数据也将被销毁。经常看到有朋友动辄上千的数据存在数据库中。我个人是并不推荐使用数据库来保存数据,一方面是客户端并没有什么重要的关键数据,二来数据库的存储读写比起文件要慢很多。

另外,有些情况需要保存应用程序的当前状态,因为某个事件被触发。例如:
1. 当设备被旋转的时候,当前的Activity被重新创建,布局也被调整。
2. 当你的应用被用户或者其他应用放到后台去运行的时候,例如手机接到一个电话。另外,用户打开了应用程序的另一个Activity,当前的Activity也会被放到后台。任何在后台运行的Activity当内存不足的时候都可能被回收,当需要的时候再被重新创建。 当用户明确地关闭了应用。

以上的情况,你都需要持久化保存用户输入的数据。当Activity被放到后台或者在销毁的过程中,onPause方法总是被调用,紧接着是onStop即使UI被完全隐藏。所以最好在OnPause方法中保存数据。随后,当用户再次接触之前的Activity,如果它仍在内存中onRestart,onstart和onResume方法将被调用,如果已经被回收了就需要被重新常见,那么onCreate、onStart、和onResume将被调用。所以如果你想在所有情况下都再次显示之前的数据,你应该在onResume方法中恢复UI。

保存UI状态

如果不需要永久的保存数据而只想保存UI的状态,你可以在onSaveInstanceState方法中把数据保存在Bundle中。该方法不能用来保存数据,因为它不是Activity生命周期的一部分,仅仅当Activity需要重新创建或者被放到后台的时候被UI事件触发,被永久销毁的时候该方法不被调用。所以它仅用于保存一些暂时性View状态。
有些数据已经被安卓SDK保存了,但你可能需要保存些额外的信息,例如,假如你有些自定义的控制,当用户按返回键回到Activity的时候,UI的状态需要被恢复,如果Activity仍在内存中,保存有状态信息的bundle对象可以在onRestoreInstanceState方法中获得,如果Activity被回收了需要重新创建,可以在onCreate方法中获得bundle对象。



如何在Android应用程序中保存数据


这是关于在应用中保存数据和应用状态系列文章中的一篇。在安卓SDK中有许多机制可以用来保存数据,决定使用哪一种和何时触发该操作常让人困惑。当创建个人应用程序的时候你想要做的第一件、最容易的事就是保存一些用户输入的、明确需要保存的数据。下面是一些常用来持久化存储的方法:

数据保存最基本的方法就是保存到外置存储设备的文件上。这种存储可以被用户和所有的应用程序获得,当设备当作外置存储挂在的时候也可以看到。即使你的应用卸载了该文件也会一直保留,除非你用getExternalFileDir方法获得保存文件的文件夹。这最适用于被用户编辑过的文件,即使应用卸载了也最好一直保留着,例如图片和文档。

你也可以把文件保存为内部存储,例如getFilesDir方法。这对于你的应用程序是私有的。这种情况下,用户和其他应用程序都得到这些文件,并且当你应用卸载的时候文件将被删除。这最适用于保存一些简单的数据,避免了处理数据库的开销。

另外,你也可以把用户的配置保存成 键/值对,使用Preference API来创建SharedPreferences文件。你可以创建一个PreferenceActivity或者包含PreferenceFragment的Activity保存参数配置,他们的布局中都有Preferences 对象来代替View对象。

最后,如果你要保存的数据结构很复杂,每个应用都有自己的私有的SQLLite数据库来保存数据。如果你的应用被卸载,这些数据也将被销毁。经常看到有朋友动辄上千的数据存在数据库中。我个人是并不推荐使用数据库来保存数据,一方面是客户端并没有什么重要的关键数据,二来数据库的存储读写比起文件要慢很多。

另外,有些情况需要保存应用程序的当前状态,因为某个事件被触发。例如:
1. 当设备被旋转的时候,当前的Activity被重新创建,布局也被调整。
2. 当你的应用被用户或者其他应用放到后台去运行的时候,例如手机接到一个电话。另外,用户打开了应用程序的另一个Activity,当前的Activity也会被放到后台。任何在后台运行的Activity当内存不足的时候都可能被回收,当需要的时候再被重新创建。 当用户明确地关闭了应用。

以上的情况,你都需要持久化保存用户输入的数据。当Activity被放到后台或者在销毁的过程中,onPause方法总是被调用,紧接着是onStop即使UI被完全隐藏。所以最好在OnPause方法中保存数据。随后,当用户再次接触之前的Activity,如果它仍在内存中onRestart,onstart和onResume方法将被调用,如果已经被回收了就需要被重新常见,那么onCreate、onStart、和onResume将被调用。所以如果你想在所有情况下都再次显示之前的数据,你应该在onResume方法中恢复UI。

保存UI状态

如果不需要永久的保存数据而只想保存UI的状态,你可以在onSaveInstanceState方法中把数据保存在Bundle中。该方法不能用来保存数据,因为它不是Activity生命周期的一部分,仅仅当Activity需要重新创建或者被放到后台的时候被UI事件触发,被永久销毁的时候该方法不被调用。所以它仅用于保存一些暂时性View状态。
有些数据已经被安卓SDK保存了,但你可能需要保存些额外的信息,例如,假如你有些自定义的控制,当用户按返回键回到Activity的时候,UI的状态需要被恢复,如果Activity仍在内存中,保存有状态信息的bundle对象可以在onRestoreInstanceState方法中获得,如果Activity被回收了需要重新创建,可以在onCreate方法中获得bundle对象。