Android worker线程持续多长时间?

Android worker线程持续多长时间?,android,multithreading,android-activity,worker-thread,Android,Multithreading,Android Activity,Worker Thread,我看过一些关于这个问题的帖子,但没有一个有令人满意的答案 假设我在其onCreate()方法中从主(一个也是唯一的)Activity启动一个工作线程。然后我调用finish()以终止活动 此时,它所属的任务将被销毁(因为其中不再有任何活动)。但是,应用程序(以及运行它的进程)可以继续以空的“骨架”形式存在,以便在需要时可以快速重新启动(尽管它很容易被系统杀死) 假设以上是正确的——工作线程何时被终止?是否只有在系统主动破坏进程时才会终止 在我的例子中,我的工作线程作为蓝牙连接的侦听器存在;收到后

我看过一些关于这个问题的帖子,但没有一个有令人满意的答案

假设我在其
onCreate()
方法中从主(一个也是唯一的)
Activity
启动一个工作线程。然后我调用
finish()
以终止
活动

此时,它所属的任务将被销毁(因为其中不再有任何
活动
)。但是,应用程序(以及运行它的进程)可以继续以空的“骨架”形式存在,以便在需要时可以快速重新启动(尽管它很容易被系统杀死)

假设以上是正确的——工作线程何时被终止?是否只有在系统主动破坏进程时才会终止

在我的例子中,我的工作线程作为蓝牙连接的侦听器存在;收到后,它将再次启动所需的
活动
。在这种情况下,没有正在运行的组件(
Activity
Service
ContentProvider
BroadcastReceiver
)。在我看来,这应该是可行的,除了有什么东西正在杀死我的工作线程

我知道通过使用后台
服务
,我可以做到这一点(而且不那么痛苦)。然而,我很好奇为什么这不起作用

谢谢, Barry

Android中有一个主线程(也称为UI)。这是应用程序使用的唯一线程,除非它通过
thread.start()
AsyncTask.execute()
等显式启动线程。所有活动、服务、广播接收器等都在该主线程上运行其所有生命周期方法。请注意,我包含了服务—服务在主线程上运行,除非它启动自己的线程(例外是
IntentService
,它在自己的线程上运行)

您创建的
线程将继续执行,直到
Runnable
其传递的函数从其run函数返回(当然,进程也会终止)。它可以持续到创建它的
活动/服务
结束后。然而,这样的线程仍然存在于组件的原始实例中,并且如果在没有大量特殊工作的情况下重新启动,则无法访问新实例的变量(请参见加载程序模式)。

Android中有一个主(也称为UI)线程。这是应用程序使用的唯一线程,除非它通过
thread.start()
AsyncTask.execute()
等显式启动线程。所有活动、服务、广播接收器等都在该主线程上运行其所有生命周期方法。请注意,我包含了服务—服务在主线程上运行,除非它启动自己的线程(例外是
IntentService
,它在自己的线程上运行)

您创建的
线程将继续执行,直到
Runnable
其传递的函数从其run函数返回(当然,进程也会终止)。它可以持续到创建它的
活动/服务
结束后。但是,这样的线程仍将存在于组件的原始实例中,并且如果在没有大量特殊工作的情况下重新启动,则无法访问新实例的变量(请参见加载程序模式)。

有一个很好的示例,非常详细:

进程生命周期错误的一个常见示例是广播接收器 当线程在其 方法,然后从 功能。一旦返回,系统将考虑广播接收器 不再处于活动状态,因此不再需要其托管进程 (除非其他应用程序组件在其中处于活动状态)。那么这个系统呢, 可以随时终止进程以回收内存,在这样做时, 它终止进程中运行的派生线程

简言之,如果线程有机会运行直到终止或进程提前终止,那么这确实不是很可预测的,您不应该完全依赖于任何顺序/行为

另外值得一提的是,即使您完成了()活动,也可以很容易地将其与线程一起执行,但如果它是您的最后一个/唯一一个活动,则不会改变图片

有一个很好的示例,非常符合主题:

进程生命周期错误的一个常见示例是广播接收器 当线程在其 方法,然后从 功能。一旦返回,系统将考虑广播接收器 不再处于活动状态,因此不再需要其托管进程 (除非其他应用程序组件在其中处于活动状态)。那么这个系统呢, 可以随时终止进程以回收内存,在这样做时, 它终止进程中运行的派生线程

简言之,如果线程有机会运行直到终止或进程提前终止,那么这确实不是很可预测的,您不应该完全依赖于任何顺序/行为


另外值得一提的是,即使您完成了()活动,也可以很容易地将其与线程一起执行,但如果它是您的最后一个/唯一一个活动,则启动线程时不会改变图片,它独立于启动线程的父级。在您的情况下,这是您的应用程序活动。这意味着,在Run方法完全执行之前,线程将处于活动状态

如果退出应用程序(并因此调用活动的onStop方法),线程将仍然存在,并且会导致内存泄漏。如果内存不足,它最终会被系统杀死

因为您提到您创建了一个侦听器来侦听蓝牙连接,所以您的线程可能在接收到任何事件之前就死了(我不可能知道没有任何代码片段)。它还可能崩溃,从而结束线程。

Wh
 EventBus.getDefault().post(new BlueToothEvent()); // call in your worker thread
// do something in your service
onBlueToothEventFired(BlueToothEvent  e);