Existe uma maneira de forçar um aplicativo a continuar sendo executado em segundo plano, não importa o quê?

12

No Ice Cream Sandwich (ICS), o sistema operacional categoriza seu aplicativo e cada categoria tem seu próprio limite no qual o sistema operacional usa para determinar qual aplicativo fechar primeiro quando a memória ficar insuficiente.

Alguém já ficou aborrecido, digamos que abriu um cronômetro para executar em segundo plano para medir o tempo decorrido de alguma coisa, depois abriu mais alguns aplicativos e voltou ao cronômetro apenas para ver se ele foi redefinido ou fechado? Quero dizer, sério, é realmente irritantemente irritante.

Existe uma maneira de forçar um aplicativo a permanecer em execução em segundo plano, não importa o que seja, mesmo quando o sistema operacional ficar sem memória?

supertonsky
fonte
7
Isso é um sinal de um código incorreto pelo aplicativo. Um usuário nunca deve se preocupar com isso e o Android fornece meios para que um aplicativo possa salvar seu estado e restaurá-lo mais tarde (desde as primeiras versões do Android). Você deve enviar um relatório de bug ao desenvolvedor do aplicativo.
Flow

Respostas:

8

A resposta aceita ficou incorreta ou desatualizada. O módulo "Configurações do aplicativo" para o aplicativo Xposed permite que você especifique por aplicativo para impedir que os aplicativos sejam mortos ou liberados:

http://repo.xposed.info/module/de.robv.android.xposed.installer

http://repo.xposed.info/module/de.robv.android.xposed.mods.appsettings

É claro que deve-se ter cuidado responsável ao jogar com aplicativos que alteram esse comportamento de baixo nível.

Torque
fonte
Deve-se notar que isso requer raiz e é a instalação de uma modificação pesada do sistema operacional Android.
Sweisgerber.dev 31/01
5

Resposta simples: não. O Android sempre usa o OOM (falta de memória) para liberar memória não utilizada. Você pode alterar as prioridades dos aplicativos (pelo menos até a reinicialização) com alguns gerenciadores de tarefas, mas mesmo assim, se a memória estiver fraca, os aplicativos em segundo plano começarão a ser mortos.

Pense neste cenário: você baixou um aplicativo mal codificado que é executado na inicialização, causa um estouro de buffer e sobrecarrega toda a sua memória. Normalmente, esse aplicativo é eliminado, mas se estiver definido para permanecer aberto, ele efetivamente bloqueia o telefone até a reinicialização e, depois disso, é iniciado novamente e novamente, etc.

Alguns cronômetros usam serviços com altas prioridades para evitar esse problema, mas se você iniciar aplicativos de alto desempenho e sobrecarregados, enquanto o cronômetro estiver em segundo plano, ele será morto.

onik
fonte
1
Não precisa ser assim, IMO. Deixe o sistema seguir seus métodos antigos por padrão e, caso o usuário pretenda que um aplicativo em particular seja executado em segundo plano apenas naquele momento específico em que houver necessidade, forneça essa opção. Ele não precisa ter outra categoria de permissão, pois é critério dos usuários "fixar" um aplicativo. Eu não quero que um aplicativo fique permanentemente imparável depois de executado. Eu só quero uma opção para fazer isso quando houver uma necessidade, exatamente como o que descrevi na minha pergunta.
22712
1
@onik um estouro de buffer não tem nada a ver com sobrecarregar a memória. Você sabe o que é um estouro de buffer?
3
@onik, então a resposta é não, você não sabe o que é um estouro de buffer. Entendi.
1
O @onik também um loop infinito em uma lista vinculada certamente pode levar você a um OOM muito antes de você repetir os Integer.MAX_VALUEtempos. Por que você acha que as coisas são limitadas de Integer.MAX_VALUEqualquer maneira?
1
@onik correto: por definição, um estouro de buffer não pode expandir o tamanho da memória alocada. Se ele expandir o tamanho da memória alocada, não será um estouro de buffer. Você está pensando em um loop infinito, eu acho.
precisa
1

Não. No entanto, dois métodos para aliviar o problema vêm à mente, mas ambos só podem ser implementados pelo desenvolvedor: O primeiro é exibir uma notificação, o Android dará aos aplicativos que fazem isso uma prioridade mais alta do que outros. O segundo é salvar a hora de início para que, quando o timer for reiniciado, ele não seja redefinido.

Erik
fonte
1
A execução de aplicativos sem motivo com prioridade em primeiro plano (é por isso que a notificação é necessária) é considerada uma prática recomendada. Como já foi dito: o Android fornece uma API agradável que permite até temporizadores / contadores que não são afetados pelo assassino do OOM. Há uma boa postagem de Dianne Hackborn sobre este tópico
Fluxo
Não duvido que exista essa API, mas onde essa questão já foi mencionada antes?
Erik
1
Além disso, obviamente existe um motivo para manter o aplicativo em execução, se possível, nesse caso, diferente do exemplo do jogo que você postou.
Erik
4
Não, não há razão para manter um aplicativo em execução apenas por causa de um timer. Basta usar onSaveInstanceStatee onRestoreInstanceStatepara proteger o estado do aplicativo, incluindo as informações do temporizador. Não há necessidade de executar em primeiro plano. Mesmo que seja um alarme, você pode usar AlarmManagerpara garantir que seja executado mais tarde. O único motivo pelo qual o Primeiro Plano deve ser usado é: 1. Você tem alguma atividade real em primeiro plano, como tocar música ou exibir um vídeo. 2. Você deseja manter uma conexão de dados aberta (por exemplo, IMAP IDLE (push)).
Flow
0

1º método: - Se você criar o Sticky Thread no programa, sim, poderá mantê-lo à força na corrida. No entanto, lembre-se de que o usuário no modo de configuração avançada pode parar os aplicativos em execução em segundo plano. No entanto, se você escrever um thread fixo de uma maneira que ele inicie em qualquer evento fornecido, isso poderá ser alcançado.

2º método: se o usuário não estiver com root no Android e você quiser executar um aplicativo no segundo plano. use o script SL4 em segundo plano no aplicativo. use um script que faça verificações e programas em segundo plano e escreva o front end para mostrar outra coisa.

Por exemplo: na maioria dos mecanismos de jogos, isso é construído. Eles se conectam aos servidores, mesmo que o usuário tenha desligado o aplicativo. O motivo pelo qual o mecanismo cria vários scripts no telefone, que são verificados aleatoriamente em qualquer evento específico e que o TRIGGER é usado para executar seu aplicativo continuamente no segundo plano do primeiro plano.

*** Desculpe pelo corretor ortográfico do TYPO .. não disponível. Espero que você consiga o que pretendia obter.

Becky Mannie
fonte
Bem-vindo ao Android Enthusiast, um site de perguntas e respostas para usuários finais do Android. Até onde eu entendi, os 2 métodos que você forneceu só podem ser executados no lado do desenvolvedor, ou seja, aqueles que possuem o código-fonte do aplicativo. Infelizmente, isso pode não ser útil para a maioria dos leitores aqui, porque eles não estão desenvolvendo um aplicativo. Se isso for aplicável a não desenvolvedores, considere editar a resposta para deixar claro como fazer isso sem tocar no código-fonte do aplicativo . Obrigado.
Andrew T.
-1

Às vezes, existe uma opção para bloquear o aplicativo. Isso evita que matar ou parar desse aplicativo no telefone.

A opção de bloqueio não está disponível no próprio sistema operacional, o uso de alguns aplicativos de terceiros, como o GO Task Manager , etc., pode ajudar.

Jayesh Tiwari
fonte
2
A eliminação de OOM é feita pelo kernel e nenhum aplicativo pode impedi-lo ou "bloquear" um processo. O aplicativo ao qual você está vinculado é um assassino de tarefas que mata os aplicativos em si. O recurso de bloqueio ao qual você está se referindo só impedirá a morte pelo assassino de tarefas.
Erik