アクティビティによって開始される (バインドされない) サービスがあります。アクティビティが破棄された場合 (たとえば、戻るボタンを押すことによって)、サービスは引き続き実行されます。これはもちろん意図されたものです。ただし、「最近のアプリ」リストからアクティビティをスワイプすると、サービスがすぐに再起動されます。これは再現可能です。アクティビティ/アプリがリストからスワイプされるたびに、サービスの onCreate メソッドが新たに呼び出されます。間に onDestroy を呼び出す必要はありません。
最初に、サービスがAndroidによって強制終了されると思いましたが、強制終了の理由がわかりませんでした(アクティビティもサービスもリソースを消費することはありません。実際、それらは最小限で何もしません)。しかし、その後、サービスが実際にクラッシュすることに気付きました。
V/MainActivity(856): onDestroy // swipe out of the list
I/ActivityManager(287): Killing 856:com.example.myapp/u0a10050: remove task
W/ActivityManager(287): Scheduling restart of crashed service com.example.myapp/.TestService in 5000ms
コードは注目に値するものではありませんが、ここにあります
アクティビティ:
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.v(TAG, "onCreate, starting service...");
startService(new Intent(this, TestService.class));
}
@Override
protected void onStart() {
super.onStart();
Log.v(TAG, "onStart");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.v(TAG, "onDestroy");
}
//[...]
}
サービス:
public class TestService extends Service {
private static final String TAG = "Service";
// onBind omitted
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v(TAG, "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.v(TAG, "onDestroy");
}
}
要するに、私のサービスはアクティビティのライフサイクルから独立していますが、最近のアプリのリストからアプリをスワイプしない限りのみです。その場合、サービスは再開されますが、onDestroy は呼び出されません。
これが発生するたびに、サービスの状態だけでなく、サービスが行っている作業も失われます。スワイプがこれの理由である理由を知りたいだけです。