【问题标题】:How to ensure to stop async task when service is killed如何确保在服务被终止时停止异步任务
【发布时间】:2012-11-22 13:03:11
【问题描述】:

我知道当 Androids 终止服务时,不一定会调用 onDestroy() (我的意思是真的杀死了没有正确停止该服务)。我有一个启动异步任务的前台服务,我必须确保在服务被终止时取消正在运行的任务。服务和异步任务与用于启动服务的活动一起在同一进程中运行。

我现在的问题是当我不能依赖 onDestroy() 时如何取消这个任务? Android有可能会终止单个服务并让进程和任务继续运行,还是Android只会终止整个进程?最后一个对我来说没问题,因为这也将确保任务停止。

【问题讨论】:

  • 如果 Android 彻底杀死它 - 它会杀死整个进程,只杀死进程中的一部分是不可能的。
  • 整个过程都死掉了。 (否则没有多大意义)

标签: android android-intent android-asynctask


【解决方案1】:

在此处查看文档:http://developer.android.com/reference/android/app/Service.html

Android 系统将尝试保持进程托管服务 只要服务已经启动或有客户端绑定到 它。当内存不足并需要杀死现有的 进程 [...]

因此,如果您的 AsyncTask 和服务共享进程,两者都会关闭。

【讨论】:

  • 此文档段落似乎是答案,但根据Service 的开发人员指南,在我看来,可以独立于进程终止服务:“Android 系统将强制停止服务仅当内存不足且必须为具有用户焦点的活动恢复系统资源时。”
【解决方案2】:

你可以为此编写一个测试/一些测试代码;

异步任务定义

doInBackground() {

  while (isHostingServiceRunning()) {
     // Do some stuff.
  }

  cancel();
}

private boolean isHostingServiceRunning() {
  final ActivityManager activityManager = (ActivityManager) Application.getContext().getSystemService(Context.ACTIVITY_SERVICE);
  final List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);

  for (RunningServiceInfo runningServiceInfo : services) {
    if (runningServiceInfo.service.getClassName().equals(<hostingServiceClassName>)){
      return true;
    }
  }
  return false;
}

然后在手动停止服务后在return false 上放置一个调试点。如果它被击中,那么可能会认为您的任务超过了您的服务。

我怀疑其他人是对的(kill 意味着杀死每个底层进程)但我很想知道是否有可能孤立这样的异步任务。

【讨论】:

  • 请注意,这只是测试代码。不要将这种昂贵的检查作为某种民意调查。找出答案,它很可能被杀死了。
  • 该任务肯定会比服务寿命更长。因此,我问了这个问题以避免运行孤立任务。你确定 android 中的 kill 总是代表杀死进程而不仅仅是一个活动或服务吗?这意味着android永远无法杀死单个活动或服务,但总是会停止底层进程?
  • 我可以确认调试点已命中并且服务已消失。所以它确实活了app.Service....
猜你喜欢
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多