如何防止设备旋转产生重复输出?
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
,当onCreate
或 onResume
在 MainActivity
中执行(即,当 MatchesActivity
终止时),并且 return 立即在 onCreate
中执行 MatchesActivity
如果outputIsShowing
是 true
.
因此如果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(给予或接受)屏幕保护程序实例后,输出再次丢失。
这样的错误让我觉得我应该遵循上面的建议。
如果我这样做了,或者当我发现问题时,我会再次编辑它。
用户在 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
,当onCreate
或 onResume
在 MainActivity
中执行(即,当 MatchesActivity
终止时),并且 return 立即在 onCreate
中执行 MatchesActivity
如果outputIsShowing
是 true
.
因此如果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(给予或接受)屏幕保护程序实例后,输出再次丢失。
这样的错误让我觉得我应该遵循上面的建议。
如果我这样做了,或者当我发现问题时,我会再次编辑它。