Meu jogo salva seu estado após um intervalo fixo em um arquivo no armazenamento interno do jogo / aplicativo. Quando meu jogo é interrompido ou travado por usuário ou sistema operacional, respectivamente, escrevemos o estado atual do jogo nesse arquivo. A gravação do arquivo após o intervalo de correção está funcionando bem, mas quando o jogo é travado / interrompido pelo sistema operacional ou pelo usuário, a operação de gravação do arquivo falha. A falha na operação resulta em estado incompleto do jogo ou vazio, ou seja, nenhum dado gravado no arquivo. Eu tentei várias soluções usando o serviço Android, no caso de o serviço NÃO PEGAR O serviço é eliminado com o aplicativo. Por outro lado, se o serviço for STICKY, ele será reiniciado, mas a intenção que foi anexada inicialmente ao serviço é nula ou nova.
A questão é: como posso salvar meus dados (aproximadamente de 2 a 3 MB) em um arquivo no armazenamento interno quando meu jogo / aplicativo é morto pelo usuário / sistema operacional?
Respostas:
Sugiro que você escreva seu estado de salvamento de maneira com buffer duplo, como era comum em títulos de console no passado (onde você tinha que lidar com o cartão de memória sendo removido no meio da gravação e as gravações eram lentas).
Salve :
Carga:
Esse fluxo funcionará para garantir que sempre haja pelo menos uma gravação válida ainda presente em seu armazenamento, mesmo que o aplicativo seja eliminado no meio da gravação. O jogador não receberá nenhuma das alterações no estado do jogo desde o salvamento anterior, se esse tipo de falha ocorrer, mas não precisará iniciar novamente.
Além disso, você deve salvar imediatamente após os principais eventos (como compras no aplicativo), além do intervalo de salvamento, para minimizar a janela de vulnerabilidade em que uma falha / interrupção causaria a perda do evento principal. Isso também é proteção contra explorações de jogos (por exemplo, matar o aplicativo com força depois de perder uma vida, porque você sabe que voltará ao estado de jogo antes de perder uma vida e tentará novamente). Obviamente, se fizer isso, você deve proteger o intervalo de salvamento com uma lógica que diz "se um salvamento já estiver em andamento, não tente começar a salvar novamente".
fonte
java.nio.file.Files.move(Path source, Path target, CopyOption... options)
pode renomear e substituir como uma operação atômica.sync()
arquivo B antes de movê-lo sobre o arquivo A (mesmo assim, não há garantias completas, massync()
é bastante bom).O Android mata aplicativos apenas quando estão em segundo plano. Os dados do seu jogo realmente precisam ser atualizados quando o aplicativo está em segundo plano ou você pode parar de atualizar os dados até que o aplicativo retorne ao primeiro plano? Você pode adiar as atualizações mesmo em um jogo multiplayer, se conseguir pegar um histórico de eventos ou até apenas o estado atual quando o aplicativo retornar ao primeiro plano. Isso é algo que você provavelmente deveria pensar em fazer de qualquer maneira em prol da eficiência da CPU, da rede e da bateria.
Se o usuário matar seu aplicativo, os serviços em execução deverão receber uma chamada para
onTaskRemoved
. Não sei o que aconteceria se você tentasse fazer muito processamento nesse método. Espero que, se ele não retornar dentro de um determinado período, o Android fará okill -9
seu aplicativo.fonte