序列化扩展Application的对象

时间:2011-08-24 13:52:52

标签: android serialization

我正在研究一个必须在各个活动中保持全局状态的android项目。为此,我成功地扩展了应用程序。然而,对项目的一个新要求是即使应用程序被Android操作系统杀死也要保持状态,因为这个简单的扩展应用程序是不够的,因为该对象将随应用程序一起被杀死。

为了解决这个问题,我已经将Serializable实现为扩展Application的对象:

    public class AppState extends Application implements Serializable

然后在主要活动被销毁时将对象写入私有存储:

    @Override
public void onDestroy() {
    super.onDestroy();
    ByteArrayOutputStream bos = null;
    ObjectOutputStream oos = null;
    FileOutputStream fos = null;
    // If there's a certificate creation in progress, let's store it more
    // permanently before killing the app.
    if (appState.getCertificate() != null) {
        try {
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            oos.writeObject(appState);
            byte[] buf = bos.toByteArray();

            fos = openFileOutput(Constants.objectStoreFileName, Context.MODE_PRIVATE);
            fos.write(buf);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

然后我通过调用:

恢复对象
    private void getAppStateFromFile() {
    FileInputStream fis = null;
    ObjectInputStream ois = null;
    ByteArrayOutputStream bos = null;
    try {
        fis = openFileInput(Constants.objectStoreFileName);
        bos = new ByteArrayOutputStream();
        byte[] b = new byte[1024];
        int bytesRead = 0;
        while ((bytesRead = fis.read(b)) != -1) {
           bos.write(b, 0, bytesRead);
        }
        byte[] bytes = bos.toByteArray();
        ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
        AppState appStateFromFile = (AppState) ois.readObject();
        if (appStateFromFile != null) {
            // restore values from appStateFromFile
        }
    } catch (StreamCorruptedException e) {
        e.printStackTrace();
    } catch (OptionalDataException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        deleteFile(Constants.objectStoreFileName);
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (ois != null) {
            try {
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (bos != null) {
            try {
                bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

它工作正常,但我很好奇有多少人使用过这种方法。我认为这很常见,因为我已经阅读了很多关于想要更永久地保存状态的人。但对于我的surprice google搜索“'扩展应用程序实现Serializable'android”返回0结果。出于某种原因,这不是推荐的方法吗?否则,它可以作为面临同样问题的其他人的解决方案。

1 个答案:

答案 0 :(得分:0)

SharedPreferences使您能够以所需的方式保存状态,因此在SharedPreferences对象中进行更改时,Application中的全局变量会更新。 使用Application for global state是好的,虽然我不确定依赖onDestroy在应用程序中调用是最好的。 在onCreate中再次调用Application时,您可以重新启动状态。