Moja gra zapisuje swój stan po ustalonym czasie na pliku w pamięci wewnętrznej gry / aplikacji. Gdy moja gra zostanie zabita lub rozbita odpowiednio przez użytkownika lub system operacyjny, zapisujemy bieżący stan gry na tym pliku. Zapisywanie plików po okresie między naprawami działa poprawnie, ale gdy gra ulegnie awarii / zabije system operacyjny lub użytkownik, operacja zapisu pliku kończy się niepowodzeniem. Błąd operacji powoduje niepełny stan gry lub pusty stan gry, tzn. Brak zapisanych danych w pliku. Wypróbowałem wiele rozwiązań za pomocą usługi Android, w przypadku gdy usługa NON STICKY została zabita przez aplikację. Z drugiej strony, jeśli usługa jest NAPRAWNA, jest ona restartowana, ale zamiar, który został dołączony na początku z usługą, jest zerowy lub nowy.
Pytanie brzmi: w jaki sposób mogę całkowicie zapisać moje dane (może to być ~ 2-3 MB) w pliku w pamięci wewnętrznej, gdy moja gra / aplikacja zostanie zabita przez użytkownika / system operacyjny?
Odpowiedzi:
Sugerowałbym zapisanie stanu zapisu w sposób podwójnie buforowany, tak jak to było w przypadku tytułów konsolowych w przeszłości (gdzie trzeba było poradzić sobie z wyjmowaniem karty pamięci w trakcie zapisu, a zapisy przebiegały powoli).
Zapisać:
Załaduj:
Ten przepływ będzie działał, aby zapewnić, że w pamięci zawsze jest co najmniej jeden prawidłowy zapis, nawet jeśli aplikacja zostanie zabita w trakcie zapisu. Gracz nie otrzyma żadnych zmian w stanie gry od poprzedniego zapisu, jeśli wystąpi tego rodzaju awaria, ale nie będzie musiał zaczynać od nowa.
Ponadto oprócz zapisywania interwałów należy zapisywać bezpośrednio po kluczowych zdarzeniach (takich jak zakupy w aplikacji), aby zminimalizować okno podatności, w przypadku której awaria / zabicie spowodowałoby utratę tego kluczowego zdarzenia. Jest to również ochrona przed exploitami gier (np. Wymuszanie zabijania aplikacji po utracie życia, ponieważ wiesz, że przywrócisz stan gry sprzed utraty życia i będziesz mógł spróbować ponownie). Oczywiście, jeśli to zrobisz, musisz zabezpieczyć swój interwał oszczędzania za pomocą logiki, która mówi „jeśli zapis jest już w toku, nie próbuj zaczynać zapisywania ponownie”.
źródło
java.nio.file.Files.move(Path source, Path target, CopyOption... options)
Możesz zmienić nazwę i nadpisać jako operację atomową.sync()
plik B przed przeniesieniem go do pliku A (nawet wtedy nie ma pełnych gwarancji, alesync()
jest całkiem dobry).Android zabija aplikacje tylko wtedy, gdy są w tle. Czy dane gry naprawdę wymagają aktualizacji, gdy aplikacja działa w tle, czy możesz przestać aktualizować dane, dopóki aplikacja nie wróci na pierwszy plan? Możesz odroczyć aktualizacje nawet w grze wieloosobowej, jeśli możesz pobrać historię wydarzeń lub nawet aktualny stan, gdy aplikacja powróci na pierwszy plan. Jest to coś, co powinieneś prawdopodobnie zrobić, biorąc pod uwagę wydajność procesora, sieci i baterii.
Jeśli użytkownik zabije twoją aplikację, uruchomione usługi powinny otrzymać połączenie z
onTaskRemoved
. Nie wiem, co by się stało, gdybyś próbował wykonać dużo przetwarzania w tej metodzie. Spodziewam się, że jeśli nie wróci w określonym czasie, Android uruchomikill -9
Twoją aplikację.źródło