【问题标题】:Reload fragment on get back from Intent to Activity从 Intent 返回到 Activity 时重新加载片段
【发布时间】:2013-05-27 13:02:07
【问题描述】:

我遇到了一个非常奇怪的问题。

从我的应用程序的 MainActivity 中,通过单击我的菜单按钮之一,加载了一个名为 MyFragment 的新屏幕/片段。 在 MyFragment 屏幕上有一个名为 MyButton 的按钮。如果单击 MyButton 按钮,它将在浏览器上打开一个链接。 问题是,从浏览器中,如果我单击“返回设备”按钮,行为会因我测试应用程序的设备而有很大不同(你们都会同意它不应该这样做):

  • 在三星 Galaxy Tab 2 平板电脑上,应用程序恢复到之前的状态,加载并打开 MyFragment(就好像从我单击 MyButton 的那一刻起没有任何变化一样)。

  • 在 Nexus 4 手机上,应用程序就像重置(然后未加载 MyFragment)。基本上之前的状态都丢失了。

有什么想法吗?

这是我从 MyButton 点击​​事件中调用的一段代码。

Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse("http://www.example.com"));
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // I tried this but no luck
startActivity(i);

提前致谢。

【问题讨论】:

标签: android android-intent android-activity stack fragment


【解决方案1】:

听起来在某些手机上,您的 Activity 被操作系统杀死了。如果 Android 需要回收它正在使用的资源,它有权终止任何进入后台的 Activity。这是预期的行为。为了缓解这种情况,您需要管理Activity Lifecycle。该页面要注意的重要一点是,如果操作系统即将终止您的 Activity,onSaveInstanceState() 将允许您保存您的状态,这将使用 onCreate() 重新启动生命周期并为您提供包含所有内容的 Bundle您保存的状态信息。

此外,fragments have their own lifecycle 具有等效的 onSaveInstanceState() 方法,因此任何特定于 Fragment 的信息都应该在那里管理。

【讨论】:

  • 您不认为有办法避免应用程序被杀死吗?
  • 不,我在“保存活动状态”部分的帖子中的第一个参考资料说明这是操作系统的设计方式。操作系统有权随时终止后台活动或应用程序以回收内存。顺利处理这种情况取决于我们的开发人员。您在答案中提到的“不保留活动”复选框的目的是为了在这些条件下测试应用程序。某些字段,例如 EditTexts,可能会持续存在,但任何严重的状态都需要使用 onSaveInstanceState() 进行管理。
【解决方案2】:

答案:在 Nexus 4“开发者选项”中,“不保留活动”选项设置为 true。这就是为什么...

【讨论】:

  • 这是“强制 android”按照@MattDavis 解释的方式行事的有用功能。您必须考虑这种情况,因此能够使用此选项进行模拟真是太好了。
猜你喜欢
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2017-12-22
相关资源
最近更新 更多