【问题标题】:Why job service is still running when application is force stopped?当应用程序被强制停止时,为什么作业服务仍在运行?
【发布时间】:2018-03-06 10:02:25
【问题描述】:

在我的录音应用程序中,我创建了一个作业服务,它将以预定的频率间隔安排录音作业。一旦我安排每 5 分钟记录一次作业(示例),在几次记录之后,当我强制停止应用程序时,我可以看到作业服务仍在运行并尝试记录并失败。应用程序中的所有其他服务都已停止。

当我强制停止应用程序时,为什么作业服务仍在运行?我需要特别注意停止工作服务吗?

【问题讨论】:

  • 请向我们展示您的工作服务代码。
  • 强制停止是指点击应用信息页面中的“强制停止”还是将其从最近的应用中滑出?因为从应用信息页面单击“强制停止”后,我无法看到我的服务正在运行。

标签: android android-service android-lifecycle forceclose android-jobscheduler


【解决方案1】:

很多 Android 应用 在后台运行一个小型 服务 允许与其他应用程序/服务进行互连,并 当您不使用应用程序(Facebook、短信、电子邮件、广告等)时允许通知。明确一点,SERVICE在后台运行和APP打开后在后台运行是有区别的。

所以你可以通过以下两种方式在用户关闭应用时销毁服务来防止它。

首先,从服务类中调用:

stopSelf();

其次,从另一个类中,例如您的 MainActivity

Intent i = new Intent(this, ServiceName.class);
stopService(i);

这两种方法都会停止您的服务。确保您返回 START_NOT_STICKY 以便服务不会再次启动。

【讨论】:

  • 谢谢。但是,在我的情况下,我强制停止我的应用程序。当我强制停止我的应用程序时,我正在使用的其他服务正在停止。但是,定期安排作业的 JobService 并没有停止。
【解决方案2】:

在清单文件中为您的服务使用以下代码。这将停止服务及其任务。

<service android:name="service" android:stopWithTask="true"/>

【讨论】:

  • 我试过这个。但是,我的工作服务仍在运行。
【解决方案3】:

您的工作是周期性工作,对吗?您是否尝试过使用其各自的 ID 显式取消作业?

    JobScheduler scheduler = (JobScheduler)
            mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE);

    for (JobInfo jobInfo : scheduler.getAllPendingJobs()) {
        if (jobInfo.getId() == jobID) {
            scheduler.cancel(jobID);
            Log.i(TAG,"Cancelled Job with ID:" + jobID);
        }
    }

或者您可以尝试取消所有已通过此包注册到JobScheduler 的作业。

    JobScheduler scheduler = (JobScheduler)
            mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE);

    scheduler.cancelAll();

【讨论】:

  • 我的服务中有取消逻辑。问题是当我强制停止应用程序时,没有调用生命周期方法。我不确定在哪里调用 cancel()。
  • 好吧,我想我明白了。为什么录制失败?您是否在您的工作服务中持有/使用在强制关闭时消失的推荐信?如果是这样,您不应该这样做,因为 Android 也可以从您的下方取出这些内容,例如当内存不足时。使用 Job Scheduler 时,无论应用程序的状态如何,您都在针对 Android 框架调度任务。如果应用程序被强制关闭,当 Job Scheduler 调用 Job Service 时,将在必要时创建一个新的应用程序上下文。 Job Scheduler 适合您吗?
  • 一种可能的解决方法,我自己还没有尝试过,可能是将作业服务可访问的公共静态布尔值默认设置为 false。安排作业时,将其设置为 true。如果您在调用 onStart() 时看到它设置为 false,则您知道您的应用程序的上下文是新的,因此请取消您的作业并返回。但这可能由于其他原因而发生,例如内存不足而不是强制关闭。
  • 知道了。谢谢。
【解决方案4】:

我知道为时已晚,但我发布我的答案以供将来参考:

Job Scheduler 将继续工作至少 15 分钟。(即使您通过滑动或使用强制停止从最近清除应用程序)

所以如果你希望你的服务在应用程序关闭后停止工作,你应该使用Bound Service

绑定服务将继续工作(即使在后台),直到应用程序关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    相关资源
    最近更新 更多