Hôm bữa mình đã giới thiệu với anh em về cách Android chạy nền và đa nhiệm, hôm nay tới lượt iOS. Anh em đọc qua cho biết cái máy của mình chạy như thế nào, và vì sao thỉnh thoảng có app bị "load lại" khi anh em quay lại xài nó.
Trạng thái của app sẽ quyết định những gì app được phép làm. Những gì được phép làm mình sẽ nói sau, còn đây là các trạng thái của 1 app trên iOS:
Apple nói rằng một khi app đã vào trạng thái chạy background, app phải làm ít việc nhất có thể, hoàn thành nhanh nhất có thể những gì còn sót lại (ví dụ: đang cập nhật thông tin profile Facebook mà thoát ra, thì app Facebook phải nhanh chóng hoàn thành tác vụ này rồi ngưng), và giải pháp RAM nhiều nhất có thể. Và lý tưởng nhất, một khi app đã chạy nền thì app không nên làm thêm bất kì thứ gì nữa.
Các trạng thái của app
Trạng thái của app sẽ quyết định những gì app được phép làm. Những gì được phép làm mình sẽ nói sau, còn đây là các trạng thái của 1 app trên iOS:
- Not running: cơ bản là app của bạn đang không chạy gì
- Inactive: khi bạn vừa chạm vào icon của app ngoài màn hình chính, hoặc khi có thông báo của app gửi tới bạn. Khi bạn vuốt / bấm home để quay lại màn hình chính thì app cũng bị đưa vào trạng thái inactive. Khi app đang chạy mà có cuộc gọi chen ngang thì cũng inactive.
- Active: khi app đã chạy lên, và bạn đã có thể bắt đầu sử dụng app như bình thường
- Background: app sẽ tiến hành chạy ngầm một số tác vụ cho hoàn tất những gì mà bạn đang là,
- Suspended: app bị iOS tạm dừng, nhưng nó vẫn còn nằm trong RAM của máy
- Sau một thời gian suspended, nếu bạn không còn quay lại app nữa, nó sẽ bị kill hoàn toàn và trở về not running. Lúc này app không còn nằm trong RAM nữa.
Apple nói rằng một khi app đã vào trạng thái chạy background, app phải làm ít việc nhất có thể, hoàn thành nhanh nhất có thể những gì còn sót lại (ví dụ: đang cập nhật thông tin profile Facebook mà thoát ra, thì app Facebook phải nhanh chóng hoàn thành tác vụ này rồi ngưng), và giải pháp RAM nhiều nhất có thể. Và lý tưởng nhất, một khi app đã chạy nền thì app không nên làm thêm bất kì thứ gì nữa.
Khi lập trình viên làm app, Apple có một số cách để họ ra lệnh cho app làm một số việc ứng với từng trạng thái. Trong đó, Apple nói rất nhiều về việc app luôn phải chuẩn bị sẵn sàng để bị vô hiệu hóa và đưa vào trạng thái Inactive, vì người dùng có thể về home bất kì lúc nào. Cái mà Apple khuyên đó là:
- Lưu các dữ liệu người dùng lên bộ nhớ máy, đóng mọi file đang mở
- Ngừng việc thực hiện các tác vụ
- Không hẹn giờ xử lý các tác vụ mới
- Các bộ đếm giờ cũng cần được vô hiệu hóa
- Nếu đang chơi game, thì game phải pause lại ngay lập tức
- Dừng mọi lệnh đồ họa
- Chơi nhạc
- Theo dõi vị trí, ví dụ các app chỉ đường
- Ứng dụng gọi điện qua Internet (VoIP), ví dụ như Skype, Facebook Messenger, vậy nên bạn thoát app mà vẫn gọi được là vì thế
- Ứng dụng tin tức cập nhật tin mới
- Ứng dụng cần giao tiếp với các phụ kiện gắn vào máy
Trong iOS cũng có chức năng Background App Refresh, bạn có thể chỉnh lại những app nào được phép xài tính năng này. Background App Refresh cho phép một số app dù đã bị suspend nhưng vẫn có thể lấy nội dung mới từ Internet về. Ví dụ, app Notes cần phải thỉnh thoảng lấy ghi chú mới về để khi bạn mở app thì có sẵn các ghi chú mới đã đồng bộ sẵn sàng.
Hỗ trợ multi tasking của iOS
Cách iOS chạy đa nhiệm cũng tương tự như Android, tức là khi bạn mở một app mới thì nó sẽ "chồng" lên trên app cũ. Bạn có thể thấy được thứ tự những app này bằng cách truy cập vào màn hình đa nhiệm, cái này cơ bản chắc anh em cũng đã biết rồi ha.
Khi bạn vuốt app để về home, hoặc chuyển sang app khác, thì app cũ được đưa vào trạng thái suspended. Và sau một thời gian không dùng nữa, app sẽ bị kill hoàn toàn, đưa về trạng thái not running. Thế nên lâu lâu anh em quay lại các app mình từng dùng trước đây thì thấy nó bị "load lại", tức là app của anh em đã bị kill rồi đấy và bị giải phóng hoàn toàn khỏi bộ nhớ RAM.
Còn nếu anh em quay lại app mình đang dùng sau chỉ vài phút, app không bị tắt hẳn nên mọi thứ vẫn còn ở đấy, anh em có thể tiếp tục dùng app như bình thường. Đó là do app chỉ mới bị suspend, vẫn còn lưu lại trong RAM.
Nếu một app mới chạy lên mà không đủ bộ nhớ, iOS sẽ bắt đầu kill dần các app đang bị suspended để đảm bảo app mới có thể hoạt động. Mình thấy rằng iOS làm điều này gay gắt hơn so với Android, còn chi tiết điều kiện, cách thức tắt app thì Apple không công bố rõ ràng, ngay cả Google cũng không nói nhiều về cách hoạt động của cơ chế tắt app này.
Quảng cáo
Apple có cung cấp một hàm tên là applicationWillTerminate để lập trình viên sửa soạn cho app trước khi nó bị giết hẳn (ví dụ như hoàn thành tác vụ đang làm, đóng các file đang truy cập...). App sẽ có khoảng 5 giây để hoàn thành mọi thứ trước khi bị "giết". Nếu hàm trên không chạy xong trong thời gian này, hệ thống sẽ tự động kill app luôn mà không đợi nữa.
Nếu bạn tắt 1 app từ giao diện đa nhiệm, app đó sẽ được giải phóng hoàn toàn ra khỏi bộ nhớ, và quan trọng là nó không thể lấy nội dung từ Internet nữa cho tới lần sau bạn mở app ra. Ví dụ, nếu Spotify đang chơi nhạc, mà bạn kill nó hẳn luôn thì việc chơi nhạc cũng sẽ bị dừng ngay lập tức.
Còn nếu bạn để cho iOS tự động xử lý, app sẽ được đưa vào trạng thái suspended và khi đó nó vẫn có thể chạy một số tác vụ nền, chẳng hạn như chơi nhạc, gọi điện VoIP... Tất nhiên như đã nói ở trên, iOS sẽ giám sát việc này để xem liệu bạn có dùng app nhiều hay không, nếu có thì app mới được update thường xuyên, còn không thì thời gian giãn cách giữa các lần được chạy nền sẽ dài ra.