Android:从历史堆栈中清除旧的活动实例

Posted

技术标签:

【中文标题】Android:从历史堆栈中清除旧的活动实例【英文标题】:Android: Clear old activity instance from history stack 【发布时间】:2020-06-04 14:55:05 【问题描述】:

我有以下简单的场景:

一个名为 ListCarsActivity.kt 的活动,其中显示了汽车列表。当用户点击 FloatingActionButton 时,它会打开另一个名为 AddCarActivity.kt 的活动 当用户单击添加汽车按钮时,我会启动一个新意图,以转到现在显示添加的汽车的初始活动 ListCarsActivity.kt。

问题:从现在开始,当我点击返回按钮时,ListCarsActivity 会再次显示。

如何从 History 堆栈中清除 ListCarsActivity 的旧条目?

【问题讨论】:

使用 startActivityForResult() 打开 AddCarActivity 并在单击 AddCar 按钮时传递 intent (不是新意图)并关闭 AddCarActivity *并在您的 AddCarActivity 的 onActivityResult* 内,意图数据将可用 【参考方案1】:

ListCarsActivity.kt

中调用您的 AddCarActivity.kt Activity,如下所示
val intent = Intent(mContext, AddCarActivity.class);
startActivityForResult(intent, 1); //Use any request code

现在对于上面的代码,startActivityForResult 的作用是从其他活动或源(如相机、联系人等)接收数据的意图

现在,当您在 AddCarActivity.kt 中完成所有工作后,您可以按照以下所有 intent 来获取结果

                Intent intent = getIntent();
                intent.putExtra("key", data); // if you wanted to get data 
                setResult(RESULT_OK, intent);
                finish();

在您的 ListCarsActivity.kt 中,您需要添加 onActivityResult 它将从 AddCarActivity.kt

获取数据
 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    try 
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK) 
            if (requestCode == 1)  //Your request code here
                Object obj = data.getParcelableExtra("key");
                 //Do as per your needs

            
        

     catch (Exception ex) 
        ex.printStackTrace();
    

有了这个,如果你想在第一个活动中返回新添加的数据,可以在不使用任何第三方库的情况下获取它。

试试看,如果它对你有用,请告诉我。

【讨论】:

【参考方案2】:

startActivity(intent) 之后使用finish() 来完成您正在开始另一个活动的活动

【讨论】:

【参考方案3】:

您应该使用startActivityForResult 方法运行AddCarActivity,然后您必须使用AddCarActivity 中的setResult 方法设置结果,这会返回到ListCarsActivity 而无需再次启动它

官方文档: https://developer.android.com/training/basics/intents/result

https://developer.android.com/reference/android/app/Activity#setResult(int,%20android.content.Intent)

【讨论】:

【参考方案4】:

您的方法是有效的,并且会按您的意愿工作。但是,我想在这里提供更多信息。

在您的ListCarsActivity 中,点击floatingButton,您将开始一个新活动AddCarActivity。完成后,单击 “添加汽车” 按钮,您可以执行保存/发布逻辑并关闭 (finish()) 此 (AddCarActivity)。

这样做会阻止您再次重新启动相同的活动 (ListCarsActivity)。此外,如果您关闭 (finish()) ListCarsActivity 并且如果用户从 AddCarActivity 按下 back,则应用程序将关闭(考虑到只有两个活动)。这绝对是你不想要的。

相反,您可以在ListCarsActivity 中实现onResume 方法,以使用新数据和更新数据刷新列表。一旦用户点击“添加汽车”并且AddCarActivity被关闭,同样的函数将被调用。因此,无需再次启动Activity。

【讨论】:

【参考方案5】:

当用户添加汽车按钮时不要再次调用ListCarsActivity,只需放入finish() 因为您的第一个活动,您刚刚开始活动ListCarsActivity.kt 尚未完成,所以它已经在堆栈中。如果您再次调用ListCarsActivity.kt,那么在您的堆栈中,您的活动打开了两次。

【讨论】:

以上是关于Android:从历史堆栈中清除旧的活动实例的主要内容,如果未能解决你的问题,请参考以下文章

清除 android 活动堆栈开始一个新活动

从堆栈中清除后台活动/活动的正确方法是什么?

Android:清除活动堆栈

清除活动堆栈

Android:打开活动而不保存到堆栈中

清除旧 SDK(缺少 FLAG_ACTIVITY_CLEAR_TASK)上的完整 Android 活动堆栈