13

Tôi có hoạt động với một số Handlers đang được thực hiện trong khoảng thời gian không quá 5 phút. Hoạt động này được khởi chạy từ BroadcastReceiver và có thể được khởi chạy khi màn hình tắt để người dùng lấy điện thoại và nhận đầu vào của người dùng, khi điều này xảy ra, hoạt động onPause() được gọi để chắc chắn CPU đang ở chế độ ngủ. Tôi chưa đặt hoạt động để bật màn hình vì tôi muốn tiết kiệm pin nhiều nhất có thể.Một phiên bản Handler có bị trì hoãn khi CPU không hoạt động không?

Tôi đã thử nghiệm nó với điện thoại của mình và hoạt động thực sự tốt, trong khi màn hình tắt tất cả Handlers thực thi tất cả mã họ phải chạy. Nếu tôi bật và tắt màn hình trong khi hoạt động mở thì mọi thứ hoạt động tốt.

Bây giờ, tôi đã đọc ở khắp mọi nơi rằng một số thiết bị không hoạt động như mong đợi khi màn hình tắt và CPU ngủ, hầu hết các lần với gia tốc kế. Bây giờ câu hỏi của tôi là, tôi cần phải có được một WakeLock để CPU không ngủ trong khi hoạt động của tôi được mở? Tôi thực sự muốn biết điều này bởi vì, như tôi đã nói trước đây, tôi không muốn 'lãng phí' pin bằng cách mua một chiếc đắt tiền WakeLock.

Tôi muốn có câu trả lời chi tiết về một người thực sự biết cách hoạt động của nó.

+0

Và tại sao bạn sử dụng Hoạt động để thực hiện các tác vụ nền? Một hoạt động được sử dụng để hiển thị mọi thứ và không chạy các tác vụ. Bạn đã xem xét Dịch vụ chưa? – tolgap

+0

Không không, hoạt động không thực hiện các tác vụ nền. Là một hoạt động mở ra với một Broadcast Receiver đang chờ người dùng kiểm tra điện thoại và nhìn thấy nó, nhưng tôi không muốn thêm cờ 'KEEP_SCREEN_ON', đó là lý do tại sao đôi khi hoạt động được mở với màn hình tắt (hoặc màn hình tắt trong khi hoạt động đang mở). –

Trả lời

20

Mục tiêu của bạn không thể đạt được một cách ổn định bằng cách tiếp cận của bạn. Nếu bạn sử dụng phương thức postDelayed() của Bộ xử lý và CPU chuyển sang chế độ ngủ sâu, bộ đếm ms sẽ dừng và sẽ chỉ tiếp tục nếu CPU khởi động lại.

See this for more detail.

Vì vậy, nếu bạn muốn có một số loại của một công việc định kỳ, bạn sẽ cần phải sử dụng wakelock. May mắn thay có một thực hiện dịch vụ thực hiện chính xác rằng: Wakeful IntentService

Từ doc:

Các mô hình khuyến khích cho tương đương với Android vào cron công việc và nhiệm vụ của Windows dự kiến ​​là sử dụng AlarmManager. Điều này hoạt động tốt khi kết hợp với IntentService, vì dịch vụ sẽ thực hiện công việc của nó trên một luồng nền và tắt khi không có nhiều việc phải làm. Có một vấn đề nhỏ: IntentService không làm gì để giữ cho thiết bị tỉnh táo. Nếu báo thức là một biến thể WAKEUP, điện thoại sẽ chỉ ở trạng thái tỉnh táo trong khi BroadcastReceiver xử lý báo động nằm trong phương thức onReceive() của nó. Nếu không, điện thoại có thể rơi vào giấc ngủ. WakefulIntentService cố gắng để chống lại điều này bằng cách kết hợp sự dễ dàng của IntentService với WakeLock một phần.

+0

Không tệ, nhưng nó không đáp ứng các yêu cầu của tôi, nó chỉ giữ CPU với WakeLock, giống như tôi. Câu hỏi đặt ra là, tôi thực sự cần WakeLock một phần đó để giữ cho Trình xử lý của tôi hoạt động trong khi màn hình tắt và hoạt động đang hoạt động? Trong thiết bị của tôi hoạt động mà không có WakeLock, nhưng tôi không biết nếu đó là cách tất cả các điện thoại Android hoạt động hoặc phụ thuộc vào đặc điểm kỹ thuật của thiết bị. Nếu vậy, tôi muốn biết ai đã nói điều đó, hoặc nơi xuất hiện trong tài liệu, bởi vì tôi không thể tìm thấy gì cả. Cảm ơn bạn đã trả lời của bạn, điều đó sẽ có ích cho một số thứ khác, CWAC có một số thư viện thú vị. –

+0

Như là một altenative, bạn đã thử AlarmManager.setInexactRepeating(), một báo động lặp đi lặp lại an toàn điện gửi một Intent khi báo động tắt? http://developer.android.com/reference/android/app/AlarmManager.html – for3st

+0

Một số Trình xử lý thực hiện 2/3 lần mỗi giây vì vậy tôi nghĩ rằng việc sử dụng AlarmManager là một ý tưởng tồi. Tôi có tất cả mọi thứ tốt đẹp và làm việc và không tiêu thụ nhiều pin nhưng nếu tôi có thể làm cho các ứng dụng tiêu thụ ít pin bằng cách loại bỏ WakeLock, sau đó tôi sẽ làm điều đó. Câu hỏi duy nhất và chính là nếu tôi thực sự cần sử dụng WakeLock vì trong tài liệu chính thức tôi không đọc ở bất cứ nơi nào mà tôi cần để xử lý và trong điện thoại, ứng dụng hoạt động hoàn hảo mà không có WakeLock, nhưng tôi không biết sẽ hoạt động trên các thiết bị khác vì thiết bị Android duy nhất mà tôi có thể sử dụng là của tôi: -/ –

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