Việc sử dụng đài vô tuyến để truyền dữ liệu có thể là một trong những nguồn tiêu hao pin đáng kể nhất của ứng dụng. Để giảm thiểu mức tiêu hao pin liên quan đến hoạt động mạng, bạn cần phải hiểu rõ cách mô hình kết nối của mình sẽ ảnh hưởng đến phần cứng vô tuyến cơ bản.
Phần này giới thiệu máy trạng thái vô tuyến và giải thích cách mô hình kết nối của ứng dụng tương tác với máy trạng thái này. Sau đó, hướng dẫn này sẽ đưa ra một số kỹ thuật giúp giảm thiểu ảnh hưởng của mức tiêu thụ dữ liệu của ứng dụng đến pin.
Máy trạng thái đài phát
Đài vô tuyến không dây trên thiết bị của người dùng có các tính năng tiết kiệm pin tích hợp giúp giảm thiểu lượng pin tiêu thụ. Khi hoạt động hết công suất, bộ đàm không dây sẽ tiêu thụ đáng kể điện năng, nhưng khi không hoạt động hoặc ở chế độ chờ, bộ đàm này tiêu thụ rất ít điện năng.
Một yếu tố quan trọng cần nhớ là đài không thể chuyển từ chế độ chờ sang chế độ hoàn toàn chủ động ngay lập tức. Có một khoảng thời gian trễ liên quan đến việc "bật" đài. Vì vậy, pin chuyển từ trạng thái năng lượng cao hơn sang trạng thái năng lượng thấp hơn một cách từ từ để tiết kiệm điện khi không sử dụng, đồng thời cố gắng giảm thiểu độ trễ liên quan đến việc "bật" đài.
Máy trạng thái cho một đài vô tuyến mạng 3G thông thường bao gồm 3 trạng thái năng lượng:
- Đầy đủ công suất: Được dùng khi có kết nối đang hoạt động, cho phép thiết bị truyền dữ liệu ở tốc độ cao nhất có thể.
- Nguồn điện yếu: Trạng thái trung gian giúp giảm mức tiêu thụ pin xuống khoảng 50%.
- Chế độ chờ: Trạng thái tiêu thụ điện năng tối thiểu mà không có kết nối mạng nào đang hoạt động.
Mặc dù trạng thái thấp và trạng thái chờ tiêu hao ít pin hơn đáng kể, nhưng chúng cũng làm tăng đáng kể độ trễ cho các yêu cầu mạng. Quá trình sạc lại từ trạng thái pin yếu đến trạng thái pin đầy mất khoảng 1, 5 giây và quá trình chuyển từ chế độ chờ sang trạng thái pin đầy có thể mất hơn 2 giây.
Để giảm thiểu độ trễ, máy trạng thái sẽ sử dụng một độ trễ để hoãn quá trình chuyển đổi sang trạng thái năng lượng thấp hơn. Hình 1 sử dụng thời gian của AT&T cho một đài vô tuyến 3G thông thường.
Hình 1. Trạng thái điển hình của máy vô tuyến không dây 3G.
Trạng thái của đài trên mỗi thiết bị, đặc biệt là độ trễ chuyển đổi liên kết ("thời gian đuôi") và độ trễ khởi động, sẽ thay đổi tuỳ thuộc vào công nghệ đài không dây được sử dụng (3G, LTE, 5G, v.v.) và được nhà mạng xác định cũng như định cấu hình mà thiết bị đang hoạt động.
Trang này mô tả một trạng thái máy đại diện cho một đài vô tuyến không dây 3G thông thường, dựa trên dữ liệu do AT&T cung cấp. Tuy nhiên, các nguyên tắc chung và phương pháp hay nhất thu được vẫn áp dụng cho mọi hoạt động triển khai đài vô tuyến không dây.
Phương pháp này đặc biệt hiệu quả đối với hoạt động duyệt web thông thường trên thiết bị di động vì nó ngăn chặn độ trễ không mong muốn trong khi người dùng duyệt web. Thời gian chờ tương đối thấp cũng đảm bảo rằng sau khi một phiên duyệt web kết thúc, đài có thể chuyển sang trạng thái năng lượng thấp hơn.
Rất tiếc, phương pháp này có thể dẫn đến các ứng dụng không hiệu quả trên các hệ điều hành điện thoại thông minh hiện đại như Android, nơi các ứng dụng chạy cả ở nền trước (nơi độ trễ là yếu tố quan trọng) và ở nền sau (nơi thời lượng pin cần được ưu tiên).
Cách ứng dụng ảnh hưởng đến trạng thái của đài phát
Mỗi khi bạn tạo một kết nối mạng mới, đài sẽ chuyển sang trạng thái đầy đủ công suất. Trong trường hợp máy trạng thái vô tuyến 3G thông thường được mô tả trước đó, máy này sẽ duy trì ở mức công suất tối đa trong suốt thời gian truyền của bạn, cộng thêm 5 giây thời gian chờ, sau đó là 12 giây ở trạng thái năng lượng thấp. Vì vậy, đối với một thiết bị 3G thông thường, mỗi phiên truyền dữ liệu sẽ khiến đài phát tiêu thụ năng lượng trong ít nhất 18 giây.
Trên thực tế, điều này có nghĩa là một ứng dụng thực hiện việc truyền dữ liệu trong một giây, ba lần một phút, sẽ duy trì trạng thái hoạt động liên tục của đài vô tuyến không dây, chuyển đài này trở lại chế độ công suất cao ngay khi đài này chuyển sang chế độ chờ.
Hình 2. Mức sử dụng năng lượng tần số vô tuyến tương đối cho một lần truyền dữ liệu trong một giây, chạy 3 lần mỗi phút. Số liệu này không bao gồm độ trễ "tăng tốc" giữa các lần chạy.
Để so sánh, nếu cùng một ứng dụng đó gộp các hoạt động truyền dữ liệu, chạy một hoạt động truyền dữ liệu duy nhất trong 3 giây mỗi phút, thì điều này sẽ giữ cho đài ở trạng thái công suất cao trong tổng thời gian chỉ 20 giây mỗi phút. Điều này sẽ cho phép đài ở chế độ chờ trong 40 giây mỗi phút, giúp giảm đáng kể mức tiêu thụ pin.
Hình 3. Mức sử dụng năng lượng vô tuyến không dây tương đối cho các hoạt động truyền dữ liệu trong 3 giây, chạy mỗi phút một lần.
Kỹ thuật tối ưu hoá
Bây giờ bạn đã hiểu cách truy cập mạng ảnh hưởng đến thời lượng pin, hãy nói về một số việc bạn có thể làm để giảm mức tiêu hao pin, đồng thời mang lại trải nghiệm người dùng nhanh chóng và mượt mà.
Chuyển dữ liệu theo gói
Như đã đề cập trong phần trước, việc kết hợp các hoạt động truyền dữ liệu để bạn truyền nhiều dữ liệu hơn nhưng ít thường xuyên hơn là một trong những cách tốt nhất để cải thiện hiệu suất sử dụng pin.
Tất nhiên, không phải lúc nào bạn cũng có thể làm được điều này nếu ứng dụng của bạn cần nhận hoặc gửi dữ liệu ngay lập tức để phản hồi một hành động của người dùng. Bạn có thể giảm thiểu vấn đề này bằng cách dự đoán và tìm nạp trước dữ liệu. Các trường hợp khác, chẳng hạn như gửi nhật ký hoặc số liệu phân tích đến một máy chủ và các hoạt động chuyển dữ liệu khác do ứng dụng khởi tạo (không khẩn cấp), rất phù hợp với việc xử lý theo lô và đóng gói. Hãy xem bài viết Tối ưu hoá các tác vụ do ứng dụng khởi tạo để biết các mẹo về cách lập lịch truyền dữ liệu mạng ở chế độ nền.
Tìm nạp trước dữ liệu
Tìm nạp trước dữ liệu là một cách hiệu quả khác để giảm số lượng phiên truyền dữ liệu độc lập mà ứng dụng của bạn chạy. Với tính năng tìm nạp trước, khi người dùng thực hiện một hành động trong ứng dụng của bạn, ứng dụng sẽ dự đoán dữ liệu nào có nhiều khả năng cần thiết cho chuỗi hành động tiếp theo của người dùng và tìm nạp dữ liệu đó trong một lần, thông qua một kết nối duy nhất, ở mức tối đa.
Bằng cách tải trước các dữ liệu cần chuyển, bạn sẽ giảm số lần kích hoạt đài cần thiết để tải dữ liệu xuống. Nhờ đó, bạn không chỉ tiết kiệm pin mà còn cải thiện độ trễ, giảm băng thông cần thiết và giảm thời gian tải xuống.
Việc tìm nạp trước cũng giúp cải thiện trải nghiệm người dùng bằng cách giảm thiểu độ trễ trong ứng dụng do phải chờ quá trình tải xuống hoàn tất trước khi thực hiện một hành động hoặc xem dữ liệu.
Sau đây là một ví dụ thực tế.
Trình đọc tin tức
Nhiều ứng dụng tin tức cố gắng giảm băng thông bằng cách chỉ tải tiêu đề xuống sau khi người dùng chọn một danh mục, chỉ tải toàn bộ bài viết xuống khi người dùng muốn đọc và chỉ tải hình thu nhỏ xuống khi người dùng cuộn để xem.
Khi sử dụng phương pháp này, đài phát buộc phải duy trì trạng thái hoạt động trong phần lớn phiên đọc tin tức của người dùng khi họ cuộn tiêu đề, thay đổi danh mục và đọc bài viết. Không chỉ vậy, việc liên tục chuyển đổi giữa các trạng thái năng lượng sẽ dẫn đến độ trễ đáng kể khi chuyển đổi danh mục hoặc đọc bài viết.
Cách tiếp cận tốt hơn là tìm nạp trước một lượng dữ liệu hợp lý khi khởi động, bắt đầu bằng bộ tiêu đề và hình thu nhỏ tin tức đầu tiên – đảm bảo thời gian khởi động có độ trễ thấp – và tiếp tục với các tiêu đề và hình thu nhỏ còn lại, cũng như văn bản bài viết cho từng bài viết có sẵn từ ít nhất danh sách tiêu đề chính.
Một lựa chọn khác là tìm nạp trước mọi tiêu đề, hình thu nhỏ, văn bản bài viết và thậm chí cả hình ảnh đầy đủ của bài viết (thường ở chế độ nền theo lịch trình định trước). Phương pháp này có nguy cơ tiêu tốn đáng kể băng thông và thời lượng pin khi tải nội dung xuống mà không bao giờ sử dụng. Vì vậy, bạn nên thận trọng khi triển khai.
Các yếu tố cần cân nhắc khác
Mặc dù việc tìm nạp trước dữ liệu mang lại nhiều lợi ích, nhưng việc tìm nạp trước quá mức cũng làm tăng nguy cơ tiêu hao pin và sử dụng băng thông, cũng như hạn ngạch tải xuống bằng cách tải dữ liệu không được sử dụng. Bạn cũng cần đảm bảo rằng việc tìm nạp trước không làm chậm quá trình khởi động ứng dụng trong khi ứng dụng chờ quá trình tìm nạp trước hoàn tất. Trên thực tế, điều đó có thể có nghĩa là xử lý dữ liệu theo từng bước hoặc bắt đầu các lượt chuyển liên tiếp được ưu tiên sao cho dữ liệu cần thiết để khởi động ứng dụng được tải xuống và xử lý trước.
Mức độ tích cực mà bạn tìm nạp trước dữ liệu phụ thuộc vào kích thước của dữ liệu được tải xuống và khả năng dữ liệu đó được sử dụng. Theo hướng dẫn sơ bộ dựa trên máy trạng thái được mô tả trước đó, đối với dữ liệu có 50% khả năng được sử dụng trong phiên người dùng hiện tại, bạn thường có thể tìm nạp trước trong khoảng 6 giây (khoảng 1 – 2 megabyte) trước khi chi phí tiềm ẩn của việc tải dữ liệu không dùng đến khớp với mức tiết kiệm tiềm ẩn của việc không tải dữ liệu đó ngay từ đầu.
Nói chung, bạn nên tìm nạp trước dữ liệu để chỉ cần bắt đầu một lượt tải xuống khác sau mỗi 2 đến 5 phút và theo thứ tự từ 1 đến 5 megabyte.
Theo nguyên tắc này, các tệp tải xuống có kích thước lớn (chẳng hạn như tệp video) nên được tải xuống theo từng phần qua các khoảng thời gian đều đặn (từ 2 đến 5 phút), chỉ tải trước một cách hiệu quả dữ liệu video có khả năng được xem trong vài phút tiếp theo.
Một giải pháp là lên lịch tải toàn bộ nội dung xuống chỉ khi có kết nối Wi-Fi và có thể chỉ khi thiết bị đang sạc. API WorkManager hỗ trợ chính xác trường hợp sử dụng này, cho phép bạn hạn chế hoạt động trong nền cho đến khi thiết bị đáp ứng các tiêu chí do nhà phát triển chỉ định, chẳng hạn như đang sạc và kết nối với Wi-Fi.
Kiểm tra kết nối trước khi đưa ra yêu cầu
Tìm kiếm tín hiệu di động là một trong những thao tác tiêu tốn nhiều pin nhất trên thiết bị di động. Phương pháp hay nhất cho các yêu cầu do người dùng bắt đầu là trước tiên hãy kiểm tra kết nối bằng ConnectivityManager
, như minh hoạ trong phần Theo dõi trạng thái kết nối và định mức kết nối.
Nếu không có mạng, ứng dụng có thể tiết kiệm pin bằng cách không buộc đài di động tìm kiếm. Sau đó, bạn có thể lên lịch và thực hiện yêu cầu theo lô cùng với các yêu cầu khác khi kết nối được thiết lập.
Kết nối nhóm
Ngoài việc xử lý hàng loạt và tìm nạp trước, một chiến lược khác có thể giúp ích là gộp các kết nối mạng của ứng dụng.
Việc sử dụng lại các kết nối mạng hiện có thường hiệu quả hơn so với việc bắt đầu các kết nối mạng mới. Việc sử dụng lại các kết nối cũng cho phép mạng phản ứng một cách thông minh hơn với tình trạng tắc nghẽn và các vấn đề liên quan đến dữ liệu mạng.
HttpURLConnection
và hầu hết các ứng dụng HTTP, chẳng hạn như OkHttp, đều bật tính năng gộp kết nối theo mặc định và sử dụng lại cùng một kết nối cho nhiều yêu cầu.
Tổng kết và hướng đến tương lai
Trong phần này, bạn đã tìm hiểu nhiều về đài vô tuyến và một số chiến lược mà bạn có thể áp dụng rộng rãi để mang đến trải nghiệm người dùng nhanh chóng, phản hồi nhanh trong khi giảm mức tiêu hao pin.
Trong phần tiếp theo, chúng ta sẽ xem xét chi tiết 3 loại tương tác mạng riêng biệt thường gặp ở hầu hết các ứng dụng. Bạn sẽ tìm hiểu các yếu tố thúc đẩy cho từng loại này cũng như các kỹ thuật và API hiện đại để quản lý hiệu quả những hoạt động tương tác này.