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

nak*_*ive 5 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 ... */
}
Run Code Online (Sandbox Code Playgroud)

data == null三,完成,摧毁并返回到TWO.一切都很好.现在在TWO中,按后退按钮调用finish()TWO,但TWO从不调用onDestroy().用户返回到ONE就好了,但是任何后续返回TWO的意图都不起作用并且不会抛出任何错误.TWO处于完成(并暂停)的状态,但从未被破坏,因此无法恢复.

那么,为什么在这种情况下三重要?如果我删除finish()上面代码块中的调用,并依赖于"自然"完成三个(通过使用后退按钮),当用户返回到ONE时,TWO已被正确销毁.

好吧,这里真的让人感到困惑......

保持finish()呼叫到位,我可以通过直接从ONE启动THREE来缓解挂断,然后"自然地"完成它(后退按钮).在THREE被销毁(第二次)之后,TWO按预期打开.

我读过的一切都已经说我应该是确定通话finish()onResume()的一项活动.但在这种情况下,它会使某些状态处于不良状态,并阻止我破坏呼叫活动.

想法?还是我把你的大脑翻了个遍?

编辑:

进一步的探索发现了这颗宝石......

finish()使用postDelay()大约500毫米的处理程序在THREE 周围调用将允许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 ... */
}
Run Code Online (Sandbox Code Playgroud)

不完全是我的修复想法......

Dus*_*sko 1

由于我无法发表评论,所以我会写在这里。

我不是 100% 确定我是否关注了你,但在接近尾声时你提到了这一点

在三个被摧毁(第二次)后,两个按预期打开。

你这是什么意思,因为如果我没听错的话,你说你用“一”中的按钮打开“二”,用“二”中的按钮打开“三”。那么 TWO 如何按预期打开,或者你的意思是当你退出它时它会转到 onDestroy() ?

我的目标是,也许您会打开同一活动的更多实例,如您查看图 3 时在此处提到的那样。