我的活动有一种奇怪的行为。我已经覆盖了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,但两次(仅在第二次反击后记录两次日志打印消息)
答案 0 :(得分:1)
我在下面写了一些实验代码,试图复制删除文件花费太长时间的问题。我发现活动立即退出,不会延迟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删除了所有清理代码,但仍然存在问题。所以清理代码/延迟不是问题。
尝试删除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()