【问题标题】:How to make sure that a class runs in background as long as needed on all devices?如何确保课程在所有设备上都需要在后台运行?
【发布时间】:2017-06-25 07:22:27
【问题描述】:

我希望我的一个班级即使在应用程序关闭后也能在所有设备上不间断地在后台运行。我尝试过扩展 WakefulbroadcastReciever 并使用警报开始上课,它在某些设备上运行顺利,但在某些设备上,几分钟后就停止了。通过在系统设置中更改我的应用程序的设置,我能够使该课程不间断地运行。但是,我希望我的课程默认在后台不间断运行,而不要求用户明确更改设置。我可以尝试设置警报以在它死后重新开始上课,但我怎么知道它什么时候死?或者如果有其他方法请告诉我。

另外,我的班级实现了 SensorEventListener。只是说说而已。

【问题讨论】:

    标签: android


    【解决方案1】:

    如前所述,您使用Service

    此外,如果出现内存不足的情况,使用 startForeground 会使系统不太可能破坏服务。它不会使它无懈可击。

    此外,使用 START_STICKY 允许系统在一段时间后“恢复”服务:

    从 onStartCommand(Intent, int, int) 返回的常量:如果该服务的进程在启动时被杀死(在从 onStartCommand(Intent, int, int) 返回之后),则将其保持在启动状态但不要' t 保留此传递的意图。稍后系统将尝试重新创建服务。因为处于启动状态,所以会保证在创建新的服务实例后调用onStartCommand(Intent, int, int);如果没有任何待处理的启动命令要传递给服务,它将使用 null 意图对象调用,因此您必须注意检查这一点。

    此模式适用于将显式启动和停止以运行任意时间段的事物,例如执行背景音乐播放的服务。

    (source)

    但我想说的是,如果需要更多内存,执行这些操作并不能保证服务能够“存活”。即使你使用 START_STICKY 和 startForeground() 也不能保证服务不会被系统杀死。

    因此,您无法确保它持续运行而没有系统被杀死的风险,但您可以降低它被系统杀死的可能性。

    对于广播接收器,它们可以用来接收数据。例如,如果您想要一个在启动时启动的服务,您可以为此创建一个。如果您希望它在拨打电话时启动,您可以为此创建一个。不过,常见的是将其连接到服务。

    而在此服务中,您可能需要一个线程或一个计时器来重复操作。

    【讨论】:

    • 并且,根据 OP 对“运行”的定义,需要考虑打盹模式和应用待机。
    • 它可以工作,但是当强制终止服务时 onDestroy 似乎不起作用。顺便说一句,我展示了来自 onDestroy 的祝酒词。
    • 如果你强制停止应用程序,那么它不会经历 onStop + onDestroy(对于一个 Activity)和 onDestroy(对于一个服务)的常规循环。如果应用程序因异常而崩溃,则相同
    【解决方案2】:

    使用Service https://developer.android.com/reference/android/app/Service.html

    如果您想确保(尽可能)系统在内存不足时不会破坏它,请使用startForeground 方法

    https://developer.android.com/reference/android/app/Service.html#startForeground(int,%20android.app.Notification)

    您可以覆盖onDestroy 以了解服务对象何时被销毁。

    【讨论】:

      猜你喜欢
      • 2014-07-14
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多