如何在不丢失数据的情况下返回我的父活动?
Posted
技术标签:
【中文标题】如何在不丢失数据的情况下返回我的父活动?【英文标题】:How to come back to my parent-activity without losing data? 【发布时间】:2018-10-09 03:28:20 【问题描述】:我有一个带有“子活动”的activity
A,即activity
B。
当我创建一个活动时,就像在这种情况下在android中一样,我选择活动B,他的父母应该是活动A。
所以,当我启动我的应用程序时,我在活动 B 的 appbar
中有一个 icon
,我可以在其中转到活动 A。
在我的例子中,用户例如edit-text
并在活动 A 中操作一些变量并使用 Intent 调用活动 B。
现在,在活动 B 中,当我单击“返回”图标时,我将返回到本例活动 A 的父活动,并且所有操作的数据都“离开”,因为屏幕将重新启动。
但是当我不点击活动B中的图标而是点击手机上的“返回”时,我会回到活动A并且所有被操纵的数据仍然存在。
所以我的问题是,有没有办法通过单击活动 B 中的后退图标返回活动 A,而不会重新启动屏幕。因为这个图标是自动添加的,所以当我说,哪个活动必须是父类。我想,我可以用这个图标返回,但不能重新启动屏幕,而是继续,我“最后”一次。
我向你展示我的活动 B 清单文件的一部分:
<activity
android:name=".strassenfuehrer_screen.VideoPlayerHandlungsleitfadenStrassenfuehrerActivity"
android:label="Straßenführer > Handlungsleitfaden > VideoPlayer"
android:parentActivityName=".strassenfuehrer_screen.MitHandlungsleitfadenStrassenfuehrerScreenActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="de.derdoenerdon.ressourcencockpit.strassenfuehrer_screen.MitHandlungsleitfadenStrassenfuehrerScreenActivity" />
</activity>
这里可以看到Activity B中的“返回图标”。
如果需要帮助,我将非常感激,我是 android 新手,遇到困难。
非常感谢
【问题讨论】:
这看起来像是***.com/questions/4873263/…的副本 如果你从AstartActivity
,不要完成它,当你从B回来时,你会得到你以前的数据。
什么意思?我的意思是,当我点击后退图标时,它会再次重新启动我的父级.. 或者你的意思是如何启动意图?
如果你切换 Activity 然后不要完成它,当你按下后,你会得到你留下的任何东西。
是的,但是我正在寻找一种方法来获取“此图标”,单击该图标并转到调用此活动的活动并使用该状态,就像您只需单击“返回”一样您的手机,也应实现,但有这个图标,将恢复活动
【参考方案1】:
在活动 A 的清单中添加此属性:
android:launchMode="singleTask"
这应该可以解决您的问题。
这样可以确保 BackStack 中只有一个 Activity A 实例。因此,每个 Task 只创建一次 Activity A。
希望这会有所帮助。
更多信息https://developer.android.com/guide/components/activities/tasks-and-back-stack
【讨论】:
谢谢,非常非常好。它帮助了我。但是如果活动A需要“返回”到活动“0”,然后再从活动0返回到活动A,所有这些“修改”都将丢失。为什么我可以从 B 移动到 A 而不会丢失修改?它很好,但如果我可以先到 0 再到 A 而不会丢失修改,那就完美了 您必须了解 android 中的“Tasks”和“BackStack”是如何工作的。简而言之,每当您启动应用程序时,都会创建一个“任务”,并且每个“任务”都有一个 BackStack。现在,无论何时启动一个活动,它都会被推送到堆栈中,而当您按下后退按钮(电话)时,它就会从堆栈中弹出。您尝试返回的任何其他方式都不会带您返回,而是启动前一个活动的新实例(这就是您丢失修改的原因,因为它是一个新实例)。为避免在“任务”中创建多个活动实例,您可以执行上述操作。 这确保只有一个活动实例保留在“任务”中,并且当您在代码中的任何位置调用该活动时,都会返回相同的实例(具有“修改”),因此您查看您的“修改”。为了更好地理解这一点,请访问我在答案中发布的链接。【参考方案2】:您可以将onSaveInstanceState()
覆盖到您的Activity
中,并在离开Activity
之前保存您的数据。
@Override
public void onSaveInstanceState(Bundle savedInstanceState)
savedInstanceState.putInt("KEY1", Value1);
savedInstanceState.putInt("KEY2", Value2);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
返回该活动后,您可以将保存的数据作为捆绑包获取到onCreate()
方法中。
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState); // Always call the superclass first
if (savedInstanceState != null)
// Restore value of members from saved state
int val1 = savedInstanceState.getInt("Key1");
int val2 = savedInstanceState.getInt("Key2");
else
// This is the case when you are openning this Activity for the for the first time
【讨论】:
但是你认为有没有一种方法可以找到“选定项目”图标,而不是启动新屏幕,而是恢复停止的屏幕? @JosipaAllen 你可以使用Android提供的SharedPreference
。
不,我的意思是,当我点击图标时,屏幕将再次启动,我所做的所有状态都消失了。但是,如果我实现所选项目的行为,在这种图标的情况下,如果我发现,如果点击了图标,我只想“恢复”这个称为新活动的活动。这在我点击手机上的“返回”时有效,但在我点击图标时无效,这就是为什么我问,也许有办法,用这个图标做同样的行为以上是关于如何在不丢失数据的情况下返回我的父活动?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不参考 BigQuery 中的父记录的情况下查询嵌套记录中的字段?