applicationWill EntryForeground so với applicationDidBecomeActive, applicationWillResignActive vs. applicationDid EntryBackground


215

Đâu là đại biểu thích hợp để thực hiện khi một ứng dụng thức dậy ở chế độ nền và bạn muốn nó chuẩn bị cho nó hoạt động?

applicationWill EntryForeground vs applicationDidBecomeActive - Sự khác biệt là gì?

Đâu là đại biểu thích hợp để thực hiện khi ứng dụng đi ngủ và bạn muốn chuẩn bị nó để dọn dẹp và lưu dữ liệu?

applicationWillResignActive so với applicationDid EntryBackground - Sự khác biệt là gì?

Ngoài ra, tôi đã nhận thấy rằng ứng dụngWillResignActive được gọi khi có tin nhắn SMS hoặc cuộc gọi đến nhưng người dùng chọn nhấp vào Ok và tiếp tục. Tôi không muốn ứng dụng của mình thực hiện bất kỳ hành động nào trong những trường hợp này. Tôi chỉ muốn nó tiếp tục chạy mà không cần dọn dẹp trung gian vì người dùng không thoát khỏi ứng dụng. Vì vậy, tôi nghĩ sẽ hợp lý hơn khi thực hiện công việc dọn dẹp chỉ trong applicationDid EntryBackground.

Tôi sẽ đánh giá cao ý kiến ​​của bạn về các thực tiễn tốt nhất để theo dõi việc chọn đại biểu nào sẽ thực hiện để thức dậy và đi ngủ cũng như xem xét các sự kiện như bị gián đoạn bởi SMS / cuộc gọi.

Cảm ơn

Câu trả lời:


449

Khi thức dậy, tức là khởi chạy lại một ứng dụng (thông qua springboard, chuyển đổi ứng dụng hoặc URL) applicationWillEnterForeground:được gọi. Nó chỉ được thực thi một lần khi ứng dụng sẵn sàng để sử dụng, sau khi được đặt vào nền, trong khi applicationDidBecomeActive:có thể được gọi nhiều lần sau khi khởi chạy. Điều này làm cho applicationWillEnterForeground:lý tưởng cho việc thiết lập cần xảy ra chỉ một lần sau khi khởi chạy lại.

applicationWillEnterForeground: được gọi là:

  • khi ứng dụng được khởi chạy lại
  • trước applicationDidBecomeActive:

applicationDidBecomeActive: được gọi là:

  • khi ứng dụng được ra mắt lần đầu tiên sau application:didFinishLaunchingWithOptions:
  • sau applicationWillEnterForeground:nếu không có URL để xử lý.
  • sau application:handleOpenURL:được gọi.
  • sau applicationWillResignActive:nếu người dùng bỏ qua sự gián đoạn như một cuộc gọi điện thoại hoặc SMS.

applicationWillResignActive: được gọi là:

  • khi có sự gián đoạn như một cuộc gọi điện thoại.
    • nếu người dùng nhận cuộc gọi applicationDidEnterBackground:được gọi.
    • nếu người dùng bỏ qua cuộc gọi applicationDidBecomeActive:được gọi.
  • khi nhấn nút home hoặc người dùng chuyển ứng dụng.
  • tài liệu nói rằng bạn nên
    • tạm dừng các nhiệm vụ đang diễn ra
    • vô hiệu hóa bộ hẹn giờ
    • tạm dừng một trò chơi
    • giảm tốc độ khung hình OpenGL

applicationDidEnterBackground: được gọi là:

  • sau applicationWillResignActive:
  • tài liệu nói rằng bạn nên:
    • phát hành tài nguyên chia sẻ
    • lưu dữ liệu người dùng
    • bộ hẹn giờ vô hiệu
    • lưu trạng thái ứng dụng để bạn có thể khôi phục nó nếu ứng dụng bị chấm dứt.
    • tắt cập nhật giao diện người dùng
  • bạn có 5 giây để làm những gì bạn cần và trả về phương thức
    • nếu bạn không quay lại trong vòng ~ 5 giây thì ứng dụng bị chấm dứt.
    • bạn có thể yêu cầu thêm thời gian với beginBackgroundTaskWithExpirationHandler:

Các tài liệu chính thức.


10
Một điều nữa để thêm. Nếu bạn mở danh sách ứng dụng nền từ ứng dụng của mình (nhấp đúp vào nút home) và sau đó quay lại ứng dụng đó (chọn xem trước ứng dụng của bạn) - -applicationWillEnterForeground:sẽ không được gọi, chỉ -applicationDidEnterBackground:(giả sử, iOS không nghĩ rằng đó là khởi chạy lại).
kpower

@kpower vâng, điều đó đã làm tôi bị gãy cổ ... sẽ không bao giờ nghĩ rằng sẽ EntryForeground sẽ không được gọi trong trường hợp đó ...
TheEye

Không phải nó applicationWillEnterForeground:sẽ được gọi mỗi lần từ nền đến tiền cảnh sao?! Tôi không thể tìm thấy một trường hợp KHÔNG được gọi là KHÔNG CÓ applicationDidBecomeActivesau đó.
Desmond DAI

Điều này không chính xác. applicationWillResignActive có thể được gọi mà không cần applicationDid
EntryBackground

27

Quản lý vòng đời ứng dụng của bạn rất hữu ích cho câu hỏi của bạn. Đối với khái niệm nhanh, bạn có thể xem hình trong tài liệu đó. Bạn cũng có thể đọc nhận xét từ mã được tạo bởi Trình hướng dẫn XCode. Được liệt kê như sau:

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

Để được giải thích chi tiết hơn, vui lòng tham khảo tài liệu chính thức cho UIApplicationDelegate


Liên kết đã chết.
Phlippie Bosman

Sửa đổi một số mô tả và liên kết, năm 2019 cho bây giờ.
tomjpsun

13

Tôi vẫn hơi bối rối với câu trả lời của Dano vì vậy tôi đã làm một bài kiểm tra nhỏ để có được luồng sự kiện trong các kịch bản nhất định để tôi tham khảo, nhưng nó cũng có thể hữu ích với bạn. Điều này là dành cho các ứng dụng KHÔNG sử dụng UIApplicationExitsOnSuspendtrong thông tin của họ. Điều này đã được tiến hành trên trình giả lập iOS 8 + được xác nhận với thiết bị iOS 7. Xin thứ lỗi tên xử lý sự kiện của Xamarin. Chúng rất giống nhau.

  • Ban đầu và tất cả các lần khởi chạy tiếp theo từ trạng thái không chạy:

Đã hoàn thành

Hoạt động

  • Ngắt (gọi điện thoại, trượt từ trên xuống, trượt xuống dưới):
  • Nút Home nhấn đúp vào danh sách các ứng dụng không hoạt động, sau đó chọn lại ứng dụng của chúng tôi:

OnResignActivation


Hoạt động

  • Nút Home nhấn đúp vào danh sách các ứng dụng không hoạt động, chọn một ứng dụng khác, sau đó khởi chạy lại ứng dụng của chúng tôi:
  • Nút Home nhấn một lần, sau đó khởi chạy lại:
  • Khóa (nút bật / tắt), sau đó mở khóa:

OnResignActivation

Did EntryBackground


Will EntryForeground

Hoạt động

  • Nhấn đúp nút Home và chấm dứt ứng dụng của chúng tôi: (khởi chạy lại tiếp theo là trường hợp đầu tiên)

OnResignActivation

Did EntryBackground

Did EntryBackground (chỉ dành cho iOS 7?)

Có, DidEnterBackgroundđược gọi hai lần trên thiết bị iOS7. Cả hai lần trạng thái UIApplication là Bối cảnh. Tuy nhiên, trình giả lập iOS 8 thì không. Điều này cần thử nghiệm trên thiết bị iOS 8. Tôi sẽ cập nhật câu trả lời của mình khi tôi có được nó, hoặc người khác có thể xác nhận.


9

applicationWillEnterForeground được gọi là:

khi ứng dụng được khởi chạy lại (xuất phát từ nền tới tiền cảnh) Phương thức này không được gọi khi ứng dụng khởi động lần đầu tức là khi applicationDidFinishLaunchđược gọi mà chỉ khi xuất phát từ nền applicationDidBecomeActive

applicationDidBecomeActive được gọi là

khi ứng dụng được khởi chạy lần đầu tiên sau didFinishLaunching khi applicationWillEnterForegroundkhông có URL để xử lý. sau application:handleOpenURL:được gọi. sau applicationWillResignActivenếu người dùng bỏ qua sự gián đoạn như một cuộc gọi điện thoại hoặc SMS. sau khi biến mất alertView bất cứ nơi nào từ ứng dụng


Bạn có biết rằng điều này đã được thay đổi kể từ iOS 7 không? Tôi nhớ (tôi có thể bị nhầm lẫn) đang làm công cụ (iOS 5/6) trong ứng dụngWill EntryForeground và chạy nó khi ứng dụng lần đầu tiên ra mắt. Kể từ bây giờ, trong 7.1 / 8, bạn là ứng dụng phù hợpWill EntryForeground không được gọi khi khởi chạy.
Jinyoung Kim

7

applicationWillResignActive được gọi khi hệ thống yêu cầu quyền. (trong iOS 10). Chỉ trong trường hợp ai đó gặp rắc rối như tôi ...


Bất kỳ ý tưởng phương pháp nào được gọi sau khi cho phép pop bỏ qua? Tôi có vấn đề này stackoverflow.com/questions/26059927/
Ấn

5

Trong iOS 8+ có một sự khác biệt tinh tế nhưng quan trọng để nhận cuộc gọi điện thoại.

Trong iOS 7, nếu người dùng thực hiện cuộc gọi điện thoại, cả ứng dụngWillResignActive: và applicationDid EntryBackground: sẽ được gọi. Nhưng trong iOS 8+ chỉ có ứng dụngWillResignActive: được gọi.


1

Đối với iOS 13+, các phương thức sau sẽ được thực thi:

- (void)sceneWillEnterForeground:(UIScene *)scene
- (void)sceneDidBecomeActive:(UIScene *)scene
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.