活动在finish()之后不调用onDestroy()

时间:2012-02-03 20:05:54

标签: android onresume activity-finish

我有三个活动,我们称之为一,二,三。从活动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 ... */
}

不完全是我的想法...

3 个答案:

答案 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>