我在处理程序,服务和活动的基本概念上有一些混淆。我在很多地方看到提到服务在UI线程中运行。我有几个问题要问。
- 上述说法是对还是错??
- 谁能从android reference for Service中解释一下这个语句
Service不是线程。它本身并不是在主线程之外完成工作的一种手段(以避免应用程序不响应错误)。
如果服务在UI线程中运行,那么它不适合繁重的工作。真/假? ?如果没有活动正在运行,那么哪个线程服务将运行? - 如果上述说法是正确的?那么如果我在服务和活动中声明Handler会发生什么??因为一个线程只有一个Handler实例。
在Java中,任何地方都没有对象在线程中"运行"。方法在线程上运行。上面的陈述是真的还是假的?
因此,更准确的说法是Service
上的生命周期方法——onCreate()
、onStartCommand()
、onBind()
和onDestroy()
——在主应用程序线程上调用。
谁能从android reference for Service中解释一下这个语句
我不知道如何解释得比写的好得多。虽然Service
可以管理后台线程,但Service
本身不是 Thread
。
在Java中,任何地方都没有对象在线程中"运行"。方法在线程上运行。如果服务在UI线程中运行,那么它不适合繁重的工作
因此,更准确的说法是,您不应该在由上述生命周期方法直接触发的工作上花费太多时间。
在Java中,任何地方都没有对象在线程中"运行"。方法在线程上运行。如果没有活动正在运行,那么哪个线程服务将运行?
前面提到的生命周期方法在主应用线程上被调用,不管前台是否有活动,甚至活动是否存在。
那么如果我在服务和活动中声明Handler会发生什么?
您将有一个Handler
的实例。
因为一个线程有一个Handler
实例
Handler
的默认行为是将自己绑定到主应用程序线程,无论您是在Activity
还是Service
中创建Handler
。
来自官方文档:
一个服务运行在它的宿主进程——service的主线程中不创建自己的线程,不运行在一个单独的进程(除非您另有说明)。这意味着,如果你的服务是要执行任何CPU密集型工作或阻塞操作(例如MP3)类中创建一个新线程服务来做这项工作。通过使用单独的线程,您将减少应用程序不响应(ANR)错误的风险应用程序的主线程可以专门用于用户交互与你的活动。