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:从历史堆栈中清除旧的活动实例的主要内容,如果未能解决你的问题,请参考以下文章