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.