关于Android中UI线程上运行的服务的问题

 文逸博166293 发布于 2023-02-13 13:19

我已经在一些地方读过服务在UI线程上运行(并且可以阻止它),但我不确定它是如何工作的.我的服务不需要与UI交互,但我确实需要能够处理来自活动的并发请求,所以我不能使用IntentService.所以我有几个问题:

    如果服务是从一个线程中启动的,它是否仍会阻止UI?

    如果服务中的所有工作都在一个线程内完成,它是否仍会阻止UI?

    如果我有多个活动将数据发送到同一个服务,这是如何工作的?例如,活动A最初运行startService(),它启动服务并使其完成大量工作.当服务正在运行时,acrivity B需要向服务发送更多工作,因此它运行anorhter startService().因此,相同的服务实例将处理来自两个活动的意图,但它们是否都会受到该服务的影响?即使服务最初是在活动A内启动的,每个活动是否都会阻止UI被阻止的风险?

    是否存在类似于IntentService在UI外部运行的东西,但是可以处理异步输入而不是等待一个意图在启动另一个之前完成?

Larry Schief.. 11

我的服务不需要与UI交互,但我确实需要能够处理来自活动的并发请求,因此我无法使用IntentService.

实际上,这听起来就像你想要使用IntentService一样.

如果服务是从一个线程中启动的,它是否仍会阻止UI?

是的,从哪里开始服务并不重要.在与UI相同的线程中运行的服务的含义是服务的回调入口点(即onCreate,onDestroy,onBind等).这些始终在应用程序的主线程中运行.

如果服务中的所有工作都在一个线程内完成,它是否仍会阻止UI?

不,实际上这是推荐的方法.IntentService通过自动为您创建工作线程并将Intent交给要处理的线程来简化此操作.如果您使用自己的线程池并将它们排队,那么您可以完成同样的事情,但是很多Intent都会进入.请注意,您必须注意不要在池中创建太多线程,这样您可能会压倒系统.

如果我有多个活动将数据发送到同一个服务,这是如何工作的?例如,活动A最初运行startService(),它启动服务并使其完成大量工作.当服务正在运行时,acrivity B需要向服务发送更多工作,因此它运行anorhter startService().因此,相同的服务实例将处理来自两个活动的意图,但它们是否都会受到该服务的影响?即使服务最初是在活动A内启动的,每个活动是否都会阻止UI被阻止的风险?

我认为这可能是混乱的一部分.该服务在属于服务包的进程的主线程中运行.除非由于某种原因他们专门等待某种类型的回复等,否则不阻止来自其他包的活动.意图本质上是进程间通信(IPC)消息,其依赖于由框架管理的特殊IBinder管道.Intent通过绑定器发送并排队到内部处理程序,最终由框架用于在适当的回调中调用Activity/Service/BroadcastReceiver.

是否有类似于在UI外部运行的IntentService,但是可以处理异步输入而不是在启动另一个意图之前等待一个意图完成?

不,不是开箱即用的.但是,正如我上面提到的,您可以使用线程池或甚至使用AsyncTask来执行此操作.请记住,您必须根据服务的生命周期管理线程和AsyncTask对象,因为这些事物不能识别生命周期.

1 个回答
  • 我的服务不需要与UI交互,但我确实需要能够处理来自活动的并发请求,因此我无法使用IntentService.

    实际上,这听起来就像你想要使用IntentService一样.

    如果服务是从一个线程中启动的,它是否仍会阻止UI?

    是的,从哪里开始服务并不重要.在与UI相同的线程中运行的服务的含义是服务的回调入口点(即onCreate,onDestroy,onBind等).这些始终在应用程序的主线程中运行.

    如果服务中的所有工作都在一个线程内完成,它是否仍会阻止UI?

    不,实际上这是推荐的方法.IntentService通过自动为您创建工作线程并将Intent交给要处理的线程来简化此操作.如果您使用自己的线程池并将它们排队,那么您可以完成同样的事情,但是很多Intent都会进入.请注意,您必须注意不要在池中创建太多线程,这样您可能会压倒系统.

    如果我有多个活动将数据发送到同一个服务,这是如何工作的?例如,活动A最初运行startService(),它启动服务并使其完成大量工作.当服务正在运行时,acrivity B需要向服务发送更多工作,因此它运行anorhter startService().因此,相同的服务实例将处理来自两个活动的意图,但它们是否都会受到该服务的影响?即使服务最初是在活动A内启动的,每个活动是否都会阻止UI被阻止的风险?

    我认为这可能是混乱的一部分.该服务在属于服务包的进程的主线程中运行.除非由于某种原因他们专门等待某种类型的回复等,否则不阻止来自其他包的活动.意图本质上是进程间通信(IPC)消息,其依赖于由框架管理的特殊IBinder管道.Intent通过绑定器发送并排队到内部处理程序,最终由框架用于在适当的回调中调用Activity/Service/BroadcastReceiver.

    是否有类似于在UI外部运行的IntentService,但是可以处理异步输入而不是在启动另一个意图之前等待一个意图完成?

    不,不是开箱即用的.但是,正如我上面提到的,您可以使用线程池或甚至使用AsyncTask来执行此操作.请记住,您必须根据服务的生命周期管理线程和AsyncTask对象,因为这些事物不能识别生命周期.

    2023-02-13 13:22 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有