通过滑动使用关闭应用程序时如何保持线程活动

时间:2017-01-05 19:36:17

标签: android multithreading swipe

我的应用程序的结果页面中有一个帖子。它每分钟都在计算价值。 我的问题是当用户通过从最近的应用程序刷卡关闭应用程序时,线程正在停止。但它必须奏效。

我知道我可以为它创建一个service-intentservice,但这是我的第一个应用程序,我写了很多关于这一点的代码,也就是该线程更改了结果活动页面的值。所以这对我来说是一个很好的行动。

我找了很多,但我找不到答案。如果我可以轻松地保持这个线程,你可以给我一个建议吗?

谢谢

2 个答案:

答案 0 :(得分:1)

将您的主题置于前景Service

通常情况下,当用户从最近的时间点击您的应用时,整个VM都会被终止。但在Android的最新版本中,前台服务并未被杀死。 (感谢Steve M将此更改引起我的注意。)在旧版Android上,甚至前台服务都被杀死了。这是considered a bug。不幸的是,谷歌以不恰当的方式将问题视为“过时”而臭名昭着,因此除非通过测试不同的设备,否则无法知道它何时被实际修复。 (或者甚至是故意修复它,还是因为其他一些改变而意外修复了。)我很确定前景服务在Android 4.4中被杀死了。它们不会在Android 5.1中被杀死,至少在我的设备上,包括曾经运行过4.4的设备。但请注意有关前景服务在5.1和6.0中被杀死的错误报告的评论。这可能是因为它从来没有真正修复过,而且它仍然被击中或错过。

请注意,无论VM是否被终止,前台服务的onTaskRemoved(...)将始终被调用。 (至少在我的测试中。)

您可以通过将此代码放入活动来测试VM是否被杀死:

private static final long vmInitTime = System.currentTimeMillis();

// in onCreate(...)
((TextView) findViewById(R.id.timeView)).setText(new Date(vmInitTime).toString());

只要同一个VM正在运行,显示的时间就不会改变。 (或者更确切地说,只要存在相同的活动类定义。实际上,ClassLoader与VM的生命周期相同。)

答案 1 :(得分:0)

如果向用户显示通知是有意义的,您可以在前台服务中运行该线程。在这种情况下,只要设备没有强制停止应用程序,服务就会继续在许多设备上运行。