Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OnCuto在OnStand之后没有OnDebug在中间调用_Android_Multithreading - Fatal编程技术网

Android OnCuto在OnStand之后没有OnDebug在中间调用

Android OnCuto在OnStand之后没有OnDebug在中间调用,android,multithreading,Android,Multithreading,将在OnStter之后调用OnCube,而不是OnDebug在中间? 从下图来看,答案是肯定的 但在这本书中,它说: 受保护的顶部无效() 当用户不再可以看到您时调用 用户。接下来,您将收到onRestart()、onDestroy()或 无,取决于以后的用户活动 即使用户转到其他应用程序或关闭屏幕,我的应用程序也需要运行后台任务。任务应该停止的唯一情况是应用程序完全关闭。因此,我在onCreate()中创建并运行后台线程,并在onDestroy()中停止它。我面临的问题是,有时我的多个线程同

将在OnStter之后调用OnCube,而不是OnDebug在中间?

从下图来看,答案是肯定的

但在这本书中,它说:

受保护的顶部无效()
当用户不再可以看到您时调用 用户。接下来,您将收到onRestart()、onDestroy()或 无,取决于以后的用户活动

即使用户转到其他应用程序或关闭屏幕,我的应用程序也需要运行后台任务。任务应该停止的唯一情况是应用程序完全关闭。因此,我在
onCreate()
中创建并运行后台线程,并在
onDestroy()中停止它。我面临的问题是,有时我的多个线程同时运行。当我离开我的应用程序很长一段时间后又回来时,这种情况经常发生。我认为这可能是由于多次调用
onCreate()
造成的。如何解决

当我离开我的应用程序很长一段时间后又回来时,这种情况经常发生。我认为这可能是由于多次调用onCreate()。如何解决

onCreate()
中,您可以检查后台线程是否正在运行,如果是,则不要再次启动

更重要的是,您的后台线程是
服务
还是
异步任务
还是仅仅是简单的
线程


考虑到您问题中的措辞,如果您尚未使用
服务,我建议您选择
。它不会产生“多线程”问题。

请使用
服务运行后台任务。如果要在当前活动销毁时停止服务,可以使用
绑定服务。

请发布您的代码片段以获得确切的想法,您是如何尝试的。我们可以提供更多帮助

将在OnStter之后调用OnCube,而不是OnDebug在中间?

简短回答:

长答覆:

如果在
活动
上仅调用了
onStop
,则不会调用
onCreate
。在
onStop
之后,如果用户导航回活动,则将调用
onStart
(在此之前也将调用
onRestart

现在让我解释一下在
onStop
之后如何调用
onCreate
,而不调用
onDestroy

为此,您需要查看android中的流程优先级层次结构:

自调用
onResume
但尚未调用
onPause
时起,活动仍在前台进程中。而且,由于前台进程具有最高优先级,所以它不会被杀死

onPause
用户不再能够与
活动进行交互,但该活动可见时调用。示例:打开活动上方的
对话框片段时。然后活动流程进入可见流程。此进程的优先级低于前台进程,但具有足够的优先级,不会被杀死

之后不会出现
onStop
,当用户不再能够看到活动时调用,这意味着活动不可见。 当活动流程移到后台流程中时,就会出现这种情况。现在,如果系统需要更多内存,并且您的活动消耗的内存比其他活动多,则可以将其杀死(这与本答案的主题无关,即哪个背景首先被杀死)

因此,如果某个活动位于后台并被系统终止,则不能保证调用onDestroy
。在这种情况下,
onCreate
将在
onStop
之后调用,而不调用
onDestroy

这就是为什么在问题图像(活动生命周期)中显示,如果应用程序进程被终止,
onCreate
将在
onStop
之后调用

编辑1:

如果您想在销毁活动之前处理任何事情(如释放内存、杀死内存密集型任务等),并且由于
onDestroy
不能保证被调用,您可以实现(仅对于api级别>=14)接收应用程序/活动不同阶段的回调。不同的阶段和他们的解释是不同的


如果您想在API级别<14中实现相同的功能,可以使用回调,它大致相当于。

您的回答很有帮助。onDestroy()不保证被调用。奇怪的是没有onkill()方法,所以不可能处理所有活动死亡事件。我现在正在学习如何使用服务来解决我的问题。@JeffreyChen,是的,有一些方法可以获得这些回调,我已经更新了答案,只需检查一下它。handler.postDelayed([Runneable及其run()包含这一行],一些句号)。因此,它会定期运行,直到布尔标志设置为true。如果我在服务中启动任务,然后终止并重新创建服务,该怎么办。它似乎也产生了“多线程”问题。@JeffreyChen如果服务正在运行,它将不会再次运行。如果该服务被终止,并且您的程序再次启动它,那么它仍然只运行该服务的一个实例。但是在我的例子中,该服务每次重新创建时都会生成一个工作线程。难道不可能同时运行多个工作线程吗?