我有三个活动,我们称之为一,二,三。从活动ONE开始,按钮按下开始活动TWO。从活动TWO开始,按下按钮开始活动三。
足够简单。
现在,活动THREE需要从应用程序访问一些数据(可能存在也可能不存在)。在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
时,THREE结束,摧毁并返回TWO。一切都很好。
现在在TWO中,按后退按钮会在TWO上调用finish()
,但TWO从不调用onDestroy()
。用户返回到ONE就好了,但是任何后续返回TWO的意图都不起作用并且不会抛出任何错误。 TWO处于完成(并暂停)的状态,但从未被破坏,因此无法恢复。
那么,为什么在这种情况下三重要?如果我删除上面代码块中的finish()
调用,并依赖于“自然”完成三个(通过使用后退按钮),当用户返回到ONE时,TWO已被正确销毁。
好的,这里真的让人感到困惑......
离开finish()
电话,我可以通过直接从ONE启动THREE来缓解挂断,然后“自然地”完成它(后退按钮)。在THREE被销毁(第二次)之后,TWO按预期打开。
我读过的所有内容都说我可以在finish()
内调用onResume()
来进行活动。但在这种情况下,它会使某些状态处于不良状态,并阻止我破坏调用活动。
想法?还是我把你的大脑翻了出来?
修改
进一步探索发现了这颗宝石......
围绕finish()
调用三个postDelay()
约500毫克的处理程序将允许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 ... */
}
不完全是我的想法...
答案 0 :(得分:2)
活动未按下后完成/销毁。
使用
@Override
public void onBackPressed()
{
finish();
}
答案 1 :(得分:1)
由于我不能发表评论,我将在这里写。
我不是百分百肯定,如果我跟着你,但接近你提到那个
在THREE被销毁(第二次)之后,TWO按预期打开。
你是什么意思,因为如果我正确地跟着你,你说你用一个按钮在一个和三个按钮打开两个。那么TWO如何按预期打开,或者你的意思是当你退出时它会转到onDestroy()?
我的目标是,如果您查看图3,也许您打开更多相同活动的实例,如here中所述。
答案 2 :(得分:0)
由于此问题仅发生在onResume()[请参阅注释],我认为这听起来像状态持久性问题而不是修补堆栈。
看看这个Stack Over Flow问题Saving Android Activity state using Save Instance State
如果onPause()你将“数据”(我不知道它的对象类型,你没有说过)保存到Bundle然后onResume()去获取它。
Google发现here的另一个例子,使用SharedPreferences代替Bundle来获得相同的结果。
总的来说,这意味着你可以处理/阻止“数据”为空,因为你可以恢复它,因此节省了破坏三个并试图摆弄堆栈的工作,只需按照你的术语保持工作流程“自然”。 / p>