关闭应用程序并检索该数据时保存数据

时间:2015-03-26 17:09:11

标签: android android-activity save data-retrieval

我知道,这里有很多关于保存/检索数据的问题。我正在寻找自己的东西,并且真的以为我可以设法找到我的答案,而不必问一个问题"但我开始怀疑我没有看到答案的东西在这里。

我的情况:

当然,我正在制作应用。关闭应用程序后,我想保存一个简单的数字数组(0或1)或布尔值。启动应用程序后,我想搜索该数组(如果存在),并检索它以便在应用程序中使用。

我开始将我的代码放入将使用数组的活动中。但是,我开始想知道是否必须将重写的onStop()函数复制/粘贴到我的所有活动中?或者我是否在主要活动中进行,并以某种方式链接其他活动。

基本上,无论应用程序关闭时应用程序当前处于什么状态/活动,我都希望能够保存int / bool数组并在应用程序启动时将其打开。

也许我不知道如何搜索我想要的东西,所以解释它感觉是正确的事情。

我不介意做更多的搜索,但如果有人至少指出我正确的方向,我将非常感激。

编辑:如果有更好的方式来做我想要的比我描述的更好(例如,使用不同的状态而不是onStop()),请随意抛出想法。这是我第一次真正不得不处理这些活动。生命周期和我甚至在浏览了android开发教程之后有点困惑。我认为他们在大多数情况下表现不佳。

5 个答案:

答案 0 :(得分:11)

当您的应用程序需要保存一些持久性数据时,您应该始终使用onPause()方法而不是onStop()。因为如果Android操作系统杀死了你的进程,那么永远不会调用onStop()onDestroy()方法。同样,在onResume()方法中检索数据。

答案 1 :(得分:2)

看看你想要实现的目的,SharedPreferences就是你想要的。

文档说明:

  

" SharePreferences提供了一个允许您保存的通用框架   并检索原始数据类型的持久键值对。您   可以使用SharedPreferences保存任何原始数据:布尔值,   浮点数,整数,长整数和字符串。此数据将持续跨用户   会话(即使你的申请被杀)。"

答案 2 :(得分:1)

使用SharedPreference存储少量数据或使用SQLite存储大量数据。 看到这个链接

http://developer.android.com/guide/topics/data/data-storage.html

答案 3 :(得分:0)

序列化一个对象并传递它比共享首选项更可靠(与共享首选项的一致性有很多麻烦):

public class SharedVariables {

    public static <S extends Serializable> void writeObject(
            final Context context, String key, S serializableObject) {

        ObjectOutputStream objectOut = null;
        try {
            FileOutputStream fileOut = context.getApplicationContext().openFileOutput(key, Activity.MODE_PRIVATE);
            objectOut = new ObjectOutputStream(fileOut);
            objectOut.writeObject(serializableObject);
            fileOut.getFD().sync();
        } catch (IOException e) {
            Log.e("SharedVariable", e.getMessage(), e);
        } finally {
            if (objectOut != null) {
                try {
                    objectOut.close();
                } catch (IOException e) {
                    Log.e("SharedVariable", e.getMessage(), e);
                }
            }
        }
    }

然后使用一个类:

public class Timestamps implements Serializable {

private float timestampServer;

public float getTimestampServer() {
    return timestampServer;
}

public void setTimestampServer(float timestampServer) {
    this.timestampServer = timestampServer;
}

}

然后,无论你想在哪里写变量,都要使用:

SharedVariables.writeObject(getApplicationContext(), "Timestamps", timestampsData);

答案 4 :(得分:-2)

实现这一目标的最佳方式是:

  • 创建一个类。称之为MySettings,或任何适合你的
  • 在这个类中,定义要分享的int / booleans数组,作为static。创建getter&amp; setter方法(property)来访问它(也作为静态方法)
  • 向MySettings添加一个静态load()方法,该方法从SharedPreferences中读取。当您启动应用程序时(在您的第一个活动或更好的应用程序的子类中),请致电MySettings.load()。此加载方法设置数组
  • 添加静态save()方法。公众也。现在,您可以在应用中的任何位置保存。此save()方法读取数组并在SharedPreferences
  • 中写入

代码示例:

public class MySettings {
    private static List<Integer>  data;

    public static void load() {
        data = new ArrayList<Integer>();
        // use SharedPreferences to retrieve all your data

    }

    public static void save() {
        // save all contents from data
    }

    public static List<Integer> getData() {
        return data;
    }

    public static void setData(List<Integer> data) {
        MySettings.data = data;
    }
}