打开新活动而不会丢失父活动

时间:2016-03-28 14:10:44

标签: java android android-intent

我有一个 DetailsActivity ,其中列出了几个图像缩略图。我希望通过将URL作为字符串传递到“ FullScreenActivity ”来打开一个新活动,该活动允许用户查看更大版本的图像。

DetailsActivity 包含一个复杂的数据对象,当用户打开全屏视图时,我不想放松它。

我可以将字符串传递给新的“ FullScreenActivity ”,图像下载,我可以捏合/缩放图像等。但是当我点击UP时按钮返回 DetailsAcitivity ,应用程序崩溃,因为复杂的数据对象已消失。

当用户查看更大的图像时,如何保持 DetailsActivity

以下是我调用FullScreenActivity的方法。这在for循环中调用,该循环创建一个新的图像视图并将其添加到活动中。

image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(DetailsActivity.this, ViewFullPhotoActivity.class);
intent.putExtra("FullScreenPicture", (String) finalImageMap.get("MainImage"));
startActivity(intent);
}
});

在我的 FullScreenActivity 中,我通过

获取了URL字符串
String fullScreenImage = (String) getIntent().getCharSequenceExtra("FullScreenPicture");

我玩弄了打包复杂数据对象并将其与新意图一起发送的想法,但这肯定不是最佳做法。如果我走这条路,还有一些对用户来说不太好的事情,特别是重新下载所有缩略图,或者丢失输入到表单中的数据。

4 个答案:

答案 0 :(得分:1)

我建议覆盖onSaveInstanceState(),将数据保存在onCreate()内,从savedInstanceState获取您保存的数据。有关详情,请参阅documentation

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    // Save your data here with savedInstanceState.put<something>...
}

如果您的数据很复杂(不是字符串或int或某种简单类型),您可以编写一种方法将其保存到Bundle(可以放在savedInstanceState包中的内容),另一个解析捆绑包并从中恢复数据的那个)。但是存储这样的图像并不是一个好主意......你可以将它们缓存在SD卡上(例如在应用程序的数据目录中,但不能在内存中)。


另一个选项,用于显示&#34; FullScreenActivity &#34;的内容在全屏对话框而不是活动中,因此 DetailsActivity 不会在后台销毁。

答案 1 :(得分:1)

如果使用onSaveInstanceState无法保存复杂数据结构,则最简单的方法是将其保存在Singleton对象中,然后将复杂对象保留在内存中。您可以找到示例here

但是,这不是最好的方法。如果您假设复杂对象将始终在内存中,则可能会遇到意外的NULL指针异常。如果你想更进一步,那么你可以

  • 序列化对象并将其保存到磁盘
  • 使用SQLite数据库并将其保存在数据库

我相信后两种方法更好,但需要一些重要的工作,具体取决于数据结构的复杂程度。

答案 2 :(得分:0)

这样做。 在你的清单文件里面。

 <activity
            android:name=".FullScreenActivity"
            android:label="FullScreenActivity"
            android:launchMode="singleTop"
            android:parentActivityName=".DetailsActivity">

这将指定您的全屏活动将是DetailsActivity的子项。因此,这将在DetailsActivity顶部打开全屏活动。

答案 3 :(得分:0)

我找到了一个更简单的解决方案。在我的Android清单中,在我的 DetailsActivity 中,我只添加了android:launchMode="singleTop"。这就行了。

相关问题