【问题标题】:Thread within Service - Android app服务内的线程 - Android 应用程序
【发布时间】:2018-06-20 20:04:42
【问题描述】:

如果我想在后台服务中创建一个单独的线程(扩展服务),当应用程序退出(单击主页按钮)或手机进入睡眠状态时,线程是否仍然能够运行?我想使用 Service 的行为,但是我的后台服务在主线程上过于繁重,导致我的 UI 出现跳帧。

【问题讨论】:

  • 如果您的服务扩展了 Android 服务,那么它默认在主线程上运行。你的情况怎么是后台服务?
  • @user8035311 by 后台服务 我只是说它扩展了服务并且没有 UI。但是,由于服务默认在主线程上运行,因此会导致 UI 线程跳帧。我在问是否有任何方法可以在单独的线程上运行服务,同时即使应用程序不在前台,仍然保持继续运行的属性。
  • 如果你扩展 IntentService 它将默认运行在一个单独的线程上,如果应用程序在后台可以继续运行。
  • 是的,但是 IntentService 运行任务并在完成后退出。我希望服务在整个应用生命周期内运行。

标签: java android multithreading service background


【解决方案1】:

退出应用后线程是否还能运行(点击 主页按钮)或手机进入睡眠状态?

线程可以在后台运行,也可以在睡眠模式下运行,但主要关心的是是否允许服务运行。

在 Android O 之前,您可以在后台无限期地运行 Service 而没有任何限制。

但是从 Android O 开始,在您的应用进入后台后 X 分钟(根据我的观察大约需要 1 到 2 分钟),后台服务的所有限制都会启动,并且您的服务将停止,就好像您调用了 @ 987654324@

如果您的意图是:

  • 要无限期地运行线程,那么你应该避免这样做,因为它会影响设备的电池寿命并且操作系统限制不允许这样做。您可以使用WorkManager 定期执行您的任务,这将尊重打盹模式。

  • 为确保应用启动的一次性作业一直执行到完成,您可以创建 ForegroundService。前台服务是Service 并有通知。您可以考虑一个音乐播放器应用程序,即使您关闭应用程序并通过通知控制它也可以播放音乐。

    您可以关注这个SO,它描述了在 Android O 以及之前的版本中启动 ForegroundService 的方法

【讨论】:

    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多