【问题标题】:Handle "Don't keep Activities" in android app在 Android 应用中处理“不要保留活动”
【发布时间】:2012-11-18 10:28:29
【问题描述】:

我有 2 个活动:一个向用户显示信息列表的 活动,以及它的 子活动,用户可以在其中创建新信息.

明确地说,从第一个活动开始,我调用了“startActivityForResult()”,当用户将他想要的内容放入第二个活动时,我回到第一个活动并收到在“onActivityResult()”函数中保存信息。

我的问题是 “不要保留活动” 选项。我读到这发生在低内存手机中。但是当设备关闭活动时我们如何处理呢?

在我的例子中,当第二个活动被调用时,第一个被杀死,所以当我们回到那个活动时会发生崩溃,我的信息会丢失。

处理这个问题的正确方法是什么?知道我无法在第二个活动中保存我的信息,因为我正在使用文件。

【问题讨论】:

  • onSaveInstanceState() 方法在 onStop() 之前调用。因此,将对象保存在那里并通过检查 if(saveInstanceState != null){ // 将其取回。}

标签: android android-activity crash


【解决方案1】:

SharedPreferences 用于您的目的。顺便说一句,您可以在完全关闭活动时使用此技术来存储数据。

获取您的类数据,使用GSON 将其转换为字符串并存储。

加载时只需将其从 SharedPreferences 移动并从 String 转换回您的 Object。

假设您有 MyData 类,其中包含所有无能为力的信息。

MyData myData = ....;

SharedPreferences mPrefs = context.getSharedPreferences("MyPrefs", 0);
Gson gson = new Gson();
String toStore = gson.toJson(myData);


SharedPreferences.Editor editor = mPrefs.edit();
editor.putString("stored", toStore);
editor.commit();

 ....

当您加载回之前的 Activity 时:

String loadedMyDataStr = mPrefs.getString("stored", "");
MyData data = gson.fromGson(loadedMyDataStr, MyData.class );

【讨论】:

  • 感谢您的回答。我将尝试此代码,因为我找不到任何其他解决方案。但是我有一个关于 startActivityForResult 使用的问题:如果我们想防止“不保留活动”,我们不应该使用 startActivityForResult 并使用捆绑和意图发送结果对吗?那么,如果我们使用它出现错误,该在哪里使用呢?
【解决方案2】:

正如你所说,每个活动都可以在onPause 方法调用之后随时终止。您可以将第一个活动的 ListView 状态存储在 onPause 中,并将其加载到 onResume - 您可以为此目的使用单例。

另外你在onPause 的操作应该尽可能快,不要在那里做任何复杂的操作。否则,您的应用程序可能看起来像已冻结,并且没有用户可以与之交互...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    相关资源
    最近更新 更多