【问题标题】:Starting foreground service from a background thread从后台线程启动前台服务
【发布时间】:2023-01-30 20:59:53
【问题描述】:

根据 Android 文档:

服务在其托管进程的主线程中运行;

这是否意味着,即使我有另一个线程在运行并且我从该线程启动服务,它仍然会在 UI/主线程上运行?

例如,我有一个 React-Native 应用程序,我使用一个原生模块来启动一个前台服务。在 React-Native 中,原生模块在单独的线程上运行——那么这里的服务是在原生模块的线程上运行还是仍然在主线程上运行?

【问题讨论】:

  • 那一点文档很糟糕。对象,例如某些 Service 子类的实例,不在任何线程上运行。方法在线程上运行。
  • 我明白你在说什么。我只是从谷歌的文档中复制了那句话。让我想知道,为什么他们会发布一些误导性的东西......

标签: android react-native foreground-service


【解决方案1】:

对,那是正确的。 Android系统总是会在宿主进程的主线程上运行一个前台服务,即使你从后台线程启动服务也是如此。这是为了保证前台服务顺利运行,并且可以与系统的其他部分交互,比如通知系统,没有任何问题。如果前台服务执行的工作是长时间运行或资源密集型的,建议使用单独的工作线程来执行工作,并让主线程空闲以执行其他任务。

在 React Native 中,使用本机模块启动前台服务将在本机模块的线程上运行,该线程与主线程分开。但是,服务一旦启动,就会运行在Android系统指定的宿主进程的主线程中。

因此,虽然本机模块可以在自己的线程上启动服务,但服务本身将在主线程上运行并可以访问 Android API,并且会受到与任何其他前台服务相同的限制。如果服务执行的工作是长时间运行或资源密集型的,建议使用单独的工作线程来执行工作,并让主线程空闲以执行其他任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2017-11-02
    相关资源
    最近更新 更多