按下后退按钮时活动未完成

时间:2014-04-17 11:02:12

标签: android android-activity

我的活动有一种奇怪的行为。我已经覆盖了onBackPressed()方法,用于在关闭活动之前执行某些任务,但我需要按两次后退按钮才能退出。怎么了?

@Override
public void onBackPressed() {
    super.onBackPressed();
    String[] children = temp_directory.list();
    for (int i = 0; i < children.length; i++) {
        new File(temp_directory, children[i]).delete();
    }
    finish();
}

编辑: 我注意到当我第一次按下后退按钮时,会调用OnResume方法。

编辑二: 如果我删除文件上的所有清理,并写:

@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.i("TAG", "ondestroy");
}

首先按下,onresume被调用。在第二次点击时,调用ondestroy,但两次(仅在第二次反击后记录两次日志打印消息)

2 个答案:

答案 0 :(得分:1)


尝试2

我在下面写了一些实验代码,试图复制删除文件花费太长时间的问题。我发现活动立即退出,不会延迟10秒钟。

这证明拨打super.onBackPressed()通常会退出您的活动 - 代码无法删除文件。

public void onBackPressed()
{
    // this call would exit the activity
    super.onBackPressed();

    // long delay - pretending to delete files - never runs
    try
    {
        Thread.sleep(10000);
    }
    catch (InterruptedException e)
    {
    }

    finish();
}

更新: @nickes指出这只适用于root活动。发起的第二项活动将遇到延迟。

这种不同的行为取决于堆栈中有多少活动,可以在Activity.finish() on grepcode here的代码中看到:

public void finish() {
    if (mParent == null) {
        int resultCode;
        Intent resultData;
        synchronized (this) {
            resultCode = mResultCode;
            resultData = mResultData;
        }
        if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
        try {
            if (ActivityManagerNative.getDefault()
                .finishActivity(mToken, resultCode, resultData)) {
                mFinished = true;
            }
        } catch (RemoteException e) {
            // Empty
        }
    } else {
        mParent.finishFromChild(this);
    }
}

更新2: @giozh删除了所有清理代码,但仍然存在问题。所以清理代码/延迟不是问题。


尝试1

尝试删除finish()并将super.onBackPressed()移到最后:

@Override
public void onBackPressed() {
    String[] children = temp_directory.list();
    for (int i = 0; i < children.length; i++) {
        new File(temp_directory, children[i]).delete();
    }

    super.onBackPressed();
}

基于上面的@nickes评论,让我觉得它可能是阻止活动关闭的超类 - 所以另一个选择就是删除对super.onBackPressed()的调用。

更新: @giozh确认超类是普通的老香草Activity,所以这不是解决方案。

答案 1 :(得分:1)

这是因为你的清理需要太多时间。你认为第一次背压不起作用并再次按下。尝试清理异步。当然,onDestroy()是一个更好的地方。

或者您的Activity是从某个覆盖onBackPressed()

的类继承的