2011-06-24 13 views
5

Uygulamam arka plana taşınırken, sonlandırılmak üzere olduğunu algılayabilmeyi isterim (bellek tükenmesi veya başka nedenlerden dolayı). Bunu yapmanın bir yolu var mı? ÖzellikleUygulamamın ne zaman arka planda sonlandırılacağını nasıl belirleyebilirim?

, uygulama arka planda sonlandırılır önce bazı kod yürütmesine bir yolu var mı?

+1

Neden kapatıldı? Bu bana iyi bir soru gibi görünüyor. –

+7

@WTP, Brad tarafından yapılan kahramanca düzenlemeden önce görmüş olmalı :) –

+2

@Michael Stum: aslında, bu yorum düzenlemeden daha eski. Bazı dilbilgisel hatalar benim için gerçekten önemli değil. Sorulduğu açıksa, harika. –

cevap

4

Böyle Başvurunuz delegesinin -[<UIApplicationDelegate> applicationWillTerminate:] yöntemi yapabilirsiniz:

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

uygulamamız çöküyor sürece sonlandırılır üzeredir zaman bu çalıştırılacaktır.

+1

Bu, arka planda askıya alınan uygulamalar için geçerli değildir. [IOS Uygulama Programlama Kılavuzu] 'ndan (http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/CoreApplication/CoreApplication.html#//apple_ref/doc/uid/TP40007072-CH3- SW10): "Uygulamanız şu anda askıya alındıysa, sistem uygulamanızı öldürür ve herhangi bir bildirimde bulunmadan bellekten kaldırır." Uygulamanız aktif olarak arka planda kod çalıştırıyorsa bu geri bildirimi alacaksınız. –

+0

@Brad Larson O zaman veriyi kaydetmek için kod yürütmelisiniz '- [ applicationDidEnterBackground:]' veya başka bir yol görmeyeceğim. Bu zaten iyi bir fikir. –

1

Bu, bağlıdır.

Başvurunuz arka planda asılı iken bildirim alma demek ise bilmenin bir yolu yoktur; Askıya alındıysa applicationWillTerminate: yöntemi çalıştırılmaz. Tavsiye edilen yaklaşım, applicationWillEnterBackground: mesajını aldığınızda gerekli olan herhangi bir durumu kaydetmek, böylece arka planda öldürüldüğünüzde yeniden başlatmaya hazır olursunuz. Eğer (app çıktıktan sonra kısaca gerçekleşebilir veya uygulama geçici arkaplan yürütme zamanı, talep ettiği takdirde) daha sonra applicationWillTerminate:sizin gibi çağrılacak olacak bir "arka planda yürütme" devlet, aslında iseniz

Bekliyordum.

+0

Apple'a göre, bu doğru değil. Uygulamanız arka plan işlemeye girmişse, kullanıcı ya da işletim sisteminin işletim sistemini sonlandırması gerekirse applicationWillTerminate'yi alır (bkz. Apple docs'dan alıntılanan Brad Larsons yanıtı). – RyanR

+0

Sanırım bu doğru; adreslemediğim "arka plan" ve "askıya alınmış" arasında bir ayrım var. Bunu tamir edeceğim. –

4

En iyi bahsiniz, uygulamanızda arka plana geçiş yaptığınız için, uygulamanızda hangi temizleme gereksinimlerinin (kaydetme durumu veya kullanıcı verileri, vb.) Yapılması gerektiğinden emin olmaktır. Başvurunuz askıya alınırsa, sistem tarafından sonlandırılmadan önce herhangi bir son kodu gerçekleştirme şansınız olmaz. iOS Application Programming Guide itibaren

: yöntem böylece sen gerçekleştirebileceği:

Başvurunuz sonlandırma anda (ön veya arka planda ya ) çalışıyorsa, sistem sizin uygulamanızın yetki applicationWillTerminate çağırır Herhangi bir gerekli temizleme. Bu yöntemi kullanıcı verilerini veya uygulama durumunu kullanacağınız bilgileri kullanarak daha sonraki bir başlatmayla uygulamanızı geçerli durumuna geri yükleyebilirsiniz. Yöntem uygulamanız, görevlerini gerçekleştirmek ve geri dönmek için yaklaşık 5 saniye sahiptir. zamanında geri dönmezse, uygulama öldürülür ve bellekten kaldırılır. Uygulamanız, applicationWillTerminate: , uygulamanız şu anda askıya alınmış olan ise çağrılmaz. iOS SDK 4 kullanarak başvurunuzu geliştirmek ve daha sonra, hala uygulamaya için hazır olmalıdır bile

herhangi bir bildirim yapılmaksızın öldürülmek. Kullanıcı, çoklu görev UI'sini kullanarak uygulamaları açıkça öldürebilir. Ayrıca, bellek kısıtlandığında, sistem daha fazla odası yapmak için uygulamalarını bellekten silebilir.Uygulamanız şu anda askıya alınmışsa, sistem uygulamanızı öldürür ve numaralı telefondan herhangi bir bildirimde bulunmadan kaldırır. Ancak, uygulamanız şu anda uygulamasında arka plan durumdaysa (diğer bir deyişle, askıya alınmazsa), sistem applicationWillTerminate: yöntemini uygulama temsilcisine çağırır. uygulamanız, bu yönteminden ek arka plan yürütme süresi talep edemez.

İlgili konular