1

Android がサービスを強制終了したときに onDestroy() が必ずしも呼び出されるとは限らないことを知っています (つまり、このサービスを適切に停止せずに実際に殺されたことを意味します)。非同期タスクを開始するフォアグラウンド サービスがあり、サービスが強制終了されたときに実行中のタスクを確実にキャンセルする必要があります。サービスと非同期タスクは、サービスの開始に使用されるアクティビティと共に同じプロセスで実行されます。

私の質問は、onDestroy() が呼び出されることに依存できない場合に、このタスクをキャンセルする方法です。Androidが単一のサービスを強制終了し、プロセスとタスクを実行したままにするか、Androidがプロセス全体のみを強制終了する可能性はありますか? これにより、タスクが停止することも保証されるため、最後のものは私にとっては問題ありません。

4

2 に答える 2

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次に、サービスを手動で停止した後、デバッグポイントを配置します。それがヒットした場合、あなたのタスクはあなたのサービスよりも長生きしたと主張することができます。

他の人は正しいと思いますが(killは、基礎となるすべてのプロセスを強制終了することを意味します)、このような非同期タスクを孤立させることが可能かどうかを知りたいと思います。

于 2012-11-22T13:41:24.860 に答える
0

See docs here: http://developer.android.com/reference/android/app/Service.html

The Android system will attempt to keep the process hosting a service around as long as the service has been started or has clients bound to it. When running low on memory and needing to kill existing processes [...]

therefore if your both AsyncTask and service share the process, both will go down.

于 2012-11-22T13:29:19.080 に答える