5

我有三项活动,我们称它们为一、二和三。从活动一开始,按下按钮开始活动二。从活动二,按下按钮开始活动三。

很简单。

现在,活动三需要一些可从应用程序访问的数据(可能存在也可能不存在)。在 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 ... */
}

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

4

3 回答 3

2

活动未在后按时完成/销毁。

利用

 @Override
    public void onBackPressed()
    {
        finish();
    }
于 2012-02-03T20:38:50.260 回答
1

由于我无法发表评论,我将在这里写下。

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

THREE 被销毁(第二次)后,TWO 按预期打开。

你的意思是什么,因为如果我正确地跟着你,你说你用一个按钮打开两个,一个按钮打开三个,一个按钮在两个。那么 TWO 如何按预期打开,或者您的意思是当您退出它时它会转到 onDestroy() ?

我的目标是,您可能会打开同一活动的更多实例,如果您看一下图 3,就会在此处提到。

于 2012-02-03T20:34:32.000 回答
0

由于这个问题只发生在 onResume() [见评论] 我认为这听起来像是状态持久性的问题,而不是修补堆栈。

看看这个 Stack Over Flow Question Saving Android Activity state using Save Instance State

如果 onPause() 您将“数据”(我不知道它的对象类型,因为您没有说过)保存到Bundle中,那么 onResume() 去获取它。

Google 在此处找到的另一个示例使用SharedPreferences而不是 Bundle 来实现相同的结果。

总体而言,这意味着您可以处理/防止“数据”为空,因为您可以恢复它,从而节省破坏三和尝试摆弄堆栈的工作,只需用您的术语保持工作流程“自然”。

于 2012-02-03T21:22:53.600 回答