Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.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 服务、线程和进程_Android_Multithreading_Android Activity_Process_Android Service - Fatal编程技术网

Android 服务、线程和进程

Android 服务、线程和进程,android,multithreading,android-activity,process,android-service,Android,Multithreading,Android Activity,Process,Android Service,在一段时间里,我读了 服务不是在自己的线程上运行,而是在UI线程上运行 我在许多其他与服务相关的问题中也读过类似的陈述 如果我从活动调用startService(),那么服务会在活动的UI线程上运行吗,还是会用自己的UI线程生成一个新进程 如果它在活动的UI线程上运行,是否有可能使活动无响应?是的服务在主线程上运行,关于ANR(应用程序无响应)问题,如果您的服务使用CPU进行长时间的处理工作,则ANR发生的可能性更高,因此官方文档还建议使用工作线程,以提高效率 您必须阅读文档中的注意段落进行确认

在一段时间里,我读了

服务不是在自己的线程上运行,而是在UI线程上运行

我在许多其他与服务相关的问题中也读过类似的陈述

如果我从
活动
调用
startService()
,那么
服务
会在
活动
的UI
线程
上运行吗,还是会用自己的UI
线程
生成一个新进程


如果它在
活动
的UI
线程
上运行,是否有可能使
活动
无响应?

是的服务在主线程上运行,关于ANR(应用程序无响应)问题,如果您的服务使用CPU进行长时间的处理工作,则ANR发生的可能性更高,因此官方文档还建议使用
工作线程
,以提高效率

您必须阅读文档中的注意段落进行确认

如果您的任务是一次性完成的,那么请使用
IntentService
,它隐式地使用线程机制进行处理,但
IntentService
将在任务完成时自动销毁自身,因此您必须在下一次重新启动它

android:process:在另一个进程中使用它启动服务将导致占用更多内存。这将导致在单独的堆内存空间中为您的应用创建两个进程,这也需要其他维护。因此这很少使用,我不建议将其用于常规服务任务

如果我从
活动
调用
startService()
服务
是否会继续运行
活动
的UI
线程
,或者它是否用它的 自己的UI
线程

如果它是
服务
(不是
IntentService
),只要您不明确地将其定义为单独的进程(通过在清单中添加
android:process
标记),它将在应用程序进程的主
线程
上运行

如果它在
活动
的UI
线程
上运行,是否有风险使
活动
无响应

是的,如果您执行CPU密集型/阻塞操作,它会执行

为了防止这种情况,您可以从
服务
启动新的
线程
,或者使用
IntentService
,它将自动生成一个新的工作线程。

从中可以清楚地解释您的答案

警告:服务在其宿主进程的主线程中运行 服务不创建自己的线程,也不在单独的线程中运行 过程(除非您另有规定)。这意味着,如果 服务将执行任何CPU密集型工作或阻塞操作 (如MP3播放或网络),您应该创建一个新线程 在服务范围内完成该工作。通过使用单独的线程,您可以 将降低应用程序不响应(ANR)错误和 应用程序的主线程可以保持专用于用户交互 与你的活动


IntentService在后台线程上运行,因此,如果您想执行一次性任务,请使用它

在最近的回答中,我读到

 A service does not run on its own thread, it runs on the UI thread
这完全是错误的。
服务
是一个对象(类的实例)。它不会在任何线程上运行,它根本不会运行。它只是“是”。
服务的方法可以在任何线程上运行,具体取决于

具体来说,直接从Android框架调用的
服务的生命周期方法
onCreate()
onStartCommand()
,等等)运行在主(UI)线程上,主(UI)线程可能与调用
startService()的线程相同,也可能不同。但是,
服务
可以(并且通常会)启动其他后台线程,以执行必要的工作

如果我从活动调用startService(),该服务是否会在 活动的UI线程,还是用自己的UI生成新进程 线

见上文。如果希望
服务
在单独的进程中运行,可以通过在清单中的
声明中指定
android:process=“:Service”
来实现。默认情况下,服务与应用程序的其他组件(
Activity
BroadcastReceiver
等)在同一进程中运行

如果它在活动的UI线程上运行,是否会有使 活动无反应


这取决于您的
服务正在做什么!显然,如果你的
服务
在UI线程上进行大量计算密集型处理,那么你的应用程序将无法响应。如果您的
服务
正在UI线程上执行I/O,Android通常会抛出异常(在较新版本的Android中)。这就是服务通常启动后台线程来完成工作的原因。但是,如果您的
服务
是轻量级的,那么您的
服务
的方法就没有理由不能在UI线程上运行。正如我所说的,这取决于……

无论谁否决了这项投票,请留下一条评论,说明原因
IntentService
不在后台线程上运行。
IntentService
的生命周期方法在主(UI)线程上运行,与所有服务的生命周期方法相同
IntentService
通过调用
OnHandleContent()
(在工作线程上调用,而不是在主(UI)线程上调用)创建一个(或多个)工作线程,用于“执行”IntentService
。然而,
IntentService
并不总是问题的最佳解决方案,因此建议OP在不了解其应用程序的情况下使用
IntentService
是没有帮助的。“这完全是错误的…”我认为你在这里有点迂腐。“服务”一词可以有多种含义