【问题标题】:finishAndRemoveTask() available on API 21在 API 21 上可用的 finishAndRemoveTask()
【发布时间】:2014-12-08 22:54:41
【问题描述】:

我会终止我的应用并从最近的任务列表中取消它。

finishAndRemoveTask() 仅适用于 API 21。

我应该在低于 21 的 API 上使用什么??

【问题讨论】:

  • 我认为在较低的 API 级别中没有这么简单的方法可以做到这一点,但是......为什么有人想要这样做?
  • 我想阻止用户从最近的任务中重新打开应用..
  • 如果您刚刚完成所有活动,您的应用是否仍然出现在最近的任务列表中?您是否尝试过使用带有标志的 Intent 完成所有活动?
  • 我发布了一种解决方案(我还没有测试过,但你可以理解)。

标签: java android api compatibility


【解决方案1】:

对堆栈中的第一个活动进行意图并完成当前活动:

Intent intent  = new Intent(this, FirstActivity.class);
intent.putExtra(EXTRA_FINISH, true);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);
finish();

并且,在FirstActivityonResume 方法中,完成堆栈中的最后一个活动(并希望从最近的应用列表中删除该应用):

if (getExtras() != null && getIntentExtra(EXTRA_FINISH, false)) {
   finish();
}

【讨论】:

  • 这适用于一个非常具体的用例,其中FirstActivity 是堆栈中的唯一活动,并且它是该任务中该活动的唯一实例,它不会从最近的任务中删除该任务。换句话说,它与finishAndRemoveTask 没有类似的效果
  • 我同意,这是一个非常具体的用例,但幸运的是它也是最常见的用例。与更复杂的流程相比,具有单个启动器/菜单活动的简单应用程序要多得多。更正:这确实与finishAndRemoveTask 具有相似 效果,当然不是相同(而且,如您所见,没有提出其他建议,所以这是我们目前最好的)。您的其余分析是错误的:由于 FLAG_ACTIVITY_CLEAR_TOP 标志,许多活动可以在堆栈中,甚至它们的许多实例中。无论如何,最重要的是:这只是旧设备的一种解决方法。
  • 不完成只是关闭当前活动。在这种情况下,第一个活动。
【解决方案2】:

我有一个类似的用例,我需要完成所有活动。这是一种不使用 finishAndRemoveTask() 的方法。

让您的所有活动都扩展一个基类,其中包含以下内容:

private Boolean mHasParent = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = getIntent();
    Bundle extras = intent.getExtras();
    if (extras != null) {
        mHasParent = extras.getBoolean("hasParent", false);
    }
}

// Always start next activity by calling this.
protected void startNextActivity(Intent intent) {
    intent.putExtra("hasParent", true);
    startActivityForResult(intent, 199);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);  
    if (requestCode == 199 && resultCode == FINISH_ALL) {
        finishAllActivities();
    }
}

protected void finishAllActivities() {
    if (mHasParent) {
        // Return to parent activity.
        setResult(FINISH_ALL);
    } else {
        // This is the only activity remaining on the stack.
        // If you need to actually return some result, do it here.
        Intent resultValue = new Intent();
        resultValue.putExtra(...);
        setResult(RESULT_OK, resultValue);
    }

    finish();
}

只需在任何活动中调用finishAllActivities(),所有活动都会展开。当然,如果你不关心最后一个活动返回什么结果,代码可以变得更简单。

【讨论】:

    猜你喜欢
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多