2011-06-24 15 views
5

Gdy moja aplikacja zostanie przeniesiona w tle, chciałbym móc wykryć, kiedy ma się zakończyć (wyczerpanie pamięci lub inne przyczyny). Czy jest jakiś sposób na zrobienie tego?Jak określić, kiedy moja aplikacja ma zostać zakończona w tle?

Czy istnieje sposób na wykonanie kodu przed zakończeniem aplikacji w tle?

+1

Dlaczego głosowałeś na zamknięcie? Wydaje mi się to dobrym pytaniem. –

+7

@WTP powinienem był to zobaczyć przed bohaterską edycją Brada :) –

+2

@ Michael Stum: faktycznie, ten komentarz jest starszy niż edycja. Niektóre błędy gramatyczne naprawdę nie mają dla mnie znaczenia. Jeśli jest jasne, o co chodzi, to jest niesamowite. –

Odpowiedz

4

Można to zrobić w metodzie -[<UIApplicationDelegate> applicationWillTerminate:] swojego delegata aplikacji, takich jak to:

- (void)applicationWillTerminate:(UIApplication *)application { 
    [database save]; // or whatever you want to do 
} 

ta zostanie wykonana, gdy aplikacja ma zostać zakończone, o ile nie wywala.

+1

Nie dotyczy to aplikacji zawieszonych w tle. Z [Podręcznika programowania aplikacji iOS] (http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/CoreApplication/CoreApplication.html#//apple_ref/doc/uid/TP40007072-CH3- SW10): "Jeśli twoja aplikacja jest obecnie zawieszona, system zabija twoją aplikację i usuwa ją z pamięci bez żadnego powiadomienia." Otrzymasz to wywołanie zwrotne, jeśli aplikacja aktywnie działa w tle. –

+0

@Brad Larson Następnie powinieneś wykonać kod, aby zapisać dane w '- [ applicationDidEnterBackground:]' lub nie zobaczę innego sposobu. To i tak dobry pomysł. –

1

To zależy.

Jeśli chodzi o otrzymywanie powiadomień, gdy aplikacja jest zawieszona w tle, nie ma sposobu, aby dowiedzieć się; metoda applicationWillTerminate: nie zostanie uruchomiona, jeśli jesteś zawieszony. Zalecanym podejściem jest zapisanie dowolnego wymaganego stanu, gdy otrzymasz wiadomość o numerze applicationWillEnterBackground:, więc jeśli zostaniesz zabity w tle, możesz zacząć od nowa.

Jeśli rzeczywiście w „wykonującego w tle” państwa (co może się zdarzyć krótko po wyjściu z aplikacji lub jeśli aplikacja zażądała czas czasowego wykonywania tle,), a następnie applicationWillTerminate:będzie nazwać tak samo jak ty spodziewał się.

+0

Według Apple nie jest to poprawne. Jeśli twoja aplikacja wprowadziła przetwarzanie w tle, otrzyma aplikacjęWinTerminate, jeśli użytkownik lub system operacyjny musi ją zakończyć (zobacz odpowiedź Brada Larsonsa, która cytuje dokumenty Apple). – RyanR

+0

Myślę, że to prawda; istnieje rozróżnienie między słowami "w tle" i "zawieszonymi", których nie uwzględniłem. Naprawię to. –

4

Najlepiej zrobić wszystko, co należy zrobić w aplikacji (zapisywanie danych stanu lub danych użytkownika itp.), Gdy aplikacja przechodzi w tło. Jeśli twoja aplikacja zostanie zawieszona, nie będziesz miał szansy na wykonanie ostatniego kodu, zanim zostanie on zakończony przez system.

Z iOS Application Programming Guide:

Jeśli aplikacja jest uruchomiona (albo na pierwszym planie lub w tle) w czasu zakończenia, system zwraca swojej aplikacji delegata za applicationWillTerminate: metoda tak które można wykonać dowolne wymagane oczyszczanie . Tej metody można użyć do zapisania danych użytkownika lub stanu aplikacji , których można użyć do przywrócenia aplikacji do stanu bieżącego podczas kolejnego uruchomienia. Wdrożenie metody ma około 5 sekund na wykonanie każdego zadania , aby wykonać wszystkie zadania i zwrócić je w postaci . Jeśli nie nastąpi zwrot w czasie, aplikacja zostanie zabita i usunięta z pamięci przez . Metoda WillTerminate: to nie jest wywoływana, jeśli twoja aplikacja jest obecnie zawieszona w Twojej aplikacji pod numerem .

Nawet jeśli rozwijać swoją aplikację użyciu iOS SDK 4 i później, trzeba nadal być przygotowane do aplikacji być zabity bez powiadomienia. Użytkownik może jawnie zabijać aplikacje przy użyciu interfejsu wielozadaniowego. Ponadto, jeśli pamięć zostanie zablokowana, , system może usunąć z pamięci aplikacje , aby uzyskać więcej miejsca w pokoju .Jeśli Twoja aplikacja jest obecnie zawieszona w wersji , system zabije Twoją aplikację i usunie ją z pamięci bez powiadomienia. Jeśli jednak aplikacja jest obecnie uruchomiona w trybie , stan tła (innymi słowy, nie został zawieszony), system wywoła aplikację WillTerminate: metoda delegata aplikacji. Twoja aplikacja nie może żądać dodatkowego czasu wykonania tła od tej metody .

Powiązane problemy