O serviço do Android trava depois que o aplicativo é excluído da lista de aplicativos recentes

Eu tenho um serviço que é iniciado (não vinculado) por uma atividade. Se a atividade é destruída (por exemplo, pressionando o botão Voltar), o serviço continua a ser executado, isso é obviamente pretendido. No entanto, se eu tirar a atividade da lista de "aplicativos recentes", o serviço será reiniciado imediatamente. Isso é reproduzível, toda vez que a atividade / aplicativo é excluída da lista, há uma nova chamada para o método onCreate do serviço. Nenhuma chamada para onDestroy no meio!

Primeiro eu pensei que o serviço fosse morto por android, mesmo que eu não visse nenhuma razão para a morte (nem a atividade nem o serviço consomem recursos, na verdade eles são minimalistas e não fazem nada). Mas então percebi que o serviço realmente falha.

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

O código não é digno de nota, mas aqui está

Atividade:

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");
    }

    //[...]
}

Serviço:

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");
    }

}

Resumindo: meu serviço é independente do ciclo de vida da atividade, mas apenas enquanto eu não deslize o aplicativo da lista de aplicativos recentes. Nesse caso, o serviço é reiniciado, mas sem uma chamada para onDestroy.

Toda vez que isso acontece, não apenas o estado do serviço, mas também o trabalho que o serviço está fazendo é perdido. Eu só quero saber por que o furto é a razão para isso.

questionAnswers(3)

yourAnswerToTheQuestion