我有三项活动,我们称它们为一、二和三。从活动一开始,按下按钮开始活动二。从活动二,按下按钮开始活动三。
很简单。
现在,活动三需要一些可从应用程序访问的数据(可能存在也可能不存在)。在 THREE 的onResume()
方法中,对数据进行检查,如果不存在,则活动完成,如下所示:
@Override
protected void onResume() {
super.onResume();
/* ... get data from app ... */
if (data == null) {
Toast.makeText(this, "Data not found", Toast.LENGTH_SHORT).show();
finish();
return;
}
/* ... other logic ... */
}
时data == null
,三完成,销毁并返回二。一切都很好。现在在 TWO 中,按下后退按钮调用finish()
TWO,但 TWO 从不调用onDestroy()
。用户返回到 ONE 就好了,但是任何随后返回到 TWO 的意图都不起作用,并且不会引发任何错误。TWO 处于已完成(并暂停)但从未销毁的状态,因此无法恢复。
那么,在这种情况下,为什么“三”很重要?如果我删除finish()
上面代码块中的调用,并依靠“自然”完成三(通过使用后退按钮),当用户回到一时,二已被正确销毁。
好的,这就是真正令人困惑的地方......
将通话留finish()
在原地,我可以通过直接从 ONE 启动 THREE 来缓解挂断,然后“自然”完成它(后退按钮)。THREE 被销毁(第二次)后,TWO 按预期打开。
我读过的所有内容都说我应该可以finish()
参加onResume()
活动。但在这种情况下,它会使某些东西处于不良状态,并阻止我破坏调用活动。
想法?还是我把你的大脑翻过来了?
编辑:
进一步的探索发现了这颗宝石......
用大约 500 毫秒的处理程序包围finish()
THREE 中的呼叫postDelay()
将允许 TWO 按预期关闭。像这样:
@Override
protected void onResume() {
super.onResume();
/* ... get data from app ... */
if (data == null) {
Toast.makeText(this, "Data not found", Toast.LENGTH_SHORT).show();
Handler h = new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
finish();
}
}, 500);
return;
}
/* ... other logic ... */
}
不完全是我的修复想法......