1

我从 B 开始一项活动 A,其目的是附加额外内容,并根据 onCreate 中的额外内容类型进行一些处理,并且效果很好。

但是,当我进行方向更改时,系统会将相同的旧意图重新传递给我,并且由于我再次通过 onCreate ,整个过程将重新启动。

如果没有旧意图传递给它,我的代码完全负责在调用 onCreate 时恢复活动的先前状态。但是由于系统重新交付它使我的活动认为这是一个新的意图并再次重新启动整个过程。

我试过国旗intent.getFlags() != Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY。此标志可防止在长按主页按钮和从历史记录启动的活动但对方向更改没有影响的情况下重新交付。

在另一个线程Dirty Fix中提出了一个脏修复,但我想知道是否有适当的方法来解决这个问题。

提前致谢

4

2 回答 2

2

使用 savedInstanceState 来确定活动或片段是否从包括方向变化在内的任何内容中恢复。当活动/片段恢复时,savedInstanceState 将为空。

public void onCreate(Bundle savedInstanceState) {
    ...
    boolean isRedeliver = savedInstanceState != null || (intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0;
    ...
}

该技术也用于fragment 的官方文档

    if (savedInstanceState == null) {
        // During initial setup, plug in the details fragment.
        DetailsFragment details = new DetailsFragment();
        details.setArguments(getIntent().getExtras());
        getFragmentManager().beginTransaction().add(android.R.id.content, details).commit();
    }
于 2015-09-30T01:45:47.307 回答
1

这个问题的“干净”解决方案是使用片段。

创建您自己的 Fragment 子类。在它的 onCreate 中,一定要调用 setRetainInstance(true)。在其 onCreate 中,您可以开始您的流程。如果只是为了做一些工作,在它的onCreateView中返回null。

在您的 Activity 的 onCreate 中: - 首先尝试找到您自己的 Fragment 的当前实例。- 如果没有找到,创建一个全新的并将其提交到您的 Fragment Transaction。

通过调用 setRetainInstance(true) 并在 Activity 的 onCreate 中创建新的 Fragment 之前首先尝试找到它,即使在旋转之后,您也会保留相同的 Fragment 实例,并且不会再次调用 Fragment 的 onCreate。

于 2013-02-06T20:41:00.450 回答