上下文和系统服务是线程安全的吗



背景:我正在创建一些在线程池中运行的后台作业(即,这些作业同时运行,而不是在主/UI线程上(。作业通过以下一种或多种方式与上下文或系统服务交互:

  • 获取系统服务(context.getSystemService(并使用其API
    • NotificationManager
    • DevicePolicyManager
    • 等等
  • 启动/停止其他服务(context.startServicecontext.stopService(
  • 注册广播接收机(context.registerReceiver(

问题:上下文和系统服务是线程安全的吗?每次需要与上下文和/或系统服务交互时,我都必须跳到主线程上吗?

我看过Processes/Threads指南,但没有提到上下文或系统服务的使用,在上下文文档或各种系统服务的文档中也找不到任何与线程安全有关的内容。

为了澄清,我并没有试图更新用户界面。我只是试图同时使用应用程序上下文和该上下文提供的系统服务。

此外,还有一个关于SO的类似标题的问题。然而,答案表明上下文的只读属性是线程安全的,这没有帮助;其他的答案都很模糊,没有指向任何来源。此外,我并不担心泄露上下文;我正在使用应用程序上下文。

使用">getSystemService((";与当前上下文密切相关,不鼓励共享/传递/保留这些服务。谷歌的DOC是这么说的。

系统服务是通过Binder在内部使用的,因此从任何线程调用系统服务的方法都是线程安全的。警告:从这些线程安全方法中重试的对象/类不可能是线程安全的

上下文的方法的存在是为了提供">资源";(Drawables、Colors等……真实资源,或Display/Screen信息等…(和返回的数据通常是一个深度克隆的对象,在线程安全模式下可以在特定上下文中完全使用。I.E:">Context.getDisplay((";将在您调用的每个上下文中返回不同的Object(我指的是内存中的指针(。但即使在相同的上下文中,它也可能在每次调用时返回不同的对象。这取决于情况。

启动/停止服务是线程安全的,因为">startService((";是Context的方法(我在上面解释的原因(。