【问题标题】:Can an android app run in background continuously?android应用程序可以在后台连续运行吗?
【发布时间】:2017-05-11 14:58:11
【问题描述】:

我正在尝试开发一个 android 应用程序,该应用程序将在后台连续运行,收集加速度计传感器数据(每 2 分钟一次)。我扩展了 Service 类并实现了 'onSensorChanged' 方法。为了记录数据,我使用了一个在文件中写入相同内容的类。文件编写器类扩展了“AsyncTask”,并且该操作已在方法“doInBackground”中编码。

我已经尝试关注一些链接: Android App with Service Only,App run in Background,Run app in background。 尽管我已经尝试实施建议的内容,但文件日志仍然清楚地显示有大部分时间(甚至 12 小时)没有数据。尽管据我所知,加速度传感器总是会产生一些数据。此外,当我单击应用程序时,会生成数据日志。该文件被写入 15 分钟(这也不是静态的),然后应用程序不再记录数据。 任何建议都会有很大帮助。已经卡了一个月了。提前致谢。

【问题讨论】:

  • “尽管据我所知加速度传感器总是会产生一些数据”——如果设备处于睡眠模式则不会。除非您的应用被添加到电池优化白名单中,否则您无法在 Android 6.0+ 上无限期保持设备唤醒。
  • 打盹模式可能是您的问题:source.android.com/devices/tech/power/mgmt
  • 感谢@CommonsWare。我已经尝试过使用 START_STICKY。仍然没有运气。我还尝试使用单独的线程(甚至在警报管理器中)来管理线程级并行性。但令人担忧的是,该应用程序似乎在一段时间后自行关闭。可以停止吗?
  • AFAIK 不能保证如果您的服务不是系统服务(因此需要生根),它会继续运行。在我制作服务的 5 年经验中,Android 最终会扼杀它,特别是在最新版本上。

标签: java android


【解决方案1】:

您不能保证系统在需要 ram 时不会关闭服务。还有打瞌睡要担心(我不知道确切的互动)。最好用 START_STICKY 启动服务,操作系统会尽快重启。

作为一种解决方案,您可以查看 AlarmManager,虽然我知道这更多地用于安排一次性操作。

要研究的另一件事是job scheduler 类。如果需要支持低于21的api,还有firebase的开源实现@

【讨论】:

    【解决方案2】:

    如果您想更好地控制并行度,也可以在单独的线程中创建服务。

    【讨论】:

    • 详细解释,这将如何解决问题中提出的问题。
    【解决方案3】:

    如果你想要一个持续运行的服务,你应该使用ForegroundService,因为BackgroundService 可以被操作系统杀死。当内存不足时,如here所解释的那样@

    前台服务是用户主动了解的服务,并且不是系统在内存不足时终止的候选者。前台服务必须为位于 Ongoing 标题下的状态栏提供通知。这意味着除非服务已停止或从前台删除,否则无法关闭通知。

    【讨论】:

    • 详细解释,这将如何解决问题中提出的问题。
    • 我可以根据经验告诉您,即使是前台服务也会被杀死。您可以通过 Google 解决用户在使用 Play 音乐等已知前台服务时遇到的问题。
    • @m0skit0 是的,如果它被用户杀死(使用某些应用程序管理器)或设备关闭时。但不是因为内存不足。
    • 当设备关闭时,真的吗?我永远不会猜到。无论如何,我可以告诉你,在这些情况之外,前台服务将被杀死。我仍然不确定它为什么会发生,但它确实会发生。
    • @m0skit0 当然关于“关闭”我很讽刺;)。我根据android官方文档带来了这些信息。我自己的不是假设。
    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 2022-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多