2013-03-06 35 views
35

Tôi đã thực hiện một số thử nghiệm cho giải pháp thông báo đẩy tùy chỉnh cho các thiết bị Android sử dụng ổ cắm liên tục. Tôi muốn chia sẻ những phát hiện của mình và xác nhận kết quả.Quy tắc kết nối ổ cắm liên tục của Android

Simple Mô tả
Các ứng dụng chạy một dịch vụ foreground và thiết lập một kết nối với máy chủ và duy trì kết nối qua ping hung hăng (@ khoảng 10 giây). Nếu kết nối được phát hiện là đã chết, ứng dụng sẽ cố gắng kết nối lại vô thời hạn. Máy chủ gửi thông báo qua kênh song công.

Test 1:

Pinging is done using a timer at 10 second intervals. 
Server sends notification every minute. 
Applications acquires wifi and wake locks. 
Duration : 8 hours 
Battery loss : ~14% 

thử nghiệm 2:

Pinging is done using AlarmManager at 10 second intervals. 
Server sends notification every minute. 
Application acquires only a wifilock 
Duration : 8 hours 
Battery loss : ~7% 

Giả định: Một gói mạng đến tự động thức dậy CPU, do đó không cần thiết cho một khóa trỗi dậy. Sử dụng AlarmManager để ping (thay vì giờ) có nghĩa là chúng ta không cần một wakelock.

Loại bỏ wakelock đó thực sự dường như giúp pin. Đáng ngạc nhiên, việc ping mạnh mẽ vào một trong hai giải pháp không ảnh hưởng đến tuổi thọ pin nhiều như tôi mong đợi. (Chúng tôi đã có nhiều thử nghiệm khác bao gồm một trong những ứng dụng mà chỉ giữ một wifilock và không làm gì gây ra khoảng 4% đến 5% pin mất trong cùng thời gian)

Vì ứng dụng có thể gửi thành công tất cả các yêu cầu ping và nhận được tất cả các tin nhắn gửi đến, tôi tin rằng các giả định của tôi là chính xác. Nhưng tôi rất muốn nhận được một số xác nhận từ bất kỳ chuyên gia nào.

Một câu hỏi khác: Nếu ứng dụng thay vào đó, hãy nghe các kết nối đến. Tôi sẽ cần phải giữ một wakelock trong trường hợp này, đúng không? Một kết nối đến không đánh thức CPU? Chúng tôi không đi xuống con đường này, nhưng chỉ muốn xác nhận.

Ngoài ra, vui lòng không đề xuất GCM, nó đã bị loại trừ bởi chính sách của công ty.

Cảm ơn.

+0

Tại sao bạn để ping di động nếu bạn có một kết nối socket? Tại sao không chỉ để cho máy chủ gửi thông tin khi có thực sự là một cái gì đó để nói và đôi khi có thể là một nhịp tim để giữ cho nó sống. –

+1

Trong trường hợp của chúng tôi, kết nối có thể nằm giữa một vài công tắc. Và chúng tôi cần xác định các kết nối không hợp lệ càng sớm càng tốt. Vì vậy, đối với mỗi ping của khách hàng điện thoại di động máy chủ phải trả lời. Nó bảo vệ chúng ta chống lại việc ngắt kết nối im lặng. – Alex

+0

Tôi chắc chắn có một câu hỏi hay ở đâu đó nhưng tôi không thể tìm thấy nó ở dạng hiện tại của nó Bạn có thể xem xét chỉnh sửa cho câu hỏi được nhắm mục tiêu nhiều hơn nếu bạn vẫn đang tìm câu trả lời. JMHO :-) – Chilledrat

Trả lời

12

Vì đã có một số lợi ích trong câu hỏi này và không có xác nhận, tôi sẽ chỉ trả lời ngay bây giờ. Nó đã được một thời gian kể từ khi các thử nghiệm đã được thực hiện, và một giải pháp cấp sản xuất đã được tạo ra và kiểm tra nghiêm ngặt. Việc gỡ bỏ khóa đánh thức vẫn giúp pin và không tìm thấy vấn đề nào khác như thiếu các yêu cầu ping hoặc thông báo đến, vì vậy đó là xác nhận duy nhất mà tôi nhận được trên các giả định nói trên.

Những điều khác cần lưu ý:

  • Trong phương pháp OnReceive của BroadcastReceiver cho báo động ping, nếu bạn không trực tiếp gọi vào ổ cắm (đẻ trứng một chủ đề mới hoặc mục đích), bạn sẽ cần phải giữ một khóa thức cho đến khi yêu cầu ping kết thúc. Android chỉ giữ khóa thức tỉnh cho đến khi OnReceive trở lại, sau đó có thể (nhưng hiếm) mà CPU có thể ngủ trước khi ping kết thúc.

  • Sử dụng High Performance Wifi Lock nếu thông báo nhạy cảm.

  • Có một vấn đề cụ thể khác của thiết bị ảnh hưởng đến giải pháp, nó được bao phủ here.

Cập nhật

Ran vào các vấn đề sau đây với Android 5.1: Android Issue

Cập nhật 2

Cần mã xung quanh chế độ Nữu Thừa dành cho Android 6.0: Doze Mode

+0

Tôi biết đây là một câu hỏi cũ, tuy nhiên: Bạn đã có được một WakeLock trên các gói dữ liệu đến để xử lý chúng? Hay nói cách khác là Thiết bị hoạt động sau bao lâu sau khi được đánh thức từ Mạng? – JavaJens

+1

Có, trong khi bạn sẽ nhận được gói tin đến mà không cần phải giữ một wakelock, bạn vẫn nên tạo một wakelock khi bạn nhận dữ liệu đến. Nếu không, bạn có thể không xử lý xong dữ liệu trước khi thiết bị chuyển sang chế độ ngủ. Phần thời gian, nó khác nhau tùy thuộc vào thiết bị. Phải yêu thương sự phân mảnh đó. – Alex

Các vấn đề liên quan