API 21 上可用的 finishAndRemoveTask() 方法

7

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

finishAndRemoveTask() 只适用于 API 21 及以上版本。

在低于 API 21 的版本中,我应该使用什么?


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

3

将意图设置为栈中第一个活动并结束当前活动:

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相似的效果。 - Alex.F
我同意,这是一个非常特定的用例,但幸运的是它也是最常见的用例。有许多更简单的应用程序只有一个启动器/菜单活动,而不是更复杂的流程。更正:这确实具有与finishAndRemoveTask类似的效果,当然不是完全相同的(并且,正如您所看到的,没有其他建议,因此现在这是最好的方法)。您的分析其余部分是错误的:许多活动可以在堆栈中,甚至可以有许多实例,这要归功于FLAG_ACTIVITY_CLEAR_TOP标志。无论如何,最重要的是:这只是旧设备的解决方法。 - thelawnmowerman
不要结束,只需关闭当前活动。在这种情况下是第一个活动。 - Vikas Pandey

0
我有一个类似的用例,需要完成所有活动。以下是一种不使用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(),所有活动都将被解除。当然,如果您不关心最后一个活动返回的结果,代码可以变得更简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接