如何防止设备旋转产生重复输出?

How do I prevent device rotation from generating duplicate output?

用户在 MainActivity 中为我的应用输入参数后(如下所示),他点击 Search,调用 MatchesActivity,在新屏幕上生成输出(如下所示) ),通过点击 back 退出。

但是在 MatchesActivity 激活的情况下,每次旋转设备时,Search 都会再次执行,因为 Activity 会重新启动。在下面的屏幕截图中,我将设备从垂直旋转到水平旋转到垂直旋转到水平再回到垂直。

看起来很傻。

输出在 MatchesActivity 中生成,在 onCreate 中调用 MainActivity,如下所示:

Intent matchesIntent;
matchesIntent = new Intent(MainActivity.this, MatchesActivity.class);
startActivity(matchesIntent);

onCreate MatchesActivity 的精髓:

@Override protected void onCreate(Bundle savedInstanceState)
{    
  MainActivity.dbc.setDbProcesslistener(this); // to know txaMatches has been defined

  MainActivity.dbc.findDBMatches(); // generate output
}

我做了研究。我发现了一些复杂的方法来防止 activity 在设备旋转时重新启动。 For example.

我希望有一个更简单的解决方案。有什么想法吗?

如您所见,一种选择是防止 activity 在配置更改时一起重新创建。这并不总是最好的选择,因为这将防止其他依赖于配置的东西也被recreated/reloaded(例如,资源被“-land”限定符覆盖)。

另一种选择是以某种方式缓存数据库搜索的结果。这可以通过在数据库周围添加一个包装器来完成,该包装器可以记住上次搜索的术语和结果。缓存结果的另一种方法是使用片段,并在 activity 次重新创建中重用该片段。是否重新创建片段及其 activity 由以下方法控制: http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean).

我的解决方案很简单。

引入boolean变量outputIsShowing,在onCreate中设置为true,当MatchesActivity结束时,设置为false,当onCreateonResumeMainActivity 中执行(即,当 MatchesActivity 终止时),并且 return 立即在 onCreate 中执行 MatchesActivity 如果outputIsShowingtrue.

因此如果MatchesActivity在设备旋转时处于活动状态,则outputIsShowing将为真,因此不要再次执行。

这可能不是最佳做法,但我已经在正常条件下对其进行了广泛测试,到目前为止我很满意。不确定是否有任何东西作为 "gotcha".

潜伏在那里

我打算回去研究到目前为止提出的建议,因为更一般的情况肯定很重要。如果有人发现我所做的错误,我将不得不这样做。

    @Override protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

  // usual details prior to asking for matches

        if(outputIsShowing)
            return;

        MainActivity.dbc.setDbProcesslistener(this); // to know matches was defined

        MainActivity.dbc.findDBMatches();

        outputIsShowing = true;
    }

* 编辑 *

奇怪的是,在 ScrollView 中嵌入 TextView txaMatches 以实现平滑、加速的滚动后,我不得不删除对 outputIsShowing 的引用才能看到输出两次设备方向更改后。

现在,也许我会提交另一个问题来解决这样一个事实,即在屏幕保护程序强制唤醒设备后,输出很少显示屏幕保护程序激活时焦点所在的位置。点击 'back' 进入用户输入屏幕,然后立即点击 Search 恢复正常,直到大约 100(给予或接受)屏幕保护程序实例后,输出再次丢失。

这样的错误让我觉得我应该遵循上面的建议。

如果我这样做了,或者当我发现问题时,我会再次编辑它。