applicationWillEnterForeground vs. applicationDidBecomeActive, applicationWillResignActive ve applicationDidEnterBackground karşılaştırması


215

Bir uygulama arka planda olmaktan çıktığında ve etkin olarak hazırlanmasını istediğinizde uygulanacak uygun temsilci hangisidir?

applicationWillEnterForeground vs applicationDidBecomeActive - Fark nedir?

Bir uygulama uykuya daldığında uygulanacak uygun temsilci hangisidir ve onu temizlemek ve verileri kaydetmek için hazırlamak istiyorsunuz?

applicationWillResignActive ve applicationDidEnterBackground - Fark nedir?

Ayrıca, gelen SMS veya çağrı geldiğinde applicationWillResignActive'ın çağrıldığını fark ettim, ancak kullanıcı Tamam'ı tıklatıp devam etmeyi seçti. Uygulamamın bu gibi durumlarda herhangi bir işlem yapmasını istemiyorum. Kullanıcı uygulamadan çıkmadığı için herhangi bir ara temizleme olmadan çalışmaya devam etmesini istiyorum. Yani, sadece applicationDidEnterBackground temizleme çalışması yapmak daha mantıklı düşünürdüm.

Uyanma ve uyuma için hangi delegelerin uygulanacağının yanı sıra SMS / çağrılarla kesintiye uğramak gibi olayları göz önünde bulundurarak hangi delegelerin uygulanacağını seçmeniz için en iyi uygulamalar konusundaki katkılarınızı takdir ediyorum.

Teşekkürler

Yanıtlar:


449

Uyanırken yani bir uygulamayı yeniden başlatmaya (sıçrama tahtası, uygulama değiştirme veya URL yoluyla) applicationWillEnterForeground:denir. Uygulama arka plana konulduktan sonra uygulama kullanıma hazır hale geldiğinde yalnızca bir kez yürütülürken, applicationDidBecomeActive:lansmandan sonra birkaç kez çağrılabilir. Bu, applicationWillEnterForeground:yeniden başlatmanın hemen ardından bir kez yapılması gereken kurulumlar için idealdir.

applicationWillEnterForeground: denir:

  • uygulama yeniden başlatıldığında
  • önce applicationDidBecomeActive:

applicationDidBecomeActive: denir:

  • uygulama ilk başlatıldıktan sonra application:didFinishLaunchingWithOptions:
  • sonra applicationWillEnterForeground:işlemek için herhangi bir URL varsa.
  • sonra application:handleOpenURL:denir.
  • sonra applicationWillResignActive:kullanıcı yoksaydıklarınız bir telefon görüşmesi ya da SMS gibi kesintiyi eğer.

applicationWillResignActive: denir:

  • telefon görüşmesi gibi bir kesinti olduğunda.
    • kullanıcı çağrı alırsa applicationDidEnterBackground:çağrılır.
    • kullanıcı yok sayarsa çağrı applicationDidBecomeActive:çağrılır.
  • ana ekran düğmesine basıldığında veya kullanıcı uygulamaları değiştirdiğinde.
  • dokümanlar yapman gerektiğini söylüyor
    • devam eden görevleri duraklat
    • zamanlayıcıları devre dışı bırak
    • bir oyunu duraklat
    • OpenGL kare hızlarını azaltma

applicationDidEnterBackground: denir:

  • sonra applicationWillResignActive:
  • dokümanlar şunları yapmanız gerektiğini söylüyor:
    • paylaşılan kaynakları yayınla
    • kullanıcı verilerini kaydet
    • zamanlayıcıları geçersiz kıl
    • uygulama sonlandırılırsa geri yükleyebilmeniz için uygulama durumunu kaydedin.
    • UI güncellemelerini devre dışı bırak
  • İhtiyacınız olan şeyi yapmak ve yöntemi iade etmek için 5 saniyeniz var
    • ~ 5 saniye içinde geri dönmezseniz uygulama sonlandırılır.
    • ile daha fazla zaman isteyebilirsiniz beginBackgroundTaskWithExpirationHandler:

Resmi belgeler.


10
Eklenecek bir şey daha var. Uygulamanızdan arka plan uygulamaları listesini açarsanız (ana sayfa düğmesini çift tıklayın) ve daha sonra geri dönerseniz (uygulamanızın önizlemesini seçin) - -applicationWillEnterForeground:yalnızca çağrılmaz -applicationDidEnterBackground:(varsayalım, iOS bunun bir yeniden başlatma olduğunu düşünmüyor).
kpower

@kpower evet, bu sadece boynumu kırdı ... asla bu durumda
willEnterForeground'ın çağrılmayacağını düşünmezdim

applicationWillEnterForeground:Arka plandan ön plana her seferinde çağrılacak değil mi ?! Daha applicationDidBecomeActivesonra OLMAYAN bir dava bulamıyorum .
Desmond DAI

Bu doğru değil. applicationWillResignActive, application olmadan çağrılabilirDidEnterBackground
MichaelGofron

27

Uygulamanızın Yaşam Döngüsünü Yönetmek sorularınıza yardımcı olur. Hızlı konsept için, bu belgedeki Şekiller'i görebilirsiniz. Yorumu XCode Sihirbazı tarafından oluşturulan koddan da okuyabilirsiniz. Aşağıdaki gibi sıralanmıştır:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    /*
     Sent when the application is about to move from active to inactive state. 
     This can occur for certain types of temporary interruptions (such as an 
     incoming phone call or SMS message) or when the user quits the application 
     and it begins the transition to the background state.
     Use this method to pause ongoing tasks, disable timers, and throttle down 
     OpenGL ES frame rates. Games should use this method to pause the game.
     */
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    /*
     Use this method to release shared resources, save user data, invalidate 
     timers, and store enough application state information to restore your 
     application to its current state in case it is terminated later. 
     If your application supports background execution, this method is called 
     instead of applicationWillTerminate: when the user quits.
     */
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    /*
     Called as part of the transition from the background to the active state; 
     here you can undo many of the changes made on entering the background.
     */
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    /*
     Restart any tasks that were paused (or not yet started) while the 
     application was inactive. If the application was previously in the 
     background, optionally refresh the user interface.
     */
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    /*
     Called when the application is about to terminate.
     Save data if appropriate.
     See also applicationDidEnterBackground:.
     */
}

Daha ayrıntılı açıklamalar için lütfen UIApplicationDelegate resmi belgesine bakın.


Bağlantı öldü.
Phlippie Bosman

Şimdilik 2019 için bazı açıklamaları ve bağlantıları gözden geçirin.
tomjpsun

13

Dano'nun cevabı ile hala biraz kafam karıştı, bu yüzden referansım için belirli senaryolardaki olayların akışını almak için küçük bir test yaptım, ancak bu sizin için de yararlı olabilir. Bu, UIApplicationExitsOnSuspendinfo.plist'DE KULLANMAYAN uygulamalar içindir . Bu, iOS 7 cihazı ile onaylanmış bir iOS 8 simülatörü + üzerinde gerçekleştirildi. Lütfen Xamarin'in olay işleyici adlarını affedin. Çok benzerler.

  • Çalışmayan bir durumdan ilk ve sonraki tüm başlatmalar:

FinishedLaunching

OnActivated

  • Kesinti (telefon görüşmesi, yukarı aşağı kaydırma, alt aşağı kaydırma):
  • Ana sayfa düğmesi, etkin olmayan uygulamaları listeleyen, ardından uygulamamızı yeniden seçen çift basma:

OnResignActivation


OnActivated

  • Ana sayfa düğmesi etkin olmayan uygulamaları listelemek, başka bir uygulama seçmek, ardından uygulamamızı yeniden başlatmak için iki kez basın:
  • Ana sayfa düğmesi tek basış, sonra yeniden başlat:
  • Kilitleyin (açma / kapama düğmesi), ardından kilidini açın:

OnResignActivation

DidEnterBackground


WillEnterForeground

OnActivated

  • Ana sayfa düğmesi çift basın ve uygulamamızı sonlandırın: (sonraki yeniden başlatma ilk durumda)

OnResignActivation

DidEnterBackground

DidEnterBackground (yalnızca iOS 7 mi?)

Evet, DidEnterBackgroundiOS7 cihazında iki kez çağrılır. Her iki kez de UIA uygulama durumu Arka Plan'dır. Ancak, iOS 8 simülatörü bunu yapmaz. Bunun için iOS 8 cihazında test yapılması gerekiyor. Elimi tuttuğumda cevabımı güncelleyeceğim, yoksa başka biri onaylayabilir.


9

applicationWillEnterForeground denir:

uygulama yeniden başlatıldığında (arka plandan ön plana gelir) Bu yöntem, uygulama ilk kez başlatıldığında (yani applicationDidFinishLaunchçağrıldığında) değil, yalnızca arka plandan geldiğinde çağrılır applicationDidBecomeActive

applicationDidBecomeActive denir

Uygulamanın ilk sonra başlatıldığında didFinishLaunching sonra applicationWillEnterForegroundişlemek için herhangi bir URL varsa. sonra application:handleOpenURL:denir. sonra applicationWillResignActivekullanıcı yoksaydıklarınız bir telefon görüşmesi ya da SMS gibi kesintiyi eğer. uyarı görünümü kaybolduktan sonra


Bunun iOS 7'den itibaren değiştirilip değiştirilmediğini biliyor musunuz? ApplicationWillEnterForeground'da bir şeyler (iOS 5/6) yaptığımı ve uygulamanın ilk başlatıldığında çalıştığını hatırlıyorum (yanılmış olabilirim). Şu andan itibaren, 7.1 / 8'de, doğru uygulamaWillEnterForeground lansmanda çağrılmıyor.
Jinyoung Kim


5

İOS 8+'de telefon görüşmesi yapmak için ince ama önemli bir fark var.

İOS 7'de kullanıcı telefon araması yaparsa hem applicationWillResignActive: hem de applicationDidEnterBackground: öğesi çağrılır. Ancak iOS 8 ve sonraki sürümlerinde yalnızca applicationWillResignActive: çağrılır.


1

İOS 13+ için aşağıdaki yöntemler yürütülür:

- (void)sceneWillEnterForeground:(UIScene *)scene
- (void)sceneDidBecomeActive:(UIScene *)scene
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.