applicationWillEnterForeground vs. applicationDidBecomeActive, applicationWillResignActive vs applicationDidEnterBackground

215

Yang merupakan delegasi yang tepat untuk diterapkan ketika aplikasi bangun dari latar belakang dan Anda ingin persiapannya menjadi aktif?

applicationWillEnterForeground vs applicationDidBecomeActive - Apa bedanya?

Yang merupakan delegasi yang tepat untuk diterapkan ketika aplikasi akan tidur dan Anda ingin mempersiapkannya untuk membersihkan dan menyimpan data?

applicationWillResignActive vs applicationDidEnterBackground - Apa bedanya?

Juga, saya perhatikan bahwa applicationWillResignActive dipanggil ketika SMS atau panggilan masuk tetapi pengguna memilih untuk mengklik Ok dan melanjutkan. Saya tidak ingin aplikasi saya mengambil tindakan dalam kasus ini. Saya hanya ingin tetap berjalan tanpa pembersihan lanjutan karena pengguna tidak keluar dari aplikasi. Jadi, saya akan berpikir lebih masuk akal untuk melakukan pekerjaan pembersihan hanya di applicationDidEnterBackground.

Saya akan menghargai masukan Anda tentang praktik terbaik yang harus diikuti dalam memilih delegasi mana yang akan diimplementasikan untuk bangun dan tidur serta mempertimbangkan acara-acara seperti terganggu oleh SMS / panggilan.

Terima kasih

Paul
sumber

Jawaban:

449

Ketika bangun yaitu meluncurkan kembali aplikasi (baik melalui springboard, pengalihan aplikasi atau URL) applicationWillEnterForeground:disebut. Ini hanya dieksekusi sekali ketika aplikasi menjadi siap untuk digunakan, setelah diletakkan di latar belakang, sementara applicationDidBecomeActive:dapat dipanggil beberapa kali setelah peluncuran. Ini applicationWillEnterForeground:ideal untuk pengaturan yang perlu dilakukan hanya sekali setelah peluncuran ulang.

applicationWillEnterForeground: disebut:

  • ketika aplikasi diluncurkan kembali
  • sebelum applicationDidBecomeActive:

applicationDidBecomeActive: disebut:

  • ketika aplikasi pertama kali diluncurkan setelah application:didFinishLaunchingWithOptions:
  • setelah applicationWillEnterForeground:jika tidak ada URL untuk ditangani.
  • setelah application:handleOpenURL:dipanggil.
  • setelah applicationWillResignActive:jika pengguna mengabaikan gangguan seperti panggilan telepon atau SMS.

applicationWillResignActive: disebut:

  • ketika ada gangguan seperti panggilan telepon.
    • jika pengguna menerima panggilan applicationDidEnterBackground:dipanggil.
    • jika pengguna mengabaikan panggilan applicationDidBecomeActive:dipanggil.
  • ketika tombol beranda ditekan atau pengguna berpindah aplikasi.
  • docs bilang kamu harus
    • jeda tugas yang sedang berlangsung
    • nonaktifkan timer
    • jeda permainan
    • mengurangi frame rate OpenGL

applicationDidEnterBackground: disebut:

  • setelah applicationWillResignActive:
  • dokumen mengatakan Anda harus:
    • lepaskan sumber daya bersama
    • simpan data pengguna
    • timer tidak valid
    • simpan status aplikasi sehingga Anda dapat mengembalikannya jika aplikasi dihentikan.
    • nonaktifkan pembaruan UI
  • Anda memiliki 5 detik untuk melakukan apa yang Anda butuhkan dan mengembalikan metode
    • jika Anda tidak kembali dalam ~ 5 detik aplikasi dihentikan.
    • Anda dapat meminta lebih banyak waktu dengan beginBackgroundTaskWithExpirationHandler:

Dokumentasi resmi.

Dan Sandland
sumber
10
Satu hal lagi untuk ditambahkan. Jika Anda membuka daftar aplikasi latar belakang dari aplikasi Anda (klik dua kali tombol rumah) dan kemudian kembali ke sana (pilih pratinjau aplikasi Anda) - -applicationWillEnterForeground:tidak akan dipanggil, hanya -applicationDidEnterBackground:(misalkan, iOS tidak berpikir itu adalah peluncuran kembali).
kpower
@kpower ya, itu baru saja mematahkan leher saya ... tidak akan pernah berpikir bahwa willEnterForeground tidak akan dipanggil dalam kasus itu ...
TheEye
Bukankah itu yang applicationWillEnterForeground:akan dipanggil setiap saat dari latar belakang ke latar depan ?! Saya tidak dapat menemukan case yang BUKAN disebut TANPA applicationDidBecomeActivesetelahnya.
Desmond DAI
Ini tidak akurat. applicationWillResignActive dapat dipanggil tanpa applicationDidEnterBackground
MichaelGofron
27

Mengelola Siklus Hidup Aplikasi Anda sangat membantu untuk pertanyaan Anda. Untuk konsep cepat, Anda dapat melihat Gambar di dokumen itu. Anda juga dapat membaca komentar dari kode yang dihasilkan oleh XCode Wizard. Terdaftar sebagai berikut:

- (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:.
     */
}

Untuk penjelasan lebih rinci, silakan merujuk ke dokumen resmi untuk UIApplicationDelegate

tomjpsun
sumber
Tautannya sudah mati.
Phlippie Bosman
Perbaiki beberapa deskripsi dan tautan, 2019 untuk saat ini.
tomjpsun
13

Saya masih agak bingung dengan jawaban Dano jadi saya melakukan sedikit tes untuk mendapatkan alur peristiwa dalam skenario tertentu untuk referensi saya, tetapi mungkin bermanfaat bagi Anda juga. Ini untuk aplikasi yang JANGAN gunakan UIApplicationExitsOnSuspenddi info.plist mereka. Ini dilakukan pada simulator iOS 8 + dikonfirmasi dengan perangkat iOS 7. Maafkan nama penangan acara Xamarin. Mereka sangat mirip.

  • Peluncuran awal dan selanjutnya dari kondisi tidak berjalan:

SelesaiMeluncurkan

OnActivated

  • Gangguan (panggilan telepon, slide-down atas, slide-up bawah):
  • Tombol Beranda tekan dua kali cantuman aplikasi yang tidak aktif, lalu pilih kembali aplikasi kami:

OnResignActivation


OnActivated

  • Tombol Beranda tekan dua kali cantuman aplikasi yang tidak aktif, pilih aplikasi lain, lalu luncurkan ulang aplikasi kami:
  • Tombol Home tekan sekali, lalu luncurkan kembali:
  • Kunci (tombol on / off), lalu buka kunci:

OnResignActivation

DidEnterBackground


WillEnterForeground

OnActivated

  • Tombol Beranda tekan dua kali, dan hentikan aplikasi kami: (peluncuran ulang berikutnya adalah yang pertama)

OnResignActivation

DidEnterBackground

DidEnterBackground (khusus iOS 7?)

Ya, DidEnterBackgrounddipanggil dua kali pada perangkat iOS7. Kedua kali keadaan aplikasi UIA adalah Latar Belakang. Namun, simulator iOS 8 tidak. Ini perlu pengujian pada perangkat iOS 8. Saya akan memperbarui jawaban saya ketika saya mendapatkannya, atau orang lain dapat mengonfirmasi.

Rahmi Aksu
sumber
9

applicationWillEnterForeground disebut:

ketika aplikasi diluncurkan kembali (datang dari latar belakang ke latar depan) Metode ini tidak dipanggil ketika aplikasi dimulai untuk pertama kalinya yaitu ketika applicationDidFinishLaunchdipanggil tetapi hanya ketika datang dari latar belakang applicationDidBecomeActive

applicationDidBecomeActive disebut

ketika aplikasi pertama kali diluncurkan setelah didFinishLaunching setelah applicationWillEnterForegroundjika tidak ada URL untuk menangani. setelah application:handleOpenURL:dipanggil. setelah applicationWillResignActivejika pengguna mengabaikan gangguan seperti panggilan telepon atau SMS. setelah menghilangnya alertView di mana saja dari aplikasi

Kareem Waheed
sumber
Apakah Anda kebetulan tahu apakah ini diubah pada iOS 7? Saya ingat (saya bisa salah) melakukan hal-hal (iOS 5/6) di applicationWillEnterForeground dan menjalankannya ketika aplikasi pertama kali diluncurkan. Sampai sekarang, di 7.1 / 8, Anda benar applicationWillEnterForeground tidak dipanggil saat diluncurkan.
Jinyoung Kim
7

applicationWillResignActive dipanggil ketika sistem meminta izin. (di iOS 10). Hanya untuk berjaga-jaga jika ada orang yang mengalami masalah yang sama dengan saya ...

Anson Yao
sumber
tahu metode apa yang dipanggil setelah izin pop diberhentikan? Saya memiliki masalah ini stackoverflow.com/questions/26059927/…
Suresh Durishetti
5

Di iOS 8+ ada perbedaan yang halus tetapi penting untuk menerima panggilan telepon.

Di iOS 7 jika pengguna menerima panggilan telepon, baik applicationWillResignActive: dan applicationDidEnterBackground: dipanggil. Tetapi di iOS 8+ hanya applicationWillResignActive: dipanggil.

Qiulang
sumber
1

Untuk iOS 13+ metode berikut akan dijalankan:

- (void)sceneWillEnterForeground:(UIScene *)scene
- (void)sceneDidBecomeActive:(UIScene *)scene
pengguna2994130
sumber