如何确保在服务被终止时停止异步任务

时间:2012-11-22 13:03:12

标签: android android-intent android-asynctask

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

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

2 个答案:

答案 0 :(得分:0)

请参阅此处的文档:http://developer.android.com/reference/android/app/Service.html

  

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

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

答案 1 :(得分:0)

您可以为此编写测试/测试代码;

异步任务定义

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上放置一个调试点。如果它被击中,那么可能会认为你的任务超过了你的服务。

我怀疑其他人是正确的(杀人意味着杀死每个潜在的进程)但我有兴趣知道是否可以孤立这样的异步任务。