Giới hạn quá trình nền là gì

Chúng ta vẫn thường nói về việc chạy nền của các app trên Android, nhưng thật sự việc "chạy nền" này là như thế nào? Nhân dịp cần tìm hiểu về cách thức Android chạy các công việc nền của nó, mình chia sẻ lại với anh em luôn.

Tác vụ chạy nền là sao?

Mỗi ứng dụng Android có một luồng [thread] để xử lý giao diện của nó, ví dụ như đo đạc, nút này nút kia hiện ra sao, cái gì màu gì, hiệu ứng chạy như thế nào. Thread này cũng sẽ xử lý các tương tác của bạn với app. Tạm gọi đây là UI Thread.

Nếu UI Thread phải làm quá nhiều việc, mà mỗi việc lại kéo dài, thì có thể khiến cho app của bạn có vẻ như chạy chậm hơn, phản hồi kém hơn, tức là trải nghiệm của người dùng giảm đi. Vậy nên bất kì tác vụ nào cần thời gian dài để xử lý, chẳng hạn như giải mã một tấm ảnh, truy cập file trên bộ nhớ / thẻ nhớ, các lần gọi API để lấy thông tin từ máy chủ về hiển thị lên app, download 1 file về máy... thì Google khuyên là nên thực hiện trong "một tác vụ chạy nền".

Tác vụ chạy nền này sẽ hoạt động nhờ vào một luồng xử lý riêng, gọi là Background Thread. Background Thread sau khi xử lý xong có thể trả kết quả về cho UI Thread để hiện thông báo đã download xong, hoặc hiển thị danh sách file mà app đã quét được. Có những thứ cần được xử lý trong Background Thread trong lúc người dùng vẫn đang xài app như bình thường nữa kìa.

Một số ứng dụng cũng có thể cần tới những tác vụ chạy khi bạn đang không dùng app, ví dụ như ứng dụng lịch thỉnh thoảng phải lấy dữ liệu mới về. Một số khác thì yêu cầu phải ngừng ngay khi người dùng không còn tương tác với app.

Các thách thức trong việc chạy nền

+ Liệu app có cần phải kiểm soát chính xác thời gian bắt đầu và kết thúc của tác vụ chạy ngầm hay không? Ví dụ, app chơi nhạc thì cần bất đầu phát nhạc khi bạn nhấn nút start, và sẽ liên tục chơi nhạc cho tới khi bị người dùng nhấn nút ngừng. Trong khi đó, một app khác thì thỉnh thoảng upload data lên máy chủ mỗi 1 giờ, cứ up xong là được, không cần phải biết khi nào bắt đầu và kết thúc.

+ Tác vụ chạy nền có thể bị ngắt quãng hay không? Ví dụ, nếu app upload một file rất to, và quá trình này bị ngừng đột ngột thì app phải upload lại từ đầu. Với những tác vụ dạng này, lập trình viên sẽ muốn Android không tự mình ngắt quãng app của họ mà phải đợi cho tác vụ chạy xong hết.

+ Tác vụ này có cần phải phản hồi liền không, hay nó có thể để chạy sau cũng được?

+ Tác vụ này có phải chạy khi máy đạt đủ một số điều kiện hay không? Ví dụ, hình chỉ được sao lưu khi máy cắm sạc và đang kết nối Wi-Fi.

+ Tác vụ này có cần thu thập dữ liệu nhạy cảm của người dùng, ví dụ như dữ liệu địa điểm hay không?

+ Tác vụ có cần chạy đúng vào 1 thời điểm cụ thể hay không? Ví dụ, ứng dụng lịch sẽ phải thông báo cho người dùng về cuộc họp sắp tới của họ đúng vào giờ được cài.

Foreground Services

Với những việc quan trọng cần chạy ngay và cần phải chạy cho tới khi hoàn tất, lập trình viên Android sẽ dùng foreground service. Service dạng này sẽ nói cho hệ thống biết là app đang làm việc quan trọng và không được phép kill app. Bạn có thể nhìn thấy foreground servcie thông qua một thông báo hiển thị trong khu vực notification nhưng bạn không thể xóa được thông báo này [trừ Android 11 trở đi].

Ví dụ của việc dùng foreground service: app chơi nhạc hiển thị các nút điều khiển cho bạn xài.

WorkManager, AlarmManager, DownloadManager

WorkManager là một thư viện lập trình dành cho những thứ có thể chạy sau được, không cần gấp phản hồi, và sẽ chạy ngay cả khi điện thoại Android của bạn bị khởi động lại. WorkManager có thể kích hoạt các tác vụ khi thỏa một điều kiện nào đó [ví dụ như pin phải trên 50%, về mạng phải là Wi-Fi chứ 4G thì không chơi...] mà không cần app phải bật. WorkManager có khả năng cân bằng khá tốt các tài nguyên của hệ thống, và nó cũng tốt để thiết lập các tác vụ cần lặp đi lặp lại.

AlarmManager cũng là một thư viện chạy ngầm nhưng dùng cho những tác vụ cần phải kích hoạt vào đúng một thời điểm nào đó. Ví dụ, đúng 8h sáng thì tác vụ đó phải chạy lên để thông báo, để gửi email...

DownloadManager thì - như cái tên đã gợi ý - chuyên dùng cho những tác vụ cần download file từ máy chủ về. Đây là thư viện giúp bạn vẫn có thể download được file ngay cả khi đã thoát trình duyệt và chuyển sang dùng một app khác trên điện thoại Android. Tác vụ chạy ngầm download file này chắc bạn sẽ thấy thường xuyên nè. Nó cũng hỗ trợ download lại nếu lỡ nữa chừng bị đứt hoặc máy bị khởi động lại.

Chạy nền khác với đa nhiệm nha

Nãy giờ mình giải thích với anh em là về cơ chế chạy nền của app [background task]. Còn cơ chế quản lý multi task của Android thì khác. Sẵn mình nói luôn cho anh em biết nhé.

Mỗi khi bạn chạy một app, Android sẽ đưa app của bạn vào một "chồng app". Cứ thêm 1 app được chạy lên thì app này sẽ nằm lên trên cùng của chồng này [gọi là back stack]. Bạn có thể thấy hình dáng của back stack bằng cách nhấn nút Recent Apps, khi đó app mới chạy gần nhất sẽ nằm trên cùng.

Có một số app sẽ khởi động nhiều tác vụ khác nhau. Ví dụ, nếu bạn dùng Gmail thì một màn hình có thể hiển thị danh sách email, và khi bạn nhấn vào nút soạn thảo thì nó ra một màn hình khác. Màn hình soạn thảo này cũng được đưa vào back stack, nên khi bạn nhấn back thì nó sẽ quay trở lại màn hình danh sách email. Nhấn back thêm lần nữa, nó sẽ thoát app Gmail và chuyển sang app trước đó bạn dùng.

Android tất nhiên có cơ chế để xóa các app đã lâu không còn sử dụng để giải phóng bộ nhớ. Khi đó, nó chỉ để lại hành động đầu tiên của app [trong ví dụ Gmail trên, thì màn hình danh sách email là hành động đầu tiên - root activity. Nếu bạn đã mở màn hình soạn thảo nhưng lại không xài, sau một thời gian hãy quay lại app Gmail bạn sẽ được đưa về màn hình danh sách email]. Đây là tình trạng "load lại" mà anh em hay nói tới.

Android làm điều này dựa trên giả định rằng nếu bạn mở một màn hình mà rất lâu không sử dụng thì khả năng cao là bạn đã bỏ nó luôn rồi, không làm việc đó nữa. Lần sau quay lại, bạn sẽ bắt đầu lại từ đầu.

Một số app có thể thiết lập để Android luôn lưu giữ đầy đủ trạng thái của nó ngay cả sau một thời gian rất dài nằm trong back stack. Một số khác thì luôn mặc định "load lại" bất kể khi nào bạn rời app và vào lại. Cái này thì tùy thuộc vào nhà phát triển.

Qua đây hi vọng anh em đã hiểu hơn về cơ chế chạy app của Android về mặt đa nhiệm và chạy ngầm. Chúc anh em vui.

Chủ Đề