【问题标题】:Don't kill Activity when pressing back button按下后退按钮时不要杀死活动
【发布时间】:2014-04-29 11:41:07
【问题描述】:

我有四个活动,ABCD。

用户最初会转到 ABCD,然后用户可能想要点击后退按钮以检查 C 上的某些内容,然后点击 C 上的按钮再次将他们带到 D。

我遇到的问题是 D 正在运行一个倒计时计时器,该计时器需要继续倒计时并更新活动 D 视图。如果我当前点击返回返回 C,然后再次点击前进到 D,倒数计时器仍在运行但未连接,因为已为 D 创建了新活动。

我希望用户能够在不影响或破坏 D 的情况下导航回 C,这样我就可以让我的计时器与视图保持联系。

最后,如果用户点击回 B,它会破坏 C 和 D 活动(以及倒计时)。

【问题讨论】:

  • 您应该考虑为这种操作创建一个服务,或者您可以在 D 活动关闭时存储时间,然后在返回时您可以计算微分时间
  • 您还可以使用 Application 类来存储计时器的全局数据(例如开始时间和要测量的时间量),并在每次进入活动时使用这些存储的值创建计时器。
  • 我希望计时器继续运行,以便我可以在特定时间在整个倒计时期间触发警报。我会看看服务,谢谢。
  • 如果你把定时器设为静态会怎样?这样您也可以在其他活动中访问和运行计时器。
  • 我没有考虑过,我会考虑这对我的应用程序如何工作,谢谢。

标签: java android navigation android-activity countdowntimer


【解决方案1】:

当用户离开活动时,在 saveInstanceState 回调上保存计时器值和当前时间很容易。当活动重新创建时,使用计时器值加上它(当前时间 - lastSavedTime)并设置计时器。


它应该可以正常工作,但您可以通过使用片段和 ViewPager 以更好的方式实现这一点。

如果您以前没有使用过 ViewPager。它是一个组件,可让您通过向左或向右滑动屏幕在不同视图之间切换。默认情况下,视图寻呼机加载当前视图和两侧靠近它的视图。因此,如果您在第 1 页(索引 0)中,则第 1 页和第 2 页已加载。如果您在第 2 页,则将加载第 2 页、第 1 页和第 3 页,依此类推。好消息是您可以使用类似这样的简单代码更改将在每个片段附近加载的页面数

mViewPager.setOffscreenPageLimit(3);

所以现在所有 4 个片段都已加载。所以你在屏幕上加载了 4 个片段。根据developers.android.com,所有其他视图(屏幕上的视图除外)都已加载但处于空闲状态,因此我认为您不能将计时器放在片段D中。但这不是问题,因为您只有一项活动。在您拥有的唯一一个活动中实现您的计时器,它会正常工作,因为当页面更改时此活动不会被破坏。但是您仍然需要保存相同的数据(计时器数据 + 当前时间),因为活动可能会由于用户切换到另一个应用程序而停止。

您需要做的最后一件事是访问片段内的计时器数据。我不会解释如何,因为有很多关于如何在活动和片段之间进行通信的教程,但只是为了给你一个想法,你需要在你的片段中声明一个接口,在活动中实现这个接口并在你的片段中使用这个接口来访问定时器数据。

第二种解决方案要复杂得多,但它为用户提供了更好的体验,并且性能提升很明显。决定女巫一号最适合你。祝你好运

【讨论】:

  • 感谢您的回复,我可能最终会实现它,因为它对用户体验也非常好。
【解决方案2】:

你可以用这个

@Override
public void onBackPressed() {
    Intent intent = new Intent(this, C.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);
}

将您的 D 活动置于后台,然后像这样从 C 恢复它

Intent intent = new Intent(this, D.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

但是,您应该为此类后台任务使用服务。

【讨论】:

  • 我刚刚试过这个,然后按回 D 将用户带到主屏幕而不是 C。
  • 它现在再次创建了一个新的 D 实例,因此计时器不再更新 D 视图。
  • 您应该在清单中将两个活动的启动模式设置为“singleTask”(活动标签中的 android:launchMode="singleTask" )
  • 仍然没有发生,当在 D 上启动计时器然后返回 C 然后再次转发到 D 时,倒数计时器不会与视图重新连接。
  • 我建议你使用处理程序 postDelayed(myRunnable, time);而不是计时器?它更像是“Android风格”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
相关资源
最近更新 更多